1 #include "modeleffects.qh"
3 REGISTER_NET_LINKED(ENT_CLIENT_MODELEFFECT)
9 bool modeleffect_SendEntity(entity this, entity to, int sf)
12 WriteHeader(MSG_ENTITY, ENT_CLIENT_MODELEFFECT);
15 if (this.velocity != '0 0 0') {
18 if (this.angles != '0 0 0') {
21 if (this.avelocity != '0 0 0') {
25 WriteByte(MSG_ENTITY, f);
26 WriteShort(MSG_ENTITY, this.modelindex);
27 WriteByte(MSG_ENTITY, this.skin);
28 WriteByte(MSG_ENTITY, this.frame);
29 WriteCoord(MSG_ENTITY, this.origin.x);
30 WriteCoord(MSG_ENTITY, this.origin.y);
31 WriteCoord(MSG_ENTITY, this.origin.z);
33 WriteCoord(MSG_ENTITY, this.velocity.x);
34 WriteCoord(MSG_ENTITY, this.velocity.y);
35 WriteCoord(MSG_ENTITY, this.velocity.z);
38 WriteCoord(MSG_ENTITY, this.angles.x);
39 WriteCoord(MSG_ENTITY, this.angles.y);
40 WriteCoord(MSG_ENTITY, this.angles.z);
43 WriteCoord(MSG_ENTITY, this.avelocity.x);
44 WriteCoord(MSG_ENTITY, this.avelocity.y);
45 WriteCoord(MSG_ENTITY, this.avelocity.z);
47 WriteShort(MSG_ENTITY, this.scale * 256.0);
48 WriteShort(MSG_ENTITY, this.scale2 * 256.0);
49 WriteByte(MSG_ENTITY, this.teleport_time * 100.0);
50 WriteByte(MSG_ENTITY, this.fade_time * 100.0);
51 WriteByte(MSG_ENTITY, this.alpha * 255.0);
56 void modeleffect_spawn(string m, float s, float f, vector o, vector v, vector ang, vector angv, float s0, float s2, float a, float t1, float t2)
58 entity e = new(modeleffect);
70 e.scale = s0 / max6(-e.mins.x, -e.mins.y, -e.mins.z, e.maxs.x, e.maxs.y, e.maxs.z);
75 e.scale2 = s2 / max6(-e.mins.x, -e.mins.y, -e.mins.z, e.maxs.x, e.maxs.y, e.maxs.z);
79 float sz = max(e.scale, e.scale2);
80 setsize(e, e.mins * sz, e.maxs * sz);
81 Net_LinkEntity(e, false, 0.1, modeleffect_SendEntity);
88 entityclass(ModelEffect);
89 class(ModelEffect).float frame1time;
90 class(ModelEffect).float lifetime, fadetime;
91 class(ModelEffect).float teleport_time;
92 class(ModelEffect).float scale1, scale2;
98 void ModelEffect_Draw(entity this)
100 this.angles = this.angles + frametime * this.avelocity;
101 setorigin(this, this.origin + frametime * this.velocity);
102 this.scale = this.scale1 + (this.scale2 - this.scale1) * (time - this.teleport_time) / (this.lifetime + this.fadetime - this.teleport_time);
103 this.alpha = this.cnt * bound(0, 1 - (time - this.lifetime) / this.fadetime, 1);
104 if (this.alpha < ALPHA_MIN_VISIBLE) {
108 this.drawmask = MASK_NORMAL;
109 if (this.scale <= 0) {
115 NET_HANDLE(ENT_CLIENT_MODELEFFECT, bool isnew)
121 entity e = new(modeleffect);
122 e.model = "from network";
123 e.modelindex = ReadShort();
125 e.frame = ReadByte();
127 e.origin_x = ReadCoord();
128 e.origin_y = ReadCoord();
129 e.origin_z = ReadCoord();
130 setorigin(e, e.origin);
132 e.velocity_x = ReadCoord();
133 e.velocity_y = ReadCoord();
134 e.velocity_z = ReadCoord();
137 e.angles_x = ReadAngle();
138 e.angles_y = ReadAngle();
139 e.angles_z = ReadAngle();
142 e.avelocity_x = ReadAngle();
143 e.avelocity_y = ReadAngle();
144 e.avelocity_z = ReadAngle();
146 e.scale1 = ReadShort() / 256.0;
147 e.scale2 = ReadShort() / 256.0;
148 e.lifetime = time + ReadByte() * 0.01;
149 e.fadetime = ReadByte() * 0.01;
150 e.teleport_time = time;
151 e.cnt = ReadByte() / 255.0; // actually alpha
153 e.draw = ModelEffect_Draw;
154 if (isnew) { IL_PUSH(g_drawables, e); }
157 delete(e); // yes, this IS stupid, but I don't need to duplicate all the read* stuff then