Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -----------------------------------------------------
- if (SERVER) then
- AddCSLuaFile();
- end;
- local BaseClass = baseclass.Get("base_entity");
- ENT.PrintName = "Combine Camera";
- ENT.Category = "CCTV";
- ENT.Spawnable = true;
- ENT.AdminOnly = true;
- ENT.Model = Model("models/hunter/blocks/cube025x025x025.mdl");
- ENT.RenderGroup = RENDERGROUP_BOTH;
- function ENT:SetupDataTables()
- self:NetworkVar("String", 0, "ID");
- self:NetworkVar("Bool", 0, "Destroyed");
- self:NetworkVar("Entity", 0, "Pilot");
- self:NetworkVar("Entity", 1, "Fake");
- self:NetworkVar("Entity", 2, "Light");
- self:NetworkVar("Entity", 3, "NPC");
- self:NetworkVar("Int", 0, "HP");
- self:NetworkVar("Angle", 0, "TargetAngle");
- end;
- if (SERVER) then
- function ENT:SpawnFunction(player, trace, class)
- if (!trace.Hit) then return; end;
- local entity = ents.Create(class);
- entity:SetPos(trace.HitPos + trace.HitNormal * 1.5);
- entity:Spawn();
- return entity;
- end;
- function ENT:Initialize()
- self:SetModel(self.Model);
- self:SetSolid(SOLID_VPHYSICS);
- self:PhysicsInit(SOLID_VPHYSICS);
- self:SetName("CCTV" .. self:EntIndex());
- self:SetHP(50);
- local phys = self:GetPhysicsObject();
- if (IsValid(phys)) then
- phys:Wake();
- phys:EnableMotion(false);
- end;
- self:SetupNPC();
- self:SetRenderMode(1);
- self:SetMaterial("models/effects/vol_light001");
- end;
- function ENT:SetupNPC()
- SafeRemoveEntity(self.NPC);
- self.NPC = ents.Create("npc_combine_camera");
- self.NPC:SetKeyValue("innerradius", 800);
- self.NPC:SetKeyValue("outerradius", 800);
- if (self:GetDestroyed()) then
- self.NPC:SetKeyValue("spawnflags", "128");
- self:EmitSound("division/skills/turret_deploy.mp3");
- end;
- self.NPC:SetKeyValue("OnFoundPlayer", self:GetName() .. ",Scan");
- self.NPC:Spawn();
- if (IsValid(self:GetFake())) then
- self.NPC:ResetSequence(self.NPC:LookupSequence("idlealert"));
- self.NPC:SetCycle(1);
- self.NPC:SetPoseParameter("aim_yaw", self:GetFake():GetPoseParameter("aim_yaw"));
- self.NPC:SetPoseParameter("aim_pitch", self:GetFake():GetPoseParameter("aim_pitch"));
- self:GetFake():Remove();
- end;
- self.NPC:SetParent(self);
- self.NPC:SetLocalAngles(angle_zero);
- self.NPC:SetLocalPos(Vector(0, 0, 4));
- self.NPC:SetNotSolid(true);
- if (self:GetDestroyed()) then
- self.NPC:Fire("Enable");
- self:SetDestroyed(false);
- end;
- self:SetNPC(self.NPC);
- end;
- function ENT:AcceptInput(name, act, caller, data)
- if (name == "Scan") then
- if (IsValid(act)) then
- self:OnFoundPlayer(act);
- end;
- end;
- end;
- local yellow = Color(255, 255, 0);
- local orange = Color(255, 150, 0);
- function ENT:ShouldHate(player)
- if (player:GetNoDraw()) then
- return false;
- end;
- if (!Schema:PlayerIsCombine(player) and player:GetFaction() != FACTION_ADMIN and player:GetFaction() != FACTION_PROSELYTE) then
- local wep = player:GetActiveWeapon();
- if (IsValid(wep)) then
- local weaponClass = wep:GetClass():lower();
- if (weaponClass:find("rcs_") or weaponClass:find("bfg_") or weaponClass:find("cw_shiv")) and (!weaponClass:find("rcs_usp") or !weaponClass:find("rcs_glock")) then
- return true, "ALERT: Armed 647e identified by %s!", "danger", color_red;
- end;
- end;
- if (player:GetSharedVar("IsConcealed")) then
- return true, "ALERT: Concealed 647e identified by %s!", "danger", color_red;
- elseif (player:GetCivilStatus() == "Anti-Citizen") then
- return true, "ALERT: Anti-Citizen identified by %s!", "danger", orange;
- elseif (player:GetBOLStatus()) then
- return true, "NOTICE: BOL identified by %s.", "poi", yellow;
- end;
- end;
- return false;
- end;
- function ENT:OnFoundPlayer(player)
- local bShouldHate, threat, waypointType = self:ShouldHate(player);
- local color = (255, 255, 0, 255)
- if (!bShouldHate) then return; end;
- local id = self:GetID();
- id = (#id > 0 and id or "CCTV");
- self:GetNPC():Fire("SetAngry");
- self:GetNPC():Fire("SetIdle", "", 5);
- Schema:AddCombineDisplayLine(Format(threat, id:upper()), color);
- if (Schema.waypoints) then
- Schema.waypoints:AddWaypoint(player:GetPos() + Vector(0, 0, 20), id, waypointType, 30, nil);
- end;
- end;
- function ENT:Use(activator, caller, type, value)
- if (!IsValid(activator)) then return; end;
- if (self:GetDestroyed()) then
- local faction = activator:GetFaction();
- if (faction == FACTION_MPF or faction == FACTION_MPFSCN or faction == FACTION_OTA) then
- self:Repair();
- end;
- end;
- end;
- function ENT:Transmit(player)
- if (self:GetDestroyed()) then return false; end;
- if (IsValid(self:GetPilot())) then return false; end;
- if (IsValid(player:GetSharedVar("CCTV"))) then
- player:GetSharedVar("CCTV"):Eject(true);
- else
- player.CCTVEyeAngles = player:EyeAngles();
- end;
- self:MakeFake();
- local ang = self:GetTargetAngle();
- ang.z = 0;
- net.Start("CCTV_CameraEnter");
- net.WriteEntity(self);
- net.WriteAngle(ang);
- net.Send(player);
- self:SetPilot(player);
- player:SetSharedVar("CCTV", self);
- end;
- function ENT:Eject(bNoReset)
- local pilot = self:GetPilot();
- self:SetPilot(NULL);
- if (!bNoReset) then
- pilot:SetSharedVar("CCTV", NULL);
- pilot:SetEyeAngles(pilot.CCTVEyeAngles);
- end;
- self:SetupNPC();
- end;
- function ENT:MakeFake()
- if (!IsValid(self.NPC)) then return; end;
- self:SetTargetAngle(self.NPC:GetAttachment(self.NPC:LookupAttachment("eyes")).Ang);
- self.dynamic = ents.Create("prop_dynamic");
- self.dynamic:SetModel("models/combine_camera/combine_camera.mdl");
- self.dynamic:SetKeyValue("DefaultAnim", "idlealert");
- self.dynamic:Spawn();
- self.dynamic:ResetSequence(self.dynamic:LookupSequence("idlealert"));
- self.dynamic:SetCycle(1);
- self.dynamic:SetParent(self);
- self.dynamic:SetLocalAngles(angle_zero);
- self.dynamic:SetLocalPos(Vector(0, 0, 4));
- self.dynamic:SetNotSolid(true);
- self.dynamic:SetPoseParameter("aim_yaw", self.NPC:GetPoseParameter("aim_yaw"));
- self.dynamic:SetPoseParameter("aim_pitch", self.NPC:GetPoseParameter("aim_pitch"));
- self:SetFake(self.dynamic);
- self.light = ents.Create("env_sprite");
- self.light:SetKeyValue("model", "sprites/light_glow03.vmt");
- self.light:SetKeyValue("scale", 0.2);
- self.light:SetKeyValue("rendermode", RENDERMODE_WORLDGLOW);
- self.light:SetParent(self.dynamic);
- self.light:Spawn();
- self.light:Fire("SetParentAttachment", "light");
- self.light:Activate();
- self.light:SetColor(Color(0, 0, 255));
- self:SetLight(self.light);
- self.NPC:Remove();
- self:SetNPC(NULL);
- end;
- function ENT:MakeNPC()
- if (!IsValid(self.dynamic)) then return; end;
- self:SetupNPC();
- self.dynamic:Remove();
- self.light:Remove();
- self:SetFake(NULL);
- end;
- function ENT:Repair()
- SafeRemoveEntity(self.NPC);
- self:SetupNPC();
- self:SetHP(50);
- end;
- function ENT:OnTakeDamage(info)
- if (self:GetDestroyed()) then return; end;
- if (IsValid(self.NPC)) then
- self.NPC:TakeDamageInfo(info);
- if (info:GetDamage() >= self:GetHP()) then
- self:SetDestroyed(true);
- end;
- self:SetHP(self:GetHP() - info:GetDamage());
- elseif (IsValid(self.dynamic)) then
- if (info:GetDamage() >= self:GetHP()) then
- self:Eject();
- self:SetupNPC();
- self.NPC:TakeDamage(100, info:GetAttacker(), info:GetInflictor());
- self:SetDestroyed(true);
- end;
- self:SetHP(self:GetHP() - info:GetDamage());
- end;
- end;
- elseif (CLIENT) then
- function ENT:Initialize()
- self:SetSolid(SOLID_VPHYSICS);
- self.vis = util.GetPixelVisibleHandle();
- end;
- function ENT:Draw()
- self:DrawModel();
- end;
- local repairMat = Material("vgui/repair.png");
- function ENT:DrawTranslucent()
- if (self:GetDestroyed()) then
- local faction = Clockwork.Client:GetFaction();
- if (faction == FACTION_MPF or faction == FACTION_MPFSCN or faction == FACTION_OTA) then
- local origin = self:GetPos() - Vector(0, 0, 5);
- local vis = util.PixelVisible(origin, 10, self.vis);
- cam.Start2D();
- local dist = Clockwork.Client:EyePos():Distance(origin);
- local scale = (dist < 200) and (200 / (dist / 40)) or 40;
- local screenPos = origin:ToScreen();
- surface.SetMaterial(repairMat);
- surface.SetDrawColor(192, 57, 43, math.Clamp(255 * vis, 150, 255));
- surface.DrawTexturedRect(screenPos.x - scale / 2, screenPos.y - scale / 2, scale, scale);
- cam.End2D();
- end;
- end;
- end;
- end;
- function ENT:Think()
- if (IsValid(self:GetFake()) and IsValid(self:GetPilot())) then
- self:SetTargetAngle(self:GetPilot():EyeAngles());
- self:UpdateFacing();
- elseif (SERVER and IsValid(self:GetNPC())) then
- if ((self.nextUpdate or 0) <= CurTime()) then
- for k, v in pairs(player.GetAll()) do
- if (!v:HasInitialized()) then continue; end;
- local bShouldHate = self:ShouldHate(v);
- if (!bShouldHate) then
- self:GetNPC():AddEntityRelationship(v, D_NU, 99);
- else
- self:GetNPC():AddEntityRelationship(v, D_HT, 99);
- end;
- end;
- self.nextUpdate = CurTime() + 2;
- end;
- end;
- if (CLIENT) then
- if (Clockwork.Client == self:GetPilot()) then
- if (IsValid(self:GetFake())) then
- self:GetFake():SetNoDraw(true);
- end;
- if (IsValid(self:GetLight())) then
- self:GetLight():SetNoDraw(true);
- end;
- end;
- end;
- if (SERVER) then
- self:NextThink(CurTime());
- else
- self:SetNextClientThink(CurTime());
- end;
- return true;
- end;
- function ENT:UpdateFacing()
- if (!self:GetTargetAngle()) then return; end;
- local vecGoalLocalAngles = self:GetFake():WorldToLocalAngles(self:GetTargetAngle());
- self:GetFake():SetPoseParameter("aim_pitch", vecGoalLocalAngles.x);
- self:GetFake():SetPoseParameter("aim_yaw", vecGoalLocalAngles.y);
- if (CLIENT) then
- self:InvalidateBoneCache();
- end;
- end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement