af320d9c15555c866f30505e72dee4d0c41c237a
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / mutators / mutator / nades / net.qc
1 #include "nades.qh"
2
3 #ifdef IMPLEMENTATION
4
5 #ifdef CSQC
6 .float ltime;
7 void orb_draw(entity this)
8 {
9         float dt = time - this.move_time;
10         this.move_time = time;
11         if(dt <= 0)
12                 return;
13
14         this.alpha = (this.ltime - time) / this.orb_lifetime;
15         this.scale = min((1 - this.alpha)*this.orb_lifetime*4,1)*this.orb_radius;
16         this.angles = this.angles + dt * this.avelocity;
17 }
18
19 void orb_setup(entity e)
20 {
21         setmodel(e, MDL_NADE_ORB);
22         e.skin = 1;
23
24         setorigin(e, e.origin);
25
26         float model_radius = e.maxs.x;
27         vector size = '1 1 1' * e.orb_radius / 2;
28         setsize(e,-size,size);
29         e.orb_radius = e.orb_radius/model_radius*0.6;
30
31         e.draw = orb_draw;
32         e.health = 255;
33         e.movetype = MOVETYPE_NONE;
34         e.solid = SOLID_NOT;
35         e.drawmask = MASK_NORMAL;
36         e.scale = 0.01;
37         e.avelocity = e.move_avelocity = '7 0 11';
38         e.renderflags |= RF_ADDITIVE;
39 }
40 #endif
41
42 REGISTER_NET_LINKED(Nade_Orb)
43
44 #ifdef CSQC
45 NET_HANDLE(Nade_Orb, bool isNew)
46 {
47         Net_Accept(Nade_Orb);
48         int sf = ReadByte();
49         if (sf & 1) {
50                 this.origin_x = ReadCoord();
51                 this.origin_y = ReadCoord();
52                 this.origin_z = ReadCoord();
53                 setorigin(this, this.origin);
54                 this.colormod_x = ReadCoord();
55                 this.colormod_y = ReadCoord();
56                 this.colormod_z = ReadCoord();
57                 this.orb_lifetime = ReadByte();
58                 this.orb_radius = ReadShort();
59                 this.ltime = time + ReadByte()/10.0;
60                 // this.ltime = time + this.orb_lifetime;
61                 orb_setup(this);
62         }
63         return true;
64 }
65 #endif
66
67 #ifdef SVQC
68 bool orb_send(entity this, entity to, int sf)
69 {
70         int channel = MSG_ENTITY;
71         WriteHeader(channel, Nade_Orb);
72         WriteByte(channel, sf);
73         if (sf & 1) {
74                 WriteCoord(channel, this.origin.x);
75                 WriteCoord(channel, this.origin.y);
76                 WriteCoord(channel, this.origin.z);
77
78                 WriteCoord(channel, this.colormod.x);
79                 WriteCoord(channel, this.colormod.y);
80                 WriteCoord(channel, this.colormod.z);
81
82                 WriteByte(channel, this.orb_lifetime);
83                 //WriteByte(MSG_ENTITY, this.ltime - time + 1);
84                 WriteShort(channel, this.orb_radius);
85                 // round time delta to a 1/10th of a second
86                 WriteByte(channel, (this.ltime - time)*10.0+0.5);
87         }
88         return true;
89 }
90 #endif
91
92 #endif