]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/common/triggers/func/ladder.qc
Merge branch 'terencehill/strzone_fixes' into 'master'
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / triggers / func / ladder.qc
1 REGISTER_NET_LINKED(ENT_CLIENT_LADDER)
2
3 void func_ladder_touch()
4 {SELFPARAM();
5 #ifdef SVQC
6         if (!other.iscreature)
7                 return;
8         if(IS_VEHICLE(other))
9                 return;
10 #endif
11
12         EXACTTRIGGER_TOUCH;
13
14         other.ladder_time = time + 0.1;
15         other.ladder_entity = self;
16 }
17
18 #ifdef SVQC
19 bool func_ladder_send(entity to, int sf)
20 {SELFPARAM();
21         WriteHeader(MSG_ENTITY, ENT_CLIENT_LADDER);
22
23         int f = 0;
24         if(self.warpzone_isboxy)
25                 BITSET_ASSIGN(f, 1);
26         if(self.origin != '0 0 0')
27                 BITSET_ASSIGN(f, 4);
28         WriteByte(MSG_ENTITY, f);
29
30         // we need THESE to render the warpzone (and cull properly)...
31         if(f & 4)
32         {
33                 WriteCoord(MSG_ENTITY, self.origin.x);
34                 WriteCoord(MSG_ENTITY, self.origin.y);
35                 WriteCoord(MSG_ENTITY, self.origin.z);
36         }
37
38         WriteShort(MSG_ENTITY, self.modelindex);
39         WriteCoord(MSG_ENTITY, self.mins.x);
40         WriteCoord(MSG_ENTITY, self.mins.y);
41         WriteCoord(MSG_ENTITY, self.mins.z);
42         WriteCoord(MSG_ENTITY, self.maxs.x);
43         WriteCoord(MSG_ENTITY, self.maxs.y);
44         WriteCoord(MSG_ENTITY, self.maxs.z);
45         WriteByte(MSG_ENTITY, bound(1, self.scale * 16, 255));
46
47         WriteString(MSG_ENTITY, self.classname);
48         WriteByte(MSG_ENTITY, self.skin);
49         WriteCoord(MSG_ENTITY, self.speed);
50
51         trigger_common_write(false);
52
53         return true;
54 }
55
56 void func_ladder_link()
57 {
58         self.SendEntity = func_ladder_send;
59         self.SendFlags = 0xFFFFFF;
60         //self.model = "null";
61 }
62
63 void func_ladder_init()
64 {
65         //self.mdl = self.model;
66         string m = self.model;
67         WarpZoneLib_ExactTrigger_Init();
68         if(m != "")
69         {
70                 precache_model(m);
71                 _setmodel(self, m); // no precision needed
72         }
73         setorigin(self, self.origin);
74         if(self.scale)
75                 setsize(self, self.mins * self.scale, self.maxs * self.scale);
76         else
77                 setsize(self, self.mins, self.maxs);
78         self.touch = func_ladder_touch;
79         BITSET_ASSIGN(self.effects, EF_NODEPTHTEST);
80
81         func_ladder_link();
82 }
83
84 spawnfunc(func_ladder)
85 {
86         func_ladder_init();
87 }
88
89 spawnfunc(func_water)
90 {
91         func_ladder_init();
92 }
93
94 #elif defined(CSQC)
95 .float speed;
96
97 void func_ladder_remove()
98 {
99         if(self.classname) { strunzone(self.classname); }
100         self.classname = string_null;
101 }
102
103 NET_HANDLE(ENT_CLIENT_LADDER, bool isnew)
104 {
105         int f = ReadByte();
106         self.warpzone_isboxy = (f & 1);
107         if(f & 4)
108         {
109                 self.origin_x = ReadCoord();
110                 self.origin_y = ReadCoord();
111                 self.origin_z = ReadCoord();
112         }
113         else
114                 self.origin = '0 0 0';
115
116         self.modelindex = ReadShort();
117         self.mins_x = ReadCoord();
118         self.mins_y = ReadCoord();
119         self.mins_z = ReadCoord();
120         self.maxs_x = ReadCoord();
121         self.maxs_y = ReadCoord();
122         self.maxs_z = ReadCoord();
123         self.scale = ReadByte() / 16;
124         self.classname = strzone(ReadString());
125         self.skin = ReadByte();
126         self.speed = ReadCoord();
127
128         trigger_common_read(false);
129
130         self.solid = SOLID_TRIGGER;
131         self.move_touch = func_ladder_touch;
132         self.drawmask = MASK_NORMAL;
133         self.move_time = time;
134         self.entremove = func_ladder_remove;
135
136         return true;
137 }
138 #endif