5 #include <lib/warpzone/util_server.qh>
6 #include <common/weapons/_all.qh>
7 #include <server/defs.qh>
8 #include <common/deathtypes/all.qh>
13 * Adds spawnfunc_trigger_swamp and suppoart routines for xonotic 1.2.1+
14 * Author tZork (Jakob MG)
19 .float swamp_interval; //Hurt players in swamp with this interval
20 .float swamp_slowdown; //Players in swamp get slowd down by this mutch 0-1 is slowdown 1-~ is speedup (!?)
24 spawnfunc(trigger_swamp);
26 void swamp_touch(entity this, entity toucher);
27 void swampslug_think(entity this);
31 * Uses a entity calld swampslug to handle players in the swamp
32 * It works like this: When the plyer enters teh swamp the spawnfunc_trigger_swamp
33 * attaches a new "swampslug" to the player. As long as the plyer is inside
34 * the swamp the swamp gives the slug new health. But the slug slowly kills itself
35 * so when the player goes outside the swamp, it dies and releases the player from the
36 * swamps curses (dmg/slowdown)
38 * I do it this way becuz there is no "untouch" event.
40 void swampslug_think(entity this)
42 //Slowly kill the slug
43 SetResourceAmountExplicit(this, RESOURCE_HEALTH, GetResourceAmount(this, RESOURCE_HEALTH) - 1);
45 //Slug dead? then remove curses.
46 if(GetResourceAmount(this, RESOURCE_HEALTH) <= 0)
48 this.owner.in_swamp = 0;
50 //centerprint(this.owner,"Killing slug...\n");
54 // Slug still alive, so we are still in the swamp
55 // Or we have exited it very recently.
56 // Do the damage and renew the timer.
58 Damage (this.owner, this, this, this.dmg, DEATH_SWAMP.m_id, DMG_NOWEP, this.owner.origin, '0 0 0');
61 this.nextthink = time + this.swamp_interval;
64 void swamp_touch(entity this, entity toucher)
66 // If whatever thats touching the swamp is not a player
67 // or if its a dead player, just dont care abt it.
68 if(!IS_PLAYER(toucher) || IS_DEAD(toucher))
71 EXACTTRIGGER_TOUCH(this, toucher);
73 // Chech if player alredy got a swampslug.
74 if(toucher.in_swamp != 1)
77 //centerprint(toucher,"Entering swamp!\n");
78 toucher.swampslug = spawn();
79 SetResourceAmountExplicit(toucher.swampslug, RESOURCE_HEALTH, 2);
80 setthink(toucher.swampslug, swampslug_think);
81 toucher.swampslug.nextthink = time;
82 toucher.swampslug.owner = toucher;
83 toucher.swampslug.dmg = this.dmg;
84 toucher.swampslug.swamp_interval = this.swamp_interval;
85 toucher.swamp_slowdown = this.swamp_slowdown;
90 //toucher.in_swamp = 1;
92 //Revitalize players swampslug
93 SetResourceAmountExplicit(toucher.swampslug, RESOURCE_HEALTH, 2);
96 REGISTER_NET_LINKED(ENT_CLIENT_SWAMP)
99 float swamp_send(entity this, entity to, float sf)
101 WriteHeader(MSG_ENTITY, ENT_CLIENT_SWAMP);
103 WriteByte(MSG_ENTITY, this.dmg); // can probably get away with using a single byte here
104 WriteByte(MSG_ENTITY, this.swamp_slowdown);
105 WriteByte(MSG_ENTITY, this.swamp_interval);
107 trigger_common_write(this, false);
112 void swamp_link(entity this)
114 trigger_link(this, swamp_send);
117 /*QUAKED spawnfunc_trigger_swamp (.5 .5 .5) ?
118 Players gettin into the swamp will
119 get slowd down and damaged
121 spawnfunc(trigger_swamp)
125 settouch(this, swamp_touch);
127 // Setup default keys, if missing
130 if(this.swamp_interval <= 0)
131 this.swamp_interval = 1;
132 if(this.swamp_slowdown <= 0)
133 this.swamp_slowdown = 0.5;
140 NET_HANDLE(ENT_CLIENT_SWAMP, bool isnew)
142 this.dmg = ReadByte();
143 this.swamp_slowdown = ReadByte();
144 this.swamp_interval = ReadByte();
146 trigger_common_read(this, false);
150 this.classname = "trigger_swamp";
151 this.solid = SOLID_TRIGGER;
152 settouch(this, swamp_touch);
153 this.drawmask = MASK_NORMAL;
154 this.move_time = time;
155 this.entremove = trigger_remove_generic;