Cleanup
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / triggers / trigger / swamp.qc
1 #if defined(CSQC)
2 #elif defined(MENUQC)
3 #elif defined(SVQC)
4     #include "../../../lib/warpzone/util_server.qh"
5     #include "../../weapons/all.qh"
6     #include "../../../server/defs.qh"
7     #include "../../deathtypes/all.qh"
8 #endif
9
10 /*
11 *               t_swamp.c
12 *               Adds spawnfunc_trigger_swamp and suppoart routines for xonotic 1.2.1+
13 *               Author tZork (Jakob MG)
14 *               jakob@games43.se
15 *               2005 11 29
16 */
17
18 .float swamp_interval;  //Hurt players in swamp with this interval
19 .float swamp_slowdown;  //Players in swamp get slowd down by this mutch 0-1 is slowdown 1-~ is speedup (!?)
20 .entity swampslug;
21
22 #ifdef SVQC
23 spawnfunc(trigger_swamp);
24 #endif
25 void swamp_touch();
26 void swampslug_think();
27
28
29 /*
30 * Uses a entity calld swampslug to handle players in the swamp
31 * It works like this: When the plyer enters teh swamp the spawnfunc_trigger_swamp
32 * attaches a new "swampslug" to the player. As long as the plyer is inside
33 * the swamp the swamp gives the slug new health. But the slug slowly kills itself
34 * so when the player goes outside the swamp, it dies and releases the player from the
35 * swamps curses (dmg/slowdown)
36 *
37 * I do it this way becuz there is no "untouch" event.
38 */
39 void swampslug_think()
40 {SELFPARAM();
41         //Slowly kill the slug
42         self.health = self.health - 1;
43
44         //Slug dead? then remove curses.
45         if(self.health <= 0)
46         {
47                 self.owner.in_swamp = 0;
48                 remove(self);
49                 //centerprint(self.owner,"Killing slug...\n");
50                 return;
51         }
52
53         // Slug still alive, so we are still in the swamp
54         // Or we have exited it very recently.
55         // Do the damage and renew the timer.
56 #ifdef SVQC
57         Damage (self.owner, self, self, self.dmg, DEATH_SWAMP.m_id, other.origin, '0 0 0');
58 #endif
59
60         self.nextthink = time + self.swamp_interval;
61 }
62
63 void swamp_touch()
64 {SELFPARAM();
65         // If whatever thats touching the swamp is not a player
66         // or if its a dead player, just dont care abt it.
67         if(!IS_PLAYER(other) || PHYS_DEAD(other))
68                 return;
69
70         EXACTTRIGGER_TOUCH;
71
72         // Chech if player alredy got a swampslug.
73         if(other.in_swamp != 1)
74         {
75                 // If not attach one.
76                 //centerprint(other,"Entering swamp!\n");
77                 other.swampslug = spawn();
78                 other.swampslug.health = 2;
79                 other.swampslug.think = swampslug_think;
80                 other.swampslug.nextthink = time;
81                 other.swampslug.owner = other;
82                 other.swampslug.dmg = self.dmg;
83                 other.swampslug.swamp_interval = self.swamp_interval;
84                 other.swamp_slowdown = self.swamp_slowdown;
85                 other.in_swamp = 1;
86                 return;
87         }
88
89         //other.in_swamp = 1;
90
91         //Revitalize players swampslug
92         other.swampslug.health = 2;
93 }
94
95 #ifdef SVQC
96 float swamp_send(entity to, float sf)
97 {SELFPARAM();
98         WriteHeader(MSG_ENTITY, ENT_CLIENT_LADDER); // FIXME: should this really be sent as a ladder?
99
100         WriteByte(MSG_ENTITY, self.dmg); // can probably get away with using a single byte here
101         WriteByte(MSG_ENTITY, self.swamp_slowdown);
102         WriteByte(MSG_ENTITY, self.swamp_interval);
103
104         trigger_common_write(false);
105
106         return true;
107 }
108
109 void swamp_link()
110 {SELFPARAM();
111         Net_LinkEntity(self, false, 0, func_ladder_send);
112 }
113
114 /*QUAKED spawnfunc_trigger_swamp (.5 .5 .5) ?
115 Players gettin into the swamp will
116 get slowd down and damaged
117 */
118 spawnfunc(trigger_swamp)
119 {
120         // Init stuff
121         EXACTTRIGGER_INIT;
122         self.touch = swamp_touch;
123
124         // Setup default keys, if missing
125         if(self.dmg <= 0)
126                 self.dmg = 5;
127         if(self.swamp_interval <= 0)
128                 self.swamp_interval = 1;
129         if(self.swamp_slowdown <= 0)
130                 self.swamp_slowdown = 0.5;
131
132         swamp_link();
133 }
134
135 #elif defined(CSQC)
136
137 NET_HANDLE(ENT_CLIENT_SWAMP, bool isnew)
138 {
139         self.dmg = ReadByte();
140         self.swamp_slowdown = ReadByte();
141         self.swamp_interval = ReadByte();
142
143         trigger_common_read(false);
144
145         return = true;
146
147         self.classname = "trigger_swamp";
148         self.solid = SOLID_TRIGGER;
149         self.draw = trigger_draw_generic;
150         self.trigger_touch = swamp_touch;
151         self.drawmask = MASK_NORMAL;
152         self.move_time = time;
153         self.entremove = trigger_remove_generic;
154 }
155 #endif