+#include "tuba.qh"
#ifndef IMPLEMENTATION
CLASS(Tuba, Weapon)
-/* impulse */ ATTRIB(Tuba, impulse, int, 1)
+/* impulse */ ATTRIB(Tuba, impulse, int, 1);
/* flags */ ATTRIB(Tuba, spawnflags, int, WEP_FLAG_HIDDEN | WEP_TYPE_SPLASH);
/* rating */ ATTRIB(Tuba, bot_pickupbasevalue, float, BOT_PICKUP_RATING_MID);
/* color */ ATTRIB(Tuba, wpcolor, vector, '0 1 0');
/* modelname */ ATTRIB(Tuba, mdl, string, "tuba");
-#ifndef MENUQC
+#ifdef GAMEQC
/* model */ ATTRIB(Tuba, m_model, Model, MDL_TUBA_ITEM);
#endif
/* crosshair */ ATTRIB(Tuba, w_crosshair, string, "gfx/crosshairtuba");
}
}
}
- remove(this);
+ delete(this);
}
int W_Tuba_GetNote(entity pl, int hittype)
return true;
}
-void W_Tuba_NoteThink()
-{SELFPARAM();
+void W_Tuba_NoteThink(entity this)
+{
float dist_mult;
float vol0, vol1;
vector dir0, dir1;
vector v;
- if(time > self.teleport_time)
+ if(time > this.teleport_time)
{
W_Tuba_NoteOff(this);
return;
}
- self.nextthink = time;
+ this.nextthink = time;
dist_mult = WEP_CVAR(tuba, attenuation) / autocvar_snd_soundradius;
- FOREACH_CLIENT(IS_REAL_CLIENT(it) && it != self.realowner, {
- v = self.origin - (it.origin + it.view_ofs);
+ FOREACH_CLIENT(IS_REAL_CLIENT(it) && it != this.realowner, {
+ v = this.origin - (it.origin + it.view_ofs);
vol0 = max(0, 1 - vlen(v) * dist_mult);
dir0 = normalize(v);
- v = self.realowner.origin - (it.origin + it.view_ofs);
+ v = this.realowner.origin - (it.origin + it.view_ofs);
vol1 = max(0, 1 - vlen(v) * dist_mult);
dir1 = normalize(v);
if(fabs(vol0 - vol1) > 0.005) // 0.5 percent change in volume
{
- setorigin(self, self.realowner.origin);
- self.SendFlags |= 2;
+ setorigin(this, this.realowner.origin);
+ this.SendFlags |= 2;
break;
}
if(dir0 * dir1 < 0.9994) // 2 degrees change in angle
{
- setorigin(self, self.realowner.origin);
- self.SendFlags |= 2;
+ setorigin(this, this.realowner.origin);
+ this.SendFlags |= 2;
break;
}
});
}
-void W_Tuba_NoteOn(float hittype)
-{SELFPARAM();
+void W_Tuba_NoteOn(entity actor, .entity weaponentity, float hittype)
+{
vector o;
float n;
- W_SetupShot(self, false, 2, "", 0, WEP_CVAR(tuba, damage));
+ W_SetupShot(actor, weaponentity, false, 2, SND_Null, 0, WEP_CVAR(tuba, damage));
- n = W_Tuba_GetNote(self, hittype);
+ n = W_Tuba_GetNote(actor, hittype);
hittype = 0;
- if(self.tuba_instrument & 1)
+ if(actor.tuba_instrument & 1)
hittype |= HITTYPE_SECONDARY;
- if(self.tuba_instrument & 2)
+ if(actor.tuba_instrument & 2)
hittype |= HITTYPE_BOUNCE;
- if(self.tuba_note)
+ if(actor.tuba_note)
{
- if(self.tuba_note.cnt != n || self.tuba_note.tuba_instrument != self.tuba_instrument)
+ if(actor.tuba_note.cnt != n || actor.tuba_note.tuba_instrument != actor.tuba_instrument)
{
- W_Tuba_NoteOff(self.tuba_note);
+ W_Tuba_NoteOff(actor.tuba_note);
}
}
- if(!self.tuba_note)
+ if(!actor.tuba_note)
{
- self.tuba_note = new(tuba_note);
- self.tuba_note.owner = self.tuba_note.realowner = self;
- self.tuba_note.cnt = n;
- self.tuba_note.tuba_instrument = self.tuba_instrument;
- self.tuba_note.think = W_Tuba_NoteThink;
- self.tuba_note.nextthink = time;
- self.tuba_note.spawnshieldtime = time;
- Net_LinkEntity(self.tuba_note, false, 0, W_Tuba_NoteSendEntity);
+ actor.tuba_note = new(tuba_note);
+ actor.tuba_note.owner = actor.tuba_note.realowner = actor;
+ actor.tuba_note.cnt = n;
+ actor.tuba_note.tuba_instrument = actor.tuba_instrument;
+ setthink(actor.tuba_note, W_Tuba_NoteThink);
+ actor.tuba_note.nextthink = time;
+ actor.tuba_note.spawnshieldtime = time;
+ Net_LinkEntity(actor.tuba_note, false, 0, W_Tuba_NoteSendEntity);
}
- self.tuba_note.teleport_time = time + WEP_CVAR(tuba, refire) * 2 * W_WeaponRateFactor(); // so it can get prolonged safely
+ actor.tuba_note.teleport_time = time + WEP_CVAR(tuba, refire) * 2 * W_WeaponRateFactor(actor); // so it can get prolonged safely
- //sound(self, c, TUBA_NOTE(n), bound(0, VOL_BASE * cvar("g_balance_tuba_volume"), 1), autocvar_g_balance_tuba_attenuation);
- RadiusDamage(self, self, WEP_CVAR(tuba, damage), WEP_CVAR(tuba, edgedamage), WEP_CVAR(tuba, radius), NULL, NULL, WEP_CVAR(tuba, force), hittype | WEP_TUBA.m_id, NULL);
+ //sound(actor, c, TUBA_NOTE(n), bound(0, VOL_BASE * cvar("g_balance_tuba_volume"), 1), autocvar_g_balance_tuba_attenuation);
+ RadiusDamage(actor, actor, WEP_CVAR(tuba, damage), WEP_CVAR(tuba, edgedamage), WEP_CVAR(tuba, radius), NULL, NULL, WEP_CVAR(tuba, force), hittype | WEP_TUBA.m_id, NULL);
- o = gettaginfo(self.exteriorweaponentity, 0);
- if(time > self.tuba_smoketime)
+ o = gettaginfo(actor.exteriorweaponentity, 0);
+ if(time > actor.tuba_smoketime)
{
Send_Effect(EFFECT_SMOKE_RING, o + v_up * 45 + v_right * -6 + v_forward * 8, v_up * 100, 1);
- self.tuba_smoketime = time + 0.25;
+ actor.tuba_smoketime = time + 0.25;
}
}
#endif
#ifdef SVQC
-METHOD(Tuba, wr_aim, void(Tuba this))
+METHOD(Tuba, wr_aim, void(Tuba this, entity actor))
{
- entity actor = self;
// bots cannot play the Tuba well yet
// I think they should start with the recorder first
if (vdist((actor.origin - actor.enemy.origin), <, WEP_CVAR(tuba, radius)))
if (fire & 1)
if (weapon_prepareattack(this, actor, weaponentity, false, WEP_CVAR(tuba, refire)))
{
- W_Tuba_NoteOn(0);
+ W_Tuba_NoteOn(actor, weaponentity, 0);
weapon_thinkf(actor, weaponentity, WFRAME_IDLE, WEP_CVAR(tuba, animtime), w_ready);
}
if (fire & 2)
if (weapon_prepareattack(this, actor, weaponentity, true, WEP_CVAR(tuba, refire)))
{
- W_Tuba_NoteOn(HITTYPE_SECONDARY);
+ W_Tuba_NoteOn(actor, weaponentity, HITTYPE_SECONDARY);
weapon_thinkf(actor, weaponentity, WFRAME_IDLE, WEP_CVAR(tuba, animtime), w_ready);
}
if (actor.tuba_note)
}
}
-METHOD(Tuba, wr_setup, void(Tuba this))
+void tuba_instrument_send(entity this, int instr);
+METHOD(Tuba, wr_setup, void(Tuba this, entity actor))
{
- entity actor = self;
actor.ammo_field = ammo_none;
actor.tuba_instrument = 0;
+ tuba_instrument_send(actor, actor.tuba_instrument);
}
#endif
string s = (i == 0) ? "tuba" :
(i == 1) ? "akordeon" :
"kleinbottle" ;
- CL_WeaponEntity_SetModel(viewmodel, s);
+ viewmodel.tuba_instrument = i;
+ CL_WeaponEntity_SetModel(viewmodel, s, true);
}
#endif
#ifdef SVQC
void tuba_instrument_send(entity this, int instr)
{
msg_entity = this;
+ if (!IS_REAL_CLIENT(this))
+ return;
int chan = MSG_ONE;
WriteHeader(chan, tuba_instrument);
WriteByte(chan, instr);
break;
}
tuba_instrument_send(actor, actor.tuba_instrument);
- W_SetupShot(actor, false, 0, "", 0, 0);
+ W_SetupShot(actor, weaponentity, false, 0, SND_Null, 0, 0);
Send_Effect(EFFECT_TELEPORT, w_shotorg, '0 0 0', 1);
actor.(weaponentity).state = WS_INUSE;
weapon_thinkf(actor, weaponentity, WFRAME_RELOAD, 0.5, w_ready);
#ifdef SVQC
// infinite ammo
-METHOD(Tuba, wr_checkammo1, bool(Tuba this)) { return true; }
-METHOD(Tuba, wr_checkammo2, bool(Tuba this)) { return true; }
+METHOD(Tuba, wr_checkammo1, bool(Tuba this, entity actor)) { return true; }
+METHOD(Tuba, wr_checkammo2, bool(Tuba this, entity actor)) { return true; }
METHOD(Tuba, wr_suicidemessage, Notification(Tuba this))
{
return WEAPON_TUBA_MURDER;
}
+#elif defined(CSQC)
+
+METHOD(Tuba, wr_viewmodel, string(Tuba this, entity wep))
+{
+ return (wep.tuba_instrument == 0) ? "tuba" :
+ (wep.tuba_instrument == 1) ? "akordeon" :
+ "kleinbottle";
+}
+
#endif
#ifdef CSQC
const int TUBA_MAX = 27;
const int TUBA_INSTRUMENTS = 3;
-entityclass(Tuba);
-class(Tuba) .int note;
-class(Tuba) .bool tuba_attenuate;
-class(Tuba) .float tuba_volume;
-class(Tuba) .float tuba_volume_initial;
-class(Tuba) .int tuba_instrument;
-
int Tuba_PitchStep;
void tubasound(entity e, bool restart)
}
}
-void Ent_TubaNote_Think()
-{SELFPARAM();
+void Ent_TubaNote_Think(entity this)
+{
float f = autocvar_g_balance_tuba_fadetime;
if (f > 0) {
this.tuba_volume -= frametime * this.tuba_volume_initial / f;
sound(this, CH_TUBA_SINGLE, SND_Null, 0, 0);
if (this.enemy) {
sound(this.enemy, CH_TUBA_SINGLE, SND_Null, 0, 0);
- remove(this.enemy);
+ delete(this.enemy);
}
- remove(this);
+ delete(this);
} else {
tubasound(this, 0);
}
this.enemy = NULL;
}
-void Ent_TubaNote_StopSound_self() { Ent_TubaNote_StopSound(self); }
-
NET_HANDLE(ENT_CLIENT_TUBANOTE, bool isNew)
{
bool upd = false;
}
}
- this.think = Ent_TubaNote_StopSound_self;
+ setthink(this, Ent_TubaNote_StopSound);
this.entremove = Ent_TubaNote_StopSound;
- this.enemy.think = Ent_TubaNote_Think;
+ setthink(this.enemy, Ent_TubaNote_Think);
this.enemy.nextthink = time + 10;
if (upd) {
Tuba_PitchStep = autocvar_g_balance_tuba_pitchstep;
if (Tuba_PitchStep) {
if (!checkextension("DP_SND_SOUND7_WIP2") && !checkextension("DP_SND_SOUND7")) {
- LOG_WARNING("requested pitch shifting, but not supported by this engine build");
+ LOG_WARN("requested pitch shifting, but not supported by this engine build");
Tuba_PitchStep = 0;
}
}