Advertisement
Badutski

Untitled

Mar 3rd, 2015
224
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 13.55 KB | None | 0 0
  1. GM.MapEntities = {}
  2. GM.MapEntities.NPCSpawnPoints = {}
  3. GM.MapEntities.WorldProps = {}
  4.  
  5. function GM:CreateSpawnPoint(vecPosition, angAngle, strNPC, intLevel, intSpawnTime)
  6.     table.insert(GAMEMODE.MapEntities.NPCSpawnPoints, {})
  7.     local intNumSpawns = #GAMEMODE.MapEntities.NPCSpawnPoints
  8.     GAMEMODE:UpdateSpawnPoint(intNumSpawns, vecPosition, angAngle, strNPC, intLevel, intSpawnTime)
  9. end
  10.  
  11. function GM:RemoveSpawnPoint(intKey)
  12.     local tblSpawnPoint = GAMEMODE.MapEntities.NPCSpawnPoints[intKey]
  13.     if tblSpawnPoint then
  14.         if tblSpawnPoint.Monster then tblSpawnPoint.Monster:Remove() end
  15.         table.remove(GAMEMODE.MapEntities.NPCSpawnPoints, intKey)
  16.     end
  17.     if SERVER && game.SinglePlayer() && player.GetByID(1) && player.GetByID(1):IsValid() then
  18.         SendUsrMsg("UD_RemoveSpawnPoint", player.GetByID(1), {intKey})
  19.     end
  20. end
  21.  
  22. function GM:UpdateSpawnPoint(intKey, vecPosition, angAngle, strNPC, intLevel, intSpawnTime)
  23.     local tblNPCTable = NPCTable(strNPC)
  24.     local tblToUpdateSpawn = GAMEMODE.MapEntities.NPCSpawnPoints[intKey]
  25.     if tblToUpdateSpawn then
  26.         tblToUpdateSpawn.Postion = vecPosition or tblToUpdateSpawn.Postion
  27.         tblToUpdateSpawn.Angle = angAngle or tblToUpdateSpawn.Angle or Angle(0, 0, 0)
  28.         tblToUpdateSpawn.NPC = strNPC or tblToUpdateSpawn.NPC or "zombie"
  29.         tblToUpdateSpawn.Level = intLevel or tblToUpdateSpawn.Level or 5
  30.         tblToUpdateSpawn.SpawnTime = intSpawnTime or tblToUpdateSpawn.SpawnTime or 0
  31.         if IsValid(tblToUpdateSpawn.Monster) then
  32.             tblToUpdateSpawn.Monster:SetAngles(tblToUpdateSpawn.Angle)
  33.         end
  34.         if SERVER && game.SinglePlayer() && IsValid(player.GetByID(1)) then
  35.             SendUsrMsg("UD_UpdateSpawnPoint", player.GetByID(1), {intKey, tblToUpdateSpawn.Postion, tblToUpdateSpawn.Angle, tblToUpdateSpawn.NPC, tblToUpdateSpawn.Level, tblToUpdateSpawn.SpawnTime})
  36.         end
  37.     else
  38.         GAMEMODE:CreateSpawnPoint(vecPosition, angAngle, strNPC, intLevel, intSpawnTime)
  39.     end
  40. end
  41.  
  42. function GM:CreateWorldProp(strModel, vecPostion, angAngle, entEntity, boolLoad)
  43.     if SERVER then
  44.         local tblNewObject = {}
  45.         tblNewObject.SpawnProp = function()
  46.             local entNewProp = ents.Create(GetPropClass(strModel))
  47.             tblNewObject.Entity = entNewProp
  48.             table.insert(self.MapEntities.WorldProps, tblNewObject)
  49.             self:UpdateWorldProp(#self.MapEntities.WorldProps, strModel, vecPostion, angAngle, entNewProp)
  50.             entNewProp:SetSkin(math.random(0, entNewProp:SkinCount()))
  51.             entNewProp:Spawn()
  52.         end
  53.         tblNewObject.SpawnProp()
  54.         return tblNewObject.Entity
  55.     elseif CLIENT then
  56.         table.insert(self.MapEntities.WorldProps, {Entity = entEntity})
  57.         self:UpdateWorldProp(#self.MapEntities.WorldProps, strModel, vecPostion, angAngle, entEntity)
  58.     end
  59. end
  60.  
  61. function GM:RemoveWorldProp(intKey)
  62.     local tblWorldProp = GAMEMODE.MapEntities.WorldProps[intKey]
  63.     if tblWorldProp then
  64.         if tblWorldProp.Entity && tblWorldProp.Entity:IsValid() then tblWorldProp.Entity:Remove() end
  65.         table.remove(GAMEMODE.MapEntities.WorldProps, intKey)
  66.     end
  67.     if SERVER && game.SinglePlayer() && player.GetByID(1) && player.GetByID(1):IsValid() then
  68.         SendUsrMsg("UD_RemoveWorldProp", player.GetByID(1), {intKey})
  69.     end
  70. end
  71.  
  72. function GM:UpdateWorldProp(intKey, strModel, vecPosition, angAngle, entEntity, boolLoad)
  73.     local tblToUpdateProp = GAMEMODE.MapEntities.WorldProps[intKey]
  74.     if tblToUpdateProp && IsValid(tblToUpdateProp.Entity) then
  75.         local entProp = tblToUpdateProp.Entity
  76.         if SERVER then
  77.             local strPreModel = entProp:GetModel()
  78.             entProp:SetModel(strModel or entProp:GetModel() or "models/props_junk/garbage_metalcan001a.mdl")
  79.             entProp:SetPos(vecPosition or entProp:GetPos())
  80.             if strPreModel != entProp:GetModel() && !boolLoad then
  81.                 entProp:SetPos(GetFlushToGround(entProp))
  82.             end
  83.             entProp:SetAngles(angAngle or entProp:GetAngles())
  84.             entProp:PhysicsInit(SOLID_VPHYSICS)
  85.             entProp:SetMoveType(MOVETYPE_NONE)
  86.             entProp:DrawShadow(false)
  87.             entProp:SetKeyValue("spawnflags", 8)
  88.             entProp.ObjectKey = intKey
  89.             if game.SinglePlayer() && player.GetByID(1) && player.GetByID(1):IsValid() then
  90.                 SendUsrMsg("UD_UpdateWorldProp", player.GetByID(1), {intKey, entProp:GetModel(), entProp:GetPos(), entProp:GetAngles(), entProp})
  91.             end
  92.         end
  93.         tblToUpdateProp.Model = entProp:GetModel()
  94.         tblToUpdateProp.Postion = entProp:GetPos()
  95.         tblToUpdateProp.Angle = entProp:GetAngles()
  96.     else
  97.         GAMEMODE:CreateWorldProp(strModel, vecPosition, angAngle, entEntity)
  98.     end
  99. end
  100.  
  101. if SERVER then
  102.     function GM:InitPostEntity()
  103.         for _, pp in pairs ( ents.FindByClass( "prop_physics" ) ) do
  104.             pp:Remove()
  105.         end
  106.         if luamap then
  107.             if luamap[ game.GetMap() ] then
  108.                 print( 'LUA Map Loaded.' )
  109.                 pac.SpawnMapOutfit( luamap[ game.GetMap() ] )
  110.             else
  111.                 print( 'No LUA Map assigned.' )
  112.             end
  113.         else
  114.             print( 'NO LUAMAP!' )
  115.         end
  116.     end
  117.  
  118.     function GM:LoadMapObjects()
  119.         local strFileName = "underdone/maps/" .. game.GetMap() .. ".txt"
  120.         if !file.Exists(strFileName, "data") then return end
  121.         local tblDecodedTable = glon.decode(file.Read(strFileName))
  122.         for _, SpawnPoint in pairs(tblDecodedTable.NPCSpawnPoints or {}) do
  123.             GAMEMODE:CreateSpawnPoint(SpawnPoint.Postion, SpawnPoint.Angle or Angle(0, 90, 0), SpawnPoint.NPC, SpawnPoint.Level, SpawnPoint.SpawnTime)
  124.         end
  125.         for k, WorldProp in pairs(tblDecodedTable.WorldProps or {}) do
  126.             timer.Simple(0.05 * k, function() GAMEMODE:CreateWorldProp(WorldProp.Model, WorldProp.Postion, WorldProp.Angle, nil, true) end)
  127.         end
  128.     end
  129.     hook.Add("Initialize", "LoadMapObjects", function() GAMEMODE:LoadMapObjects() end)
  130.    
  131.     function GM:SaveMapObjects()
  132.         local strFileName = "underdone/maps/" .. game.GetMap() .. ".txt"
  133.         local tblSaveTable = table.Copy(GAMEMODE.MapEntities)
  134.         for _, SpawnPoint in pairs(tblSaveTable.NPCSpawnPoints or {}) do
  135.             SpawnPoint.Monster = nil
  136.             SpawnPoint.NextSpawn = nil
  137.         end
  138.         for _, WorldProp in pairs(tblSaveTable.WorldProps or {}) do
  139.             WorldProp.Entity = nil
  140.             WorldProp.SpawnProp = nil
  141.         end
  142.         file.Write(strFileName, glon.encode(tblSaveTable))
  143.     end
  144.    
  145.     function GM:SpawnMapEntities() 
  146.         for _, Spawn in pairs(GAMEMODE.MapEntities.NPCSpawnPoints) do
  147.                 if !Spawn.Monster or !Spawn.Monster:IsValid() && #ents.FindByClass("npc_*") < 500 && !GAMEMODE.EventHasStarted then
  148.                     if !Spawn.NextSpawn then Spawn.NextSpawn = CurTime() + Spawn.SpawnTime end 
  149.                     if Spawn.SpawnTime > 0 && CurTime() >= Spawn.NextSpawn then
  150.                             Spawn.Monster = GAMEMODE:CreateNPC(Spawn.NPC, Spawn)
  151.                             Spawn.NextSpawn = nil
  152.                     end
  153.                 end
  154.         end
  155.     end
  156.     hook.Add("Tick", "SpawnMapEntities", function() GAMEMODE:SpawnMapEntities() end)
  157.  
  158.     function GM:CreateNPC(strNPC, tblSpawnPoint)   
  159.         local tblNPCTable = NPCTable(strNPC)
  160.         if !tblNPCTable then return end
  161.         if tblNPCTable.SpawnName == "npc_turret_floor" then return end
  162.         local entNewMonster = ents.Create(tblNPCTable.SpawnName)
  163.         entNewMonster:SetPos(tblSpawnPoint.Postion)
  164.         entNewMonster:SetAngles(tblSpawnPoint.Angle or Angle(0, 90, 0))
  165.         entNewMonster:SetKeyValue("spawnflags","512")
  166.         entNewMonster:DrawShadow(false)
  167.         if tblNPCTable.Weapon then
  168.             entNewMonster:Give(tblNPCTable.Weapon )
  169.             entNewMonster:SetKeyValue( "additionalequipment", tblNPCTable.Weapon)
  170.             entNewMonster:SetKeyValue("spawnflags","8192")
  171.         end
  172.         if tblNPCTable.Accuracy then
  173.             entNewMonster:SetCurrentWeaponProficiency( tblNPCTable.Accuracy )
  174.         end
  175.         if tblNPCTable.Model then
  176.             entNewMonster:SetModel(tblNPCTable.Model)
  177.         end
  178.         if tblNPCTable.Color then
  179.             local r = tblNPCTable.Color[1]
  180.             local g = tblNPCTable.Color[2]
  181.             local b = tblNPCTable.Color[3]
  182.             local a = tblNPCTable.Color[4]
  183.             entNewMonster:SetColor( Color(r,g,b,a) )
  184.         end
  185.         if tblNPCTable.Outfit then
  186.             print( "111" )
  187.             entNewMonster:SetNWString( "m_outfit", tblNPCTable.Outfit )
  188.         end
  189.         entNewMonster:Spawn()
  190.         if tblNPCTable.DeathDistance then
  191.             for _, ent in pairs(ents.FindInSphere( tblSpawnPoint.Postion, tblNPCTable.DeathDistance )) do
  192.                 if IsValid(ent) && ent:IsPlayer() then
  193.                     ent:SetPos(ent:GetPos() + ent:GetUp() * 300)
  194.                     //ent:Kill()
  195.                 end
  196.             end
  197.         end
  198.         if tblNPCTable.Frozen then
  199.             entNewMonster:DropToFloor()
  200.             local phys = entNewMonster:GetPhysicsObject()
  201.             if IsValid( phys ) then
  202.                 phys:EnableMotion( false )
  203.             end
  204.         end
  205.        
  206.         if  tblNPCTable.Resistance then
  207.             entNewMonster.Resistance = tblNPCTable.Resistance
  208.         end
  209.        
  210.         entNewMonster.Name = tblNPCTable.Name
  211.         entNewMonster.Position = tblSpawnPoint.Postion
  212.         entNewMonster.Race = tblNPCTable.Race
  213.         entNewMonster.Invincible = tblNPCTable.Invincible
  214.         entNewMonster.Shop = tblNPCTable.Shop
  215.         entNewMonster.Bank = tblNPCTable.Bank
  216.         entNewMonster.Quest = tblNPCTable.Quest
  217.         entNewMonster.Auction = tblNPCTable.Auction
  218.         entNewMonster.Appearance = tblNPCTable.Appearance
  219.        
  220.         local intTotalFlags = 1 + 8192 
  221.         if tblNPCTable.Idle and !tblNPCTable.NextBot then
  222.             entNewMonster:SetNPCState(NPC_STATE_IDLE)
  223.             intTotalFlags = intTotalFlags + 16 + 128
  224.         end
  225.         entNewMonster:SetKeyValue("spawnflags", intTotalFlags)
  226.         entNewMonster:SetNWString("npc", tblNPCTable.Name)
  227.         local intLevel = math.Clamp(tblSpawnPoint.Level + math.random(-2, 2), 1, tblSpawnPoint.Level + 2)
  228.         entNewMonster:SetNWInt("level", intLevel)
  229.         local intHealth = intLevel * (tblNPCTable.HealthPerLevel or 10)
  230.         entNewMonster:SetMaxHealth(intHealth)
  231.         entNewMonster:SetNWInt("MaxHealth", intHealth)
  232.         entNewMonster:SetHealth(intHealth)
  233.         entNewMonster:SetNWInt("Health", intHealth)
  234.         for _, ent in pairs(ents.GetAll()) do
  235.             if ent && ent:IsValid() && (ent:IsNPC() or ent:IsPlayer()) && ent.Race && tblNPCTable.Race then
  236.                 if ent.Race == tblNPCTable.Race then
  237.                     entNewMonster:AddEntityRelationship(ent, GAMEMODE.RelationLike, 99)
  238.                     if ent:IsNPC() then
  239.                         ent:AddEntityRelationship(entNewMonster, GAMEMODE.RelationLike, 99)
  240.                     end
  241.                 else
  242.                     if !ent.Invincible then
  243.                         entNewMonster:AddEntityRelationship(ent, GAMEMODE.RelationHate, 99)
  244.                     end
  245.                     if !entNewMonster.Invincible && ent:IsNPC() then
  246.                         ent:AddEntityRelationship(entNewMonster, GAMEMODE.RelationHate, 99)  
  247.                     end
  248.                     if ent:IsPlayer() && !GAMEMODE.EventHasStarted then
  249.                         if intLevel < ent:GetLevel() then
  250.                             entNewMonster:AddEntityRelationship(ent, GAMEMODE.RelationNeutral, 99)
  251.                         end
  252.                     end
  253.                 end
  254.             end
  255.         end
  256.         entNewMonster:Activate()
  257.         if tblNPCTable.SpecialMove then
  258.             if tblNPCTable.SetupMoveTable then
  259.                 tblNPCTable.SetupMoveTable( entNewMonster )
  260.             end
  261.             SpecialMoveNPC[ entNewMonster:EntIndex() ] = entNewMonster
  262.         end
  263.         return entNewMonster
  264.        
  265.     end
  266.    
  267.     if game.SinglePlayer() then
  268.         function OnPlayerSpawnMapEditor(ply)
  269.             for key, spawnPoint in pairs(GAMEMODE.MapEntities.NPCSpawnPoints) do
  270.                 GAMEMODE:UpdateSpawnPoint(key)
  271.             end
  272.             for key, worldprop in pairs(GAMEMODE.MapEntities.WorldProps) do
  273.                 timer.Simple(1 * key, function()
  274.                     GAMEMODE:UpdateWorldProp(key)
  275.                 end)
  276.             end
  277.         end
  278.         hook.Add("PlayerSpawn", "OnPlayerSpawnMapEditor", OnPlayerSpawnMapEditor)
  279.        
  280.         concommand.Add("UD_Dev_EditMap_CreateSpawnPoint", function(ply, command, args)
  281.             if !ply:IsAdmin() or !ply:IsPlayer() then return end
  282.             GAMEMODE:CreateSpawnPoint(ply:GetEyeTraceNoCursor().HitPos + Vector(0, 0, 10))
  283.         end)
  284.        
  285.         concommand.Add("UD_Dev_EditMap_RemoveSpawnPoint", function(ply, command, args)
  286.             if !ply:IsAdmin() or !ply:IsPlayer() then return end
  287.             GAMEMODE:RemoveSpawnPoint(tonumber(args[1]))
  288.         end)
  289.        
  290.         concommand.Add("UD_Dev_EditMap_UpdateSpawnPoint", function(ply, command, args)
  291.             if !ply:IsAdmin() or !ply:IsPlayer() then return end
  292.             if args[1] && GAMEMODE.MapEntities.NPCSpawnPoints[tonumber(args[1])] then
  293.                 GAMEMODE:UpdateSpawnPoint(tonumber(args[1]), nil, Angle(0, tonumber(args[5]), 0), args[2], tonumber(args[3]), tonumber(args[4]))
  294.             end
  295.         end)
  296.        
  297.         concommand.Add("UD_Dev_EditMap_CreateWorldProp", function(ply, command, args)
  298.             if !ply:IsAdmin() or !ply:IsPlayer() then return end
  299.             local trcEyeTrace = ply:GetEyeTraceNoCursor()
  300.             local entNewEnt = GAMEMODE:CreateWorldProp(nil, trcEyeTrace.HitPos)
  301.         end)
  302.        
  303.         concommand.Add("UD_Dev_EditMap_RemoveWorldProp", function(ply, command, args)
  304.             if !ply:IsAdmin() or !ply:IsPlayer() then return end
  305.             GAMEMODE:RemoveWorldProp(tonumber(args[1]))
  306.         end)
  307.        
  308.         concommand.Add("UD_Dev_EditMap_UpdateWorldProp", function(ply, command, args)
  309.             if !ply:IsAdmin() or !ply:IsPlayer() then return end
  310.             local tblPropTable = GAMEMODE.MapEntities.WorldProps[tonumber(args[1])]
  311.             if args[1] && tblPropTable then
  312.                 local vecNewPostion = tblPropTable.Postion + VectortizeString(args[3])
  313.                 local vecNewAngle = tblPropTable.Angle + Angle(0, tonumber(args[4]), 0)
  314.                 GAMEMODE:UpdateWorldProp(tonumber(args[1]), args[2], vecNewPostion, vecNewAngle)
  315.             end
  316.         end)
  317.        
  318.         concommand.Add("UD_Dev_EditMap_SaveMap", function(ply, command, args)
  319.             if !ply:IsAdmin() or !ply:IsPlayer() then return end
  320.             GAMEMODE:SaveMapObjects()
  321.         end)
  322.     end
  323. end
  324.  
  325. if CLIENT then
  326.     if game.SinglePlayer() then
  327.         usermessage.Hook("UD_UpdateSpawnPoint", function(usrMsg)
  328.             GAMEMODE:UpdateSpawnPoint(usrMsg:ReadLong(), usrMsg:ReadVector(), usrMsg:ReadAngle(), usrMsg:ReadString(), usrMsg:ReadLong(), usrMsg:ReadLong())
  329.             GAMEMODE.MapEditor.UpatePanel()
  330.         end)
  331.        
  332.         usermessage.Hook("UD_RemoveSpawnPoint", function(usrMsg)
  333.             GAMEMODE:RemoveSpawnPoint(usrMsg:ReadLong())
  334.             GAMEMODE.MapEditor.UpatePanel()
  335.         end)
  336.        
  337.         usermessage.Hook("UD_UpdateWorldProp", function(usrMsg)
  338.        
  339.             GAMEMODE:UpdateWorldProp(usrMsg:ReadLong(), usrMsg:ReadString(), usrMsg:ReadVector(), usrMsg:ReadAngle(), usrMsg:ReadEntity())
  340.             GAMEMODE.MapEditor.UpatePanel()
  341.         end)
  342.        
  343.         usermessage.Hook("UD_RemoveWorldProp", function(usrMsg)
  344.        
  345.             GAMEMODE:RemoveWorldProp(usrMsg:ReadLong())
  346.             GAMEMODE.MapEditor.UpatePanel()
  347.         end)
  348.     end
  349. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement