600af861ac956c55cba7a867ee567aa03b59bc5a
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / target_music.qc
1 .float lifetime;
2 // values:
3 //   volume
4 //   noise
5 //   targetname
6 //   lifetime
7 //   fade_time
8 //   fade_rate
9 // when triggered, the music is overridden for activator until lifetime (or forever, if lifetime is 0)
10 // when targetname is not set, THIS ONE is default
11 void target_music_sendto(float to, float is)
12 {
13         WriteByte(to, SVC_TEMPENTITY);
14         WriteByte(to, TE_CSQC_TARGET_MUSIC);
15         WriteShort(to, num_for_edict(self));
16         WriteByte(to, self.volume * 255.0 * is);
17         WriteByte(to, self.fade_time * 16.0);
18         WriteByte(to, self.fade_rate * 16.0);
19         WriteByte(to, self.lifetime);
20         WriteString(to, self.noise);
21 }
22 void target_music_reset()
23 {
24         if(self.targetname == "")
25                 target_music_sendto(MSG_ALL, 1);
26 }
27 void target_music_use()
28 {
29         if(!activator)
30                 return;
31         if(!IS_REAL_CLIENT(activator))
32                 return;
33         msg_entity = activator;
34         target_music_sendto(MSG_ONE, 1);
35         entity head;
36         FOR_EACH_SPEC(head) if(head.enemy == activator) { msg_entity = head; target_music_sendto(MSG_ONE, 1); }
37 }
38 void spawnfunc_target_music()
39 {
40         self.use = target_music_use;
41         self.reset = target_music_reset;
42         if(!self.volume)
43                 self.volume = 1;
44         if(self.targetname == "")
45                 target_music_sendto(MSG_INIT, 1);
46         else
47                 target_music_sendto(MSG_INIT, 0);
48 }
49 void TargetMusic_RestoreGame()
50 {
51         for(self = world; (self = find(self, classname, "target_music")); )
52         {
53                 if(self.targetname == "")
54                         target_music_sendto(MSG_INIT, 1);
55                 else
56                         target_music_sendto(MSG_INIT, 0);
57         }
58 }
59 // values:
60 //   volume
61 //   noise
62 //   targetname
63 //   fade_time
64 // spawnflags:
65 //   1 = START_OFF
66 // when triggered, it is disabled/enabled for everyone
67 float trigger_music_SendEntity(entity to, float sf)
68 {
69         WriteByte(MSG_ENTITY, ENT_CLIENT_TRIGGER_MUSIC);
70         sf &= ~0x80;
71         if(self.cnt)
72                 sf |= 0x80;
73         WriteByte(MSG_ENTITY, sf);
74         if(sf & 4)
75         {
76                 WriteCoord(MSG_ENTITY, self.origin_x);
77                 WriteCoord(MSG_ENTITY, self.origin_y);
78                 WriteCoord(MSG_ENTITY, self.origin_z);
79         }
80         if(sf & 1)
81         {
82                 if(self.model != "null")
83                 {
84                         WriteShort(MSG_ENTITY, self.modelindex);
85                         WriteCoord(MSG_ENTITY, self.mins_x);
86                         WriteCoord(MSG_ENTITY, self.mins_y);
87                         WriteCoord(MSG_ENTITY, self.mins_z);
88                         WriteCoord(MSG_ENTITY, self.maxs_x);
89                         WriteCoord(MSG_ENTITY, self.maxs_y);
90                         WriteCoord(MSG_ENTITY, self.maxs_z);
91                 }
92                 else
93                 {
94                         WriteShort(MSG_ENTITY, 0);
95                         WriteCoord(MSG_ENTITY, self.maxs_x);
96                         WriteCoord(MSG_ENTITY, self.maxs_y);
97                         WriteCoord(MSG_ENTITY, self.maxs_z);
98                 }
99                 WriteByte(MSG_ENTITY, self.volume * 255.0);
100                 WriteByte(MSG_ENTITY, self.fade_time * 16.0);
101                 WriteByte(MSG_ENTITY, self.fade_rate * 16.0);
102                 WriteString(MSG_ENTITY, self.noise);
103         }
104         return 1;
105 }
106 void trigger_music_reset()
107 {
108         self.cnt = !(self.spawnflags & 1);
109         self.SendFlags |= 0x80;
110 }
111 void trigger_music_use()
112 {
113         self.cnt = !self.cnt;
114         self.SendFlags |= 0x80;
115 }
116 void spawnfunc_trigger_music()
117 {
118         if(self.model != "")
119                 setmodel(self, self.model);
120         if(!self.volume)
121                 self.volume = 1;
122         if(!self.modelindex)
123         {
124                 setorigin(self, self.origin + self.mins);
125                 setsize(self, '0 0 0', self.maxs - self.mins);
126         }
127         trigger_music_reset();
128
129         self.use = trigger_music_use;
130         self.reset = trigger_music_reset;
131
132         Net_LinkEntity(self, FALSE, 0, trigger_music_SendEntity);
133 }