Preliminary NPCs

This commit is contained in:
Fesiug 2023-12-30 01:16:00 -05:00
parent bbfe086c0b
commit c68bdc24c7
3 changed files with 248 additions and 18 deletions

View File

@ -2,40 +2,259 @@ AddCSLuaFile()
ENT.Base = "base_nextbot" ENT.Base = "base_nextbot"
ENT.Spawnable = true ENT.Spawnable = true
ENT.BennyNPC = true
function ENT:Nick()
return "GEN#" .. self:EntIndex()
end
if CLIENT then if CLIENT then
DebugNextbot = {}
net.Receive( "Benny_DebugNextbot", function()
local ent = net.ReadEntity()
if !DebugNextbot[ent] then
DebugNextbot[ent] = {}
end
local t = DebugNextbot[ent]
t.State = net.ReadString()
t.Team = net.ReadString()
t.Faction = net.ReadString()
t.Seeing = {}
for i=1, net.ReadUInt(8) do
t.Seeing[net.ReadEntity()] = true
end
t.Memory = {}
for i=1, net.ReadUInt(8) do
local memt = {}
t.Memory[net.ReadEntity()] = memt
for i=1, net.ReadUInt(8) do
memt[net.ReadString()] = net.ReadType()
end
end
end)
local s = ScreenScaleH
local function DST( text, font, x, y, color )
for O=1, 2 do
draw.SimpleText( text, font, x-O, y-O, color_black )
draw.SimpleText( text, font, x, y-O, color_black )
draw.SimpleText( text, font, x+O, y-O, color_black )
draw.SimpleText( text, font, x-O, y, color_black )
--draw.SimpleText( text, font, x, y, color_black )
draw.SimpleText( text, font, x+O, y, color_black )
draw.SimpleText( text, font, x-O, y+O, color_black )
draw.SimpleText( text, font, x, y+O, color_black )
draw.SimpleText( text, font, x+O, y+O, color_black )
end
draw.SimpleText( text, font, x, y, color )
end
surface.CreateFont("DNB_14", {
font = "Bahnschrift",
size = s(14),
})
surface.CreateFont("DNB_10", {
font = "Bahnschrift",
size = s(10),
})
surface.CreateFont("DNB_8", {
font = "Bahnschrift",
size = s(8),
})
surface.CreateFont("DNB_6", {
font = "Bahnschrift",
size = s(6),
})
local boost = Vector( 0, 0, 48 )
hook.Add( "HUDPaint", "Benny_SpecialDebugNextbotView", function()
for ent, data in pairs( DebugNextbot ) do
if !IsValid( ent ) then
DebugNextbot[ent] = nil
continue
end
local ts = ent:GetPos()
ts:Add(boost)
local ts = ts:ToScreen()
local Ox, Oy = math.floor(ts.x-s(16)), math.floor(ts.y)
do
local x, y = Ox, Oy
DST( ent:Nick(), "DNB_14", x, y, color_white )
y = y + s(12)
DST( data.State, "DNB_10", x, y, color_white )
y = y + s(12)
DST( data.Team, "DNB_6", x, y, color_white )
y = y + s(4)
DST( data.Faction, "DNB_6", x, y, color_white )
y = y + s(6)
end
do
local x, y = Ox, Oy + s(36)
DST( "Memory:", "DNB_8", x, y, color_white )
y = y + s(8)
for i, v in pairs( data.Memory ) do
if !IsValid( i ) then
data.Memory[i] = nil
continue
end
local line_y = y
DST( "- " .. i:Nick(), "DNB_6", x+s(4), line_y, color_white )
line_y = line_y + s(6)
for key, value in pairs( v ) do
local nicevalue
if key == "LastSeenTime" then
nicevalue = string.NiceTime( CurTime() - value ) .. " ago"
elseif isvector( value ) then
nicevalue = "Vector(" .. math.Round(value.x) .. ", " .. math.Round(value.y) .. ", " .. math.Round(value.z) .. ")"
else
nicevalue = value
end
DST( key, "DNB_6", x+s(4*2), line_y, color_white )
line_y = line_y + s(4)
DST( nicevalue, "DNB_6", x+s(4*3), line_y, color_white )
line_y = line_y + s(6)
end
x = x + s(54)
end
end
do
local x, y = Ox, Oy + s(36*2)
DST( "Seeing:", "DNB_8", x, y, color_white )
y = y + s(8)
for i, v in pairs( data.Seeing ) do
if !IsValid( i ) then
data.Seeing[i] = nil
continue
end
DST( "- " .. i:Nick(), "DNB_6", x+s(8), y, color_white )
y = y + s(6)
end
end
end
end)
return
else
util.AddNetworkString("Benny_DebugNextbot")
end
function ENT:SetState( state )
self.State = state
end
function ENT:GetState()
return self.State
end
function ENT:RunCurrentState( func, ... )
self.States[self:GetState()][func]( self, ... )
end
ENT.States = {
["idle"] = {
RunBehavior = function( self )
--self:StartActivity( ACT_HL2MP_WALK_PASSIVE )
--self:MoveToPos( self:GetPos() + Vector( math.Rand( -1, 1 ), math.Rand( -1, 1 ), 0 ) * 100 )
self:StartActivity( ACT_HL2MP_IDLE_RPG or ACT_HL2MP_IDLE_PASSIVE )
coroutine.wait(5)
coroutine.yield()
end,
},
["combat"] = {
RunBehavior = function( self )
end,
},
}
function ENT:BodyUpdate()
self:BodyMoveXY()
return return
end end
function ENT:OnEntitySight( ent )
-- ent:EmitSound( "benny/dev/d-01.ogg", 70, 100, 0.25 )
if !self.bEnemyMemory[ent] then
self.bEnemyMemory[ent] = {}
end
self.bSeeing[ent] = true
end
function ENT:OnEntitySightLost( ent )
-- ent:EmitSound( "benny/dev/d-02.ogg", 70, 100, 0.25 )
self.bSeeing[ent] = nil
end
function ENT:Initialize() function ENT:Initialize()
self:SetModel( "models/barney.mdl" ) self:SetModel( "models/player/infoplayerrealism.mdl" )
self.loco:SetDesiredSpeed( 100 ) -- Walk speed self.loco:SetDesiredSpeed( 100 ) -- Walk speed
self.loco:SetStepHeight( 22 ) self.loco:SetStepHeight( 22 )
self:SetShouldServerRagdoll( false )
self:SetFOV( 45 )
self:SetState("idle")
self.Team = "test_duo_1"
self.Faction = "test"
self.bEnemyMemory = {}
self.bSeeing = {}
end end
function ENT:RunBehaviour() function ENT:RunBehaviour()
while ( true ) do while ( true ) do
-- find the furthest away hiding spot self:RunCurrentState( "RunBehavior", self )
local pos = self:FindSpot( "random", { type = 'hiding', radius = 1000 } )
if pos then
self:StartActivity( ACT_WALK )
self:MoveToPos( pos )
end
self:StartActivity( ACT_IDLE )
coroutine.wait(1)
coroutine.yield()
end end
end end
function ENT:OnContact( ent ) function ENT:OnContact( ent )
if ent != game.GetWorld() then
print( ent )
end end
end
function ENT:Think() function ENT:Think()
for ent, _ in pairs( self.bSeeing ) do
if !IsValid(ent) or !_ then
self.bSeeing[ent] = nil
continue
end
if !self.bEnemyMemory[ent] then
self.bEnemyMemory[ent] = {}
end
self.bEnemyMemory[ent].LastPos = ent:GetPos()
self.bEnemyMemory[ent].LastSeenTime = CurTime()
end
net.Start("Benny_DebugNextbot")
net.WriteEntity(self)
net.WriteString( self.State )
net.WriteString( self.Team )
net.WriteString( self.Faction )
net.WriteUInt( table.Count( self.bSeeing ), 8 )
for ent, _ in pairs( self.bSeeing ) do
net.WriteEntity( ent )
end
net.WriteUInt( table.Count( self.bEnemyMemory ), 8 )
for ent, data in pairs( self.bEnemyMemory ) do
net.WriteEntity( ent )
net.WriteUInt( table.Count(data), 8 )
for key, value in pairs( data ) do
net.WriteString( key )
net.WriteType( value )
end
end
net.SendPVS(self:GetPos())
end end

View File

@ -686,7 +686,7 @@ hook.Add( "HUDPaint", "Benny_HUDPaint", function()
fx, fy = math.Round( fx ), math.Round( fy ) fx, fy = math.Round( fx ), math.Round( fy )
surface.DrawTexturedRectRotated( fx, fy, s(16), s(16), i+(lmg and 0 or 90) ) surface.DrawTexturedRectRotated( fx, fy, s(16), s(16), i+(lmg and 0 or 90) )
end end
elseif typ == "pistol" then -- pistol elseif typ == "pistol" or typ == "special" then -- pistol
surface.SetMaterial( mat2 ) surface.SetMaterial( mat2 )
surface.DrawTexturedRectRotated( poosx - gap - s(spacer), poosy, s(24), s(24), 0 ) surface.DrawTexturedRectRotated( poosx - gap - s(spacer), poosy, s(24), s(24), 0 )
surface.DrawTexturedRectRotated( poosx + gap + s(spacer), poosy, s(24), s(24), 0 ) surface.DrawTexturedRectRotated( poosx + gap + s(spacer), poosy, s(24), s(24), 0 )

View File

@ -196,9 +196,20 @@ do -- Toolgun
if SERVER then if SERVER then
local summon = ents.Create( "benny_npc_human" ) local summon = ents.Create( "benny_npc_human" )
summon:SetPos( tr.HitPos + tr.HitNormal ) summon:SetPos( tr.HitPos + tr.HitNormal )
local ang = Angle( 0, p:EyeAngles().y+180, 0 )
summon:SetAngles( ang )
summon:Spawn() summon:Spawn()
end end
end, end,
["remover"] = function( self, p, tr )
if SERVER then
local ent = tr.Entity
if IsValid( ent ) then
ent:Remove()
return
end
end
end,
} }
local function CreateSelect() local function CreateSelect()
local Frame = vgui.Create( "DFrame" ) local Frame = vgui.Create( "DFrame" )