Advertisement
Guest User

Untitled

a guest
Mar 2nd, 2013
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.28 KB | None | 0 0
  1. AddCSLuaFile( "cl_init.lua" )
  2. AddCSLuaFile( "shared.lua" )
  3. include('shared.lua')
  4.  
  5. //ENT.Model = "models/arachnid.mdl"
  6. ENT.health = 200
  7. ENT.Alerted = false
  8. ENT.Territorial = false
  9. ENT.Bleeds = true
  10. ENT.Leaps = false
  11. ENT.Chasing = false
  12. ENT.Flinches = true
  13. ENT.FriendlyToPlayer = false
  14. ENT.Damage = 3
  15. ENT.AcidBlood = false
  16. ENT.BleedsRed = true
  17. ENT.LeapSpeed = 1000
  18. ENT.LeapDistance = 300
  19. ENT.MinLeapDistance = 200
  20. ENT.MeleeAttacking = false;
  21. ENT.Leaping = false
  22. ENT.alert1 = Sound("runner/angry1.wav")
  23. ENT.alert2 = Sound("runner/angry2.wav")
  24. ENT.alert3 = Sound("runner/alert1.wav")
  25. ENT.idle1 = Sound("runner/stalk.wav")
  26. ENT.idle2 = Sound("runner/stalk2.wav")
  27. ENT.idle3 = Sound("runner/stalk3.wav")
  28. ENT.idle4 = Sound("runner/angry2.wav")
  29. ENT.angryidle1 = Sound("runner/angry3.wav")
  30. ENT.angryidle2 = Sound("runner/angry1.wav")
  31. ENT.angryidle3 = Sound("runner/stalk3.wav")
  32. ENT.angryidle4 = Sound("runner/angry2.wav")
  33. ENT.attack1 = Sound("runner/attack.wav")
  34. ENT.attack2 = Sound("runner/attack2.wav")
  35. ENT.attack3 = Sound("runner/attack3.wav")
  36. ENT.attack4 = Sound("zombie/claw_miss1.wav")
  37. ENT.attack5 = Sound("zombie/claw_hit2.wav")
  38. ENT.attack6 = Sound("zombie/claw_hit1.wav")
  39. ENT.attackmiss1 = Sound("zombie/claw_miss1.wav")
  40. ENT.attackmiss2 = Sound("zombie/claw_miss2.wav")
  41. ENT.attackmiss3 = Sound("zombie/claw_miss3.wav")
  42. ENT.attackmiss4 = Sound("zombie/claw_miss4.wav")
  43. ENT.attackleap = Sound("")
  44. ENT.hurt1 = Sound("runner/attack.wav")
  45. ENT.hurt2 = Sound("runner/angry3.wav")
  46. ENT.hurt3 = Sound("runner/attack2.wav")
  47. ENT.die1 = Sound("runner/attack.wav")
  48. ENT.die2 = Sound("runner/death1.wav")
  49. ENT.die3 = Sound("runner/death2.wav")
  50. ENT.dead = false
  51.  
  52. local schedJump = ai_schedule.New( "Jump" )
  53. schedJump:EngTask( "TASK_PLAY_SEQUENCE", ACT_JUMP )
  54.  
  55. function ENT:Initialize()
  56. local modelchoice = math.random(1,9)
  57. if modelchoice == 1 then
  58. self.Model = "models/zombie/zm_runner_02_dan.mdl"
  59. elseif modelchoice == 2 then
  60. self.Model = "models/zombie/zm_runner_02_dan.mdl"
  61. elseif modelchoice == 3 then
  62. self.Model = "models/zombie/zm_runner_03_dan.mdl"
  63. elseif modelchoice == 4 then
  64. self.Model = "models/zombie/zm_runner_04_dan.mdl"
  65. elseif modelchoice == 5 then
  66. self.Model = "models/zombie/zm_runner_05_dan.mdl"
  67. elseif modelchoice == 6 then
  68. self.Model = "models/zombie/zm_runner_06_dan.mdl"
  69. elseif modelchoice == 7 then
  70. self.Model = "models/zombie/zm_runner_07_dan.mdl"
  71. elseif modelchoice == 8 then
  72. self.Model = "models/zombie/zm_runner_08_dan.mdl"
  73. elseif modelchoice == 9 then
  74. self.Model = "models/zombie/zm_runner_09_dan.mdl"
  75. end
  76. self:SetModel( self.Model )
  77. self:SetHullType( HULL_MEDIUM )
  78. self:SetHullSizeNormal()
  79. self:SetSolid( SOLID_BBOX )
  80. self:SetMoveType( MOVETYPE_STEP )
  81. self:CapabilitiesAdd( CAP_MOVE_GROUND ) (CAP_SQUAD) (CAP_OPEN_DOORS )
  82. self:SetMaxYawSpeed( 5000 )
  83. self:SetHealth(self.health)
  84. end
  85.  
  86. function ENT:Think()
  87. //---------------
  88. local function setmeleefalse()
  89. if self:Health() < 0 then return end
  90. self.MeleeAttacking = false
  91. self.Leaping = false
  92. self:SetSchedule(SCHED_CHASE_ENEMY)
  93. end
  94. //---------------
  95. local function Attack_Melee()
  96. if self:Health() < 0 then return end
  97. local entstoattack = ents.FindInSphere(self:GetPos() + self:GetForward()*75,47)
  98. local hit = false
  99. if entstoattack != nil then
  100. for _,v in pairs(entstoattack) do
  101. if ( (v:Isself() || ( v:IsPlayer() && v:Alive())) && (v != self) && (v:GetClass() != self:GetClass()) || (v:GetClass() == "prop_physics")) then
  102. v:TakeDamage( self.Damage, self )
  103. if v:IsPlayer() then
  104. v:ViewPunch(Angle(math.random(-1,1)*self.Damage,math.random(-1,1)*self.Damage,math.random(-1,1)*self.Damage))
  105. end
  106. if v:GetClass() == "prop_physics" then
  107. local phys = v:GetPhysicsObject()
  108. if phys != nil && phys != NULL then
  109. phys:ApplyForceOffset(self:GetForward()*1000,Vector(math.random(-1,1),math.random(-1,1),math.random(-1,1)))
  110. end
  111. end
  112. hit = true
  113. end
  114. end
  115. end
  116. local randomsound = math.random(1,4)
  117. if hit == false then
  118. self:StopSound(self.idle1)
  119. self:StopSound(self.idle2)
  120. self:StopSound(self.idle3)
  121. self:StopSound(self.idle4)
  122.  
  123. if randomsound == 1 then
  124. self:EmitSound( self.attackmiss1,350,math.random(80,100))
  125. elseif randomsound == 2 then
  126. self:EmitSound( self.attackmiss2,350,math.random(80,100))
  127. elseif randomsound == 3 then
  128. self:EmitSound( self.attackmiss3,350,math.random(80,100))
  129. elseif randomsound == 4 then
  130. self:EmitSound( self.attackmiss4,350,math.random(80,100))
  131. end
  132. else
  133. local randomsound = math.random(1,6)
  134. //make the sound
  135. self:StopSound(self.idle1)
  136. self:StopSound(self.idle2)
  137. self:StopSound(self.idle3)
  138. self:StopSound(self.idle4)
  139.  
  140. if randomsound == 1 then
  141. self:EmitSound( self.attack1,500,math.random(80,100))
  142. elseif randomsound == 2 then
  143. self:EmitSound( self.attack2,500,math.random(80,100))
  144. elseif randomsound == 3 then
  145. self:EmitSound( self.attack3,500,math.random(80,100))
  146. elseif randomsound == 4 then
  147. self:EmitSound( self.attack4,500,math.random(80,100))
  148. elseif randomsound == 5 then
  149. self:EmitSound( self.attack5,500,math.random(80,100))
  150. elseif randomsound == 6 then
  151. self:EmitSound( self.attack6,500,math.random(80,100))
  152. end
  153. end
  154. timer.Create( "melee_done_timer" .. self.Entity:EntIndex( ), 0.2, 1, setmeleefalse )
  155. end
  156. //---------------
  157.  
  158.  
  159. //---------------
  160. if GetConVarNumber("ai_disabled") == 0 then
  161. if math.random(1,5) == 1 then
  162. if self:GetEnemy() != nil then
  163. self:UpdateEnemyMemory(self:GetEnemy(),self:GetEnemy():GetPos())
  164. end
  165. end
  166.  
  167. //make the sound
  168. if self.Alerted == true then
  169. local randomsound = math.random(1,120)
  170. if randomsound == 1 then
  171. self:StopSound(self.angryidle1)
  172. self:StopSound(self.angryidle2)
  173. self:StopSound(self.angryidle3)
  174. self:StopSound(self.angryidle4)
  175. self:EmitSound( self.angryidle1,370,math.random(94,106))
  176. elseif randomsound == 2 then
  177. self:StopSound(self.angryidle1)
  178. self:StopSound(self.angryidle2)
  179. self:StopSound(self.angryidle3)
  180. self:StopSound(self.angryidle4)
  181. self:EmitSound( self.angryidle2,370,math.random(94,106))
  182. elseif randomsound == 3 then
  183. self:StopSound(self.angryidle1)
  184. self:StopSound(self.angryidle2)
  185. self:StopSound(self.angryidle3)
  186. self:StopSound(self.angryidle4)
  187. self:EmitSound( self.angryidle3,370,math.random(94,106))
  188. elseif randomsound == 4 then
  189. self:StopSound(self.angryidle1)
  190. self:StopSound(self.angryidle2)
  191. self:StopSound(self.angryidle3)
  192. self:StopSound(self.angryidle4)
  193. self:EmitSound( self.angryidle4,370,math.random(94,106))
  194. end
  195. else
  196. local randomsound = math.random(1,120)
  197. if randomsound == 1 then
  198. self:StopSound(self.idle1)
  199. self:StopSound(self.idle2)
  200. self:StopSound(self.idle3)
  201. self:StopSound(self.idle4)
  202. self:EmitSound( self.idle1,350,math.random(94,106))
  203. elseif randomsound == 2 then
  204. self:StopSound(self.idle1)
  205. self:StopSound(self.idle2)
  206. self:StopSound(self.idle3)
  207. self:StopSound(self.idle4)
  208. self:EmitSound( self.idle2,350,math.random(94,106))
  209. elseif randomsound == 3 then
  210. self:StopSound(self.idle1)
  211. self:StopSound(self.idle2)
  212. self:StopSound(self.idle3)
  213. self:StopSound(self.idle4)
  214. self:EmitSound( self.idle3,350,math.random(94,106))
  215. elseif randomsound == 4 then
  216. self:StopSound(self.idle1)
  217. self:StopSound(self.idle2)
  218. self:StopSound(self.idle3)
  219. self:StopSound(self.idle4)
  220. self:EmitSound( self.idle4,350,math.random(94,106))
  221. end
  222. end
  223. if math.random(1,10) == 1 then
  224. //print( "Think start" );
  225. //Get all the self's and other entities.
  226. local enttable = ents.FindByClass("self_*")
  227. local monstertable = ents.FindByClass("monster_*")
  228. table.Add(monstertable,enttable)//merge
  229.  
  230. //sort through each ent.
  231. for _, x in pairs(monstertable) do
  232. if (!ents) then print( "No Entities!" ); return end
  233. if (x:GetClass() != self:GetClass() && x:GetClass() != "self_grenade_frag" && x:Isself()) then
  234. x:AddEntityRelationship( self, 1, 10 )
  235. end
  236. end
  237.  
  238. local friends = ents.FindByClass("self_dan_zombie")
  239. for _, x in pairs(friends) do
  240. x:AddEntityRelationship( self, 3, 10 )
  241. end
  242. end
  243.  
  244. if self.TakingCover == false then
  245. if(math.random(1,6) == 1) then
  246. self:FindCloseEnemies()//get guys close to me
  247. end
  248. end//Hit them.
  249.  
  250. if self:GetEnemy() != nil then
  251. if math.random(1,15) == 1 && self:GetPos():Distance(self:GetEnemy():GetPos()) < self.LeapDistance && self:GetPos():Distance(self:GetEnemy():GetPos()) > self.MinLeapDistance && self.Leaps == true && self.Leaping == false then
  252. self:SetSchedule(schedJump)
  253. self.Leaping = true
  254. self:SetVelocity( (self:GetEnemy():GetPos()-self:GetPos() + Vector(0,0,50)):Normalize() * self.LeapSpeed )
  255. timer.Simple(0.25,setmeleefalse)
  256. end
  257. if (self:GetEnemy():GetPos():Distance(self:GetPos()) < 70) || self:HasPropInFrontOfMe() then
  258. if self.MeleeAttacking == false then
  259. if self.Leaping == false then
  260. self:SetSchedule( SCHED_MELEE_ATTACK1 )
  261. else
  262. self:EmitSound( self.attackleap)
  263. self:SetLocalVelocity( Vector( 0, 0, 0 ) )
  264. end
  265. timer.Create( "melee_attack_timer" .. self.Entity:EntIndex( ), 0.6, 1, Attack_Melee )
  266. self.MeleeAttacking = true;
  267. end
  268. end
  269. else
  270. self:FindEnemyDan()
  271. self.MeleeAttacking = false
  272. end
  273. end
  274. //---------------
  275. //print(self:GetEnemy())
  276. //print(self.Alerted)
  277. //print(self.Chasing)
  278.  
  279. end
  280.  
  281. function ENT:HasPropInFrontOfMe()
  282. local entstoattack = ents.FindInSphere(self:GetPos() + self:GetForward()*75,47)
  283. for _,v in pairs(entstoattack) do
  284. if v:GetClass() == "prop_physics" then
  285. return true
  286. end
  287. end
  288. return false
  289. end
  290.  
  291. function ENT:SelectSchedule()
  292. if self:GetEnemy() != nil then
  293. if self:GetEnemy():GetPos():Distance(self:GetPos()) > 2600 then
  294. self:SetSchedule(SCHED_CHASE_ENEMY )
  295. self:SetEnemy(NULL)
  296. alerted = true
  297. end
  298. end
  299.  
  300. local function setleapfalse()
  301. self.Leaping = true
  302. end
  303.  
  304. if self:GetEnemy() != nil then
  305. if self:GetEnemy():GetPos():Distance(self:GetPos()) < 2000 then
  306. self:UpdateEnemyMemory(self:GetEnemy(),self:GetEnemy():GetPos())
  307. self:SetSchedule(SCHED_CHASE_ENEMY)
  308. self.Chasing = true
  309. else
  310. self:SetSchedule(SCHED_RUN_RANDOM)
  311. end
  312. elseif self.Alerted == true then
  313. self:SetSchedule(SCHED_RUN_RANDOM)
  314. self.Alerted = false
  315. self.Chasing = false
  316. else
  317. self:SetSchedule(SCHED_RUN_RANDOM)
  318. self.Alerted = false
  319. self.Chasing = false
  320. end
  321. end
  322.  
  323. function ENT:OnTakeDamage(dmg)
  324. if (self.TakingCover == false) && self.Flinches == true then
  325. self:SetSchedule(SCHED_SMALL_FLINCH)//
  326. end
  327. if self.Bleeds == true then
  328. self:SpawnBlood(dmg)
  329. end
  330. self:SetHealth(self:Health() - dmg:GetDamage())
  331. if math.random(4) == 1 then
  332. self:StopSound(self.idle1)
  333. self:StopSound(self.idle2)
  334. self:StopSound(self.idle3)
  335. self:StopSound(self.idle4)
  336. local sound_seed = math.random(1,7)
  337. if sound_seed == 1 then
  338. self:EmitSound( self.hurt1,500,math.random(80,100))
  339. elseif sound_seed == 2 then
  340. self:EmitSound( self.hurt2,500,math.random(80,100))
  341. elseif sound_seed == 3 then
  342. self:EmitSound( self.hurt3,500,math.random(80,100))
  343. end
  344. end
  345. if dmg:GetAttacker():GetClass() != self:GetClass() && math.random(1,7) == 1 then
  346. self:ResetEnemy()
  347. self:AddEntityRelationship( dmg:GetAttacker(), 1, 10 )
  348. self:SetEnemy(dmg:GetAttacker())
  349. self:SetSchedule(SCHED_CHASE_ENEMY)
  350. self.Chasing = true
  351. self.Alerted = true
  352. end
  353. if self:Health() <= 0 && self.dead == false then //run on death
  354. self.dead = true;
  355. //print("DIED!!!")
  356. self:KilledDan()
  357. end
  358. end
  359.  
  360. function ENT:FindEnemyDan()
  361. local MyNearbyTargets = ents.FindInCone(self:GetPos(),self:GetForward(),4000,45)
  362. if (!MyNearbyTargets) then print( "No Targets!" ); return end
  363. for k,v in pairs(MyNearbyTargets) do
  364. if v:Disposition(self) == 1 || v:IsPlayer() then
  365. self:ResetEnemy()
  366. self:AddEntityRelationship( v, 1, 10 )
  367. self:SetEnemy(v)
  368. self:UpdateEnemyMemory(v,v:GetPos())
  369. local distance = self:GetPos():Distance(v:GetPos())
  370. local randomsound = math.random(1,5)
  371. if self.Alerted == false then
  372. if randomsound == 1 then
  373. self:EmitSound( self.alert1)
  374. elseif randomsound == 2 then
  375. self:EmitSound( self.alert2)
  376. elseif randomsound == 3 then
  377. self:EmitSound( self.alert3)
  378. end
  379. end
  380. self.Alerted = true
  381. return
  382. end
  383. end
  384. //if ClosestDistance == 4000 then
  385. //self:SetEnemy(NULL)
  386. //end
  387. end
  388.  
  389.  
  390. function ENT:ResetEnemy()
  391. local enttable = ents.FindByClass("self_*")
  392. local monstertable = ents.FindByClass("monster_*")
  393. table.Add(monstertable,enttable)//merge
  394.  
  395. //sort through each ent.
  396. for _, x in pairs(monstertable) do
  397. //print(x)
  398. if (!ents) then print( "No Entities!" ); return end
  399. if (x:GetClass() != self:GetClass()) then
  400. self:AddEntityRelationship( x, 2, 10 )
  401. end
  402. end
  403. self:AddRelationship("player D_NU 10")
  404. end
  405.  
  406.  
  407. function ENT:FindCloseEnemies()
  408. local MyNearbyTargets = ents.FindInCone(self:GetPos(),self:GetForward(),250,45)
  409. //local ClosestDistance = 3000
  410. if (!MyNearbyTargets) then print( "No Targets!" ); return end
  411. for k,v in pairs(MyNearbyTargets) do
  412. if v:Disposition(self) == 1 || v:IsPlayer() then
  413. print(v:GetClass())
  414.  
  415. self:ResetEnemy()
  416. self:AddEntityRelationship( v, 1, 10 )
  417. self:SetEnemy(v)
  418.  
  419. self.Alerted = true
  420. return
  421. end
  422. end
  423. end
  424.  
  425.  
  426. function ENT:HasLOS()
  427. if self:GetEnemy() != nil then
  428. local tracedata = {}
  429.  
  430. tracedata.start = self:GetPos()
  431. tracedata.endpos = self:GetEnemy():GetPos()
  432. tracedata.filter = self
  433.  
  434. local trace = util.TraceLine(tracedata)
  435. if trace.HitWorld == false then
  436. print("returned true!")
  437. return true
  438. else
  439. return false
  440. end
  441. end
  442. print ("no enemy!")
  443. return false
  444. end
  445.  
  446.  
  447. function ENT:SpawnBlood(dmg)
  448. if self.AcidBlood then
  449. local entstoattack = ents.FindInSphere(self:GetPos(),75)
  450. for _,v in pairs(entstoattack) do
  451. if ( (v:Isself() || ( v:IsPlayer() && v:Alive())) && (v != self) && (v:GetClass() != self:GetClass()) || (v:GetClass() == "prop_physics")) then
  452. v:TakeDamage( 3, self )
  453. end
  454. self:EmitSound( "alien/alien_acid.wav" )
  455. end
  456. end
  457. if (self.Bleeds == true) then
  458. local bloodeffect = ents.Create( "info_particle_system" )
  459. if self.BleedsRed == true then
  460. bloodeffect:SetKeyValue( "effect_name", "blood_impact_red_01" )
  461. else
  462. bloodeffect:SetKeyValue( "effect_name", "blood_impact_yellow_01")
  463. end
  464. bloodeffect:SetPos( dmg:GetDamagePosition() )
  465. bloodeffect:Spawn()
  466. bloodeffect:Activate()
  467. bloodeffect:Fire( "Start", "", 0 )
  468. bloodeffect:Fire( "Kill", "", 0.1 )
  469. end
  470.  
  471. end
  472.  
  473. function ENT:KilledDan()
  474. /*I Took some of silverlan's code for ragdolling, cause I didn't want to recode it :P*/
  475. //emit cry of death
  476. self:StopSound(self.idle1)
  477. self:StopSound(self.idle2)
  478. self:StopSound(self.idle3)
  479. self:StopSound(self.idle4)
  480.  
  481. local deathseed = math.random(1,3)
  482. if deathseed == 1 then
  483. self:EmitSound( self.die1,350,math.random(80,100))
  484. elseif deathseed == 2 then
  485. self:EmitSound( self.die2,350,math.random(80,100))
  486. elseif deathseed == 3 then
  487. self:EmitSound( self.die3,350,math.random(80,100))
  488. end
  489.  
  490. //create ragdoll
  491. local ragdoll = ents.Create( "prop_ragdoll" )
  492. ragdoll:SetModel( self:GetModel() )
  493. ragdoll:SetPos( self:GetPos() )
  494. ragdoll:SetAngles( self:GetAngles() )
  495. ragdoll:Spawn()
  496. ragdoll:SetSkin( self:GetSkin() )
  497. ragdoll:SetColor( self:GetColor() )
  498. ragdoll:SetMaterial( self:GetMaterial() )
  499.  
  500. //my code
  501. undo.ReplaceEntity(self,ragdoll)
  502. cleanup.ReplaceEntity(self,ragdoll)
  503.  
  504. //ignight ragdoll if on fire.
  505. if self:IsOnFire() then ragdoll:Ignite( math.Rand( 8, 10 ), 0 ) end
  506.  
  507. //position bones the same way.
  508. for i=1,128 do
  509. local bone = ragdoll:GetPhysicsObjectNum( i )
  510. if IsValid( bone ) then
  511. local bonepos, boneang = self:GetBonePosition( ragdoll:TranslatePhysBoneToBone( i ) )
  512. bone:SetPos( bonepos )
  513. bone:SetAngles( boneang )
  514. end
  515. end
  516. if( GetConVarNumber("ai_keepragdolls") == 0 ) then
  517. ragdoll:SetCollisionGroup( 1 )//COLLISION_GROUP_DEBRIS )
  518. ragdoll:Fire( "FadeAndRemove", "", 7 )
  519. end
  520. self:Remove()
  521. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement