X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fmutators%2Fgamemode_nexball.qc;h=5d034870e67a0418c9814d3d18ca3158f07b2d85;hp=e3e7b67dee894e5eb25831cefe6cb9b036ac5b8c;hb=be91ef701b96453388cdcfb40f561281076ef52d;hpb=6143f483810ae1e181fc53b77cca98e6603be2d1 diff --git a/qcsrc/server/mutators/gamemode_nexball.qc b/qcsrc/server/mutators/gamemode_nexball.qc index e3e7b67de..5d034870e 100644 --- a/qcsrc/server/mutators/gamemode_nexball.qc +++ b/qcsrc/server/mutators/gamemode_nexball.qc @@ -3,6 +3,21 @@ #include "gamemode.qh" +float autocvar_g_nexball_basketball_bouncefactor; +float autocvar_g_nexball_basketball_bouncestop; +float autocvar_g_nexball_basketball_carrier_highspeed; +bool autocvar_g_nexball_basketball_meter; +float autocvar_g_nexball_basketball_meter_maxpower; +float autocvar_g_nexball_basketball_meter_minpower; +float autocvar_g_nexball_delay_collect; +float autocvar_g_nexball_delay_goal; +float autocvar_g_nexball_delay_start; +float autocvar_g_nexball_football_bouncefactor; +float autocvar_g_nexball_football_bouncestop; +bool autocvar_g_nexball_radar_showallplayers; +bool autocvar_g_nexball_sound_bounce; +int autocvar_g_nexball_trail_color; + float autocvar_g_nexball_safepass_turnrate; float autocvar_g_nexball_safepass_maxdist; float autocvar_g_nexball_safepass_holdtime; @@ -51,26 +66,24 @@ void LogNB(string mode, entity actor) } void ball_restart(void) -{ +{SELFPARAM(); if(self.owner) DropBall(self, self.owner.origin, '0 0 0'); ResetBall(); } void nexball_setstatus(void) -{ - entity oldself; +{SELFPARAM(); self.items &= ~IT_KEY1; if(self.ballcarried) { if(self.ballcarried.teamtime && (self.ballcarried.teamtime < time)) { bprint("The ", Team_ColoredFullName(self.team), " held the ball for too long.\n"); - oldself = self; - self = self.ballcarried; + setself(self.ballcarried); DropBall(self, self.owner.origin, '0 0 0'); ResetBall(); - self = oldself; + setself(this); } else self.items |= IT_KEY1; @@ -78,7 +91,7 @@ void nexball_setstatus(void) } void relocate_nexball(void) -{ +{SELFPARAM(); tracebox(self.origin, BALL_MINS, BALL_MAXS, self.origin, true, self); if(trace_startsolid) { @@ -86,16 +99,16 @@ void relocate_nexball(void) o = self.origin; if(!move_out_of_solid(self)) objerror("could not get out of solid at all!"); - print("^1NOTE: this map needs FIXING. ", self.classname, " at ", vtos(o - '0 0 1')); - print(" needs to be moved out of solid, e.g. by '", ftos(self.origin.x - o.x)); - print(" ", ftos(self.origin.y - o.y)); - print(" ", ftos(self.origin.z - o.z), "'\n"); + LOG_INFO("^1NOTE: this map needs FIXING. ", self.classname, " at ", vtos(o - '0 0 1')); + LOG_INFO(" needs to be moved out of solid, e.g. by '", ftos(self.origin.x - o.x)); + LOG_INFO(" ", ftos(self.origin.y - o.y)); + LOG_INFO(" ", ftos(self.origin.z - o.z), "'\n"); self.origin = o; } } void DropOwner(void) -{ +{SELFPARAM(); entity ownr; ownr = self.owner; DropBall(self, ownr.origin, ownr.velocity); @@ -105,7 +118,7 @@ void DropOwner(void) } void GiveBall(entity plyr, entity ball) -{ +{SELFPARAM(); entity ownr; if((ownr = ball.owner)) @@ -144,7 +157,7 @@ void GiveBall(entity plyr, entity ball) ball.effects |= EF_NOSHADOW; ball.scale = 1; // scale down. - WaypointSprite_AttachCarrier("nb-ball", plyr, RADARICON_FLAGCARRIER, BALL_SPRITECOLOR); + WaypointSprite_AttachCarrier(WP_NbBall, plyr, RADARICON_FLAGCARRIER); WaypointSprite_UpdateRule(plyr.waypointsprite_attachedforcarrier, 0, SPRITERULE_DEFAULT); if(autocvar_g_nexball_basketball_delay_hold) @@ -153,15 +166,15 @@ void GiveBall(entity plyr, entity ball) ball.nextthink = time + autocvar_g_nexball_basketball_delay_hold; } - ownr = self; - self = plyr; - self.weaponentity.weapons = self.weapons; - self.weaponentity.switchweapon = self.weapon; - self.weapons = WEPSET_PORTO; - WEP_ACTION(WEP_PORTO, WR_RESETPLAYER); - self.switchweapon = WEP_PORTO; - W_SwitchWeapon(WEP_PORTO); - self = ownr; + plyr.weaponentity.weapons = plyr.weapons; + plyr.weaponentity.switchweapon = plyr.weapon; + plyr.weapons = WEPSET_NEXBALL; + setself(plyr); + Weapon w = WEP_NEXBALL; + w.wr_resetplayer(w); + plyr.switchweapon = WEP_NEXBALL.m_id; + W_SwitchWeapon(WEP_NEXBALL.m_id); + setself(this); } void DropBall(entity ball, vector org, vector vel) @@ -188,7 +201,7 @@ void DropBall(entity ball, vector org, vector vel) } WaypointSprite_Kill(ball.owner.waypointsprite_attachedforcarrier); - WaypointSprite_Spawn("nb-ball", 0, 0, ball, '0 0 64', world, ball.team, ball, waypointsprite_attachedforcarrier, false, RADARICON_FLAGCARRIER, BALL_SPRITECOLOR); // no health bar please + WaypointSprite_Spawn(WP_NbBall, 0, 0, ball, '0 0 64', world, ball.team, ball, waypointsprite_attachedforcarrier, false, RADARICON_FLAGCARRIER); // no health bar please WaypointSprite_UpdateRule(ball.waypointsprite_attachedforcarrier, 0, SPRITERULE_DEFAULT); ball.owner.ballcarried = world; @@ -196,7 +209,7 @@ void DropBall(entity ball, vector org, vector vel) } void InitBall(void) -{ +{SELFPARAM(); if(gameover) return; self.flags &= ~FL_ONGROUND; self.movetype = MOVETYPE_BOUNCE; @@ -210,13 +223,13 @@ void InitBall(void) self.teamtime = 0; self.pusher = world; self.team = false; - sound(self, CH_TRIGGER, self.noise1, VOL_BASE, ATTEN_NORM); + _sound(self, CH_TRIGGER, self.noise1, VOL_BASE, ATTEN_NORM); WaypointSprite_Ping(self.waypointsprite_attachedforcarrier); LogNB("init", world); } void ResetBall(void) -{ +{SELFPARAM(); if(self.cnt < 2) // step 1 { if(time == self.teamtime) @@ -241,7 +254,7 @@ void ResetBall(void) { // dprint("Step 4: time: ", ftos(time), "\n"); if(vlen(self.origin - self.spawnorigin) > 10) // should not happen anymore - dprint("The ball moved too far away from its spawn origin.\nOffset: ", + LOG_TRACE("The ball moved too far away from its spawn origin.\nOffset: ", vtos(self.origin - self.spawnorigin), " Velocity: ", vtos(self.velocity), "\n"); self.velocity = '0 0 0'; setorigin(self, self.spawnorigin); // make sure it's positioned correctly anyway @@ -252,12 +265,12 @@ void ResetBall(void) } void football_touch(void) -{ +{SELFPARAM(); if(other.solid == SOLID_BSP) { if(time > self.lastground + 0.1) { - sound(self, CH_TRIGGER, self.noise, VOL_BASE, ATTEN_NORM); + _sound(self, CH_TRIGGER, self.noise, VOL_BASE, ATTEN_NORM); self.lastground = time; } if(vlen(self.velocity) && !self.cnt) @@ -298,7 +311,7 @@ void football_touch(void) } void basketball_touch(void) -{ +{SELFPARAM(); if(other.ballcarried) { football_touch(); @@ -313,14 +326,14 @@ void basketball_touch(void) } else if(other.solid == SOLID_BSP) { - sound(self, CH_TRIGGER, self.noise, VOL_BASE, ATTEN_NORM); + _sound(self, CH_TRIGGER, self.noise, VOL_BASE, ATTEN_NORM); if(vlen(self.velocity) && !self.cnt) self.nextthink = min(time + autocvar_g_nexball_delay_idle, self.teamtime); } } void GoalTouch(void) -{ +{SELFPARAM(); entity ball; float isclient, pscore, otherteam; string pname; @@ -379,7 +392,7 @@ void GoalTouch(void) pscore = 1; } - sound(ball, CH_TRIGGER, self.noise, VOL_BASE, ATTEN_NONE); + _sound(ball, CH_TRIGGER, self.noise, VOL_BASE, ATTEN_NONE); if(ball.team && pscore) { @@ -412,7 +425,7 @@ void GoalTouch(void) // team ents // //=======================// void spawnfunc_nexball_team(void) -{ +{SELFPARAM(); if(!g_nexball) { remove(self); @@ -423,7 +436,7 @@ void spawnfunc_nexball_team(void) void nb_spawnteam(string teamname, float teamcolor) { - dprint("^2spawned team ", teamname, "\n"); + LOG_TRACE("^2spawned team ", teamname, "\n"); entity e; e = spawn(); e.classname = "nexball_team"; @@ -486,7 +499,7 @@ void nb_delayedinit(void) //=======================// void SpawnBall(void) -{ +{SELFPARAM(); if(!g_nexball) { remove(self); return; } // balls += 4; // using the remaining bits to count balls will leave more than the max edict count, so it's fine @@ -498,7 +511,7 @@ void SpawnBall(void) } precache_model(self.model); - setmodel(self, self.model); + _setmodel(self, self.model); setsize(self, BALL_MINS, BALL_MAXS); ball_scale = self.scale; @@ -518,19 +531,19 @@ void SpawnBall(void) if(!autocvar_g_nexball_sound_bounce) self.noise = ""; else if(self.noise == "") - self.noise = "sound/nexball/bounce.wav"; + self.noise = SND(NB_BOUNCE); //bounce sound placeholder (FIXME) if(self.noise1 == "") - self.noise1 = "sound/nexball/drop.wav"; + self.noise1 = SND(NB_DROP); //ball drop sound placeholder (FIXME) if(self.noise2 == "") - self.noise2 = "sound/nexball/steal.wav"; + self.noise2 = SND(NB_STEAL); //stealing sound placeholder (FIXME) if(self.noise) precache_sound(self.noise); precache_sound(self.noise1); precache_sound(self.noise2); - WaypointSprite_AttachCarrier("nb-ball", self, RADARICON_FLAGCARRIER, BALL_SPRITECOLOR); // the ball's team is not set yet, no rule update needed + WaypointSprite_AttachCarrier(WP_NbBall, self, RADARICON_FLAGCARRIER); // the ball's team is not set yet, no rule update needed self.reset = ball_restart; self.think = InitBall; @@ -538,7 +551,7 @@ void SpawnBall(void) } void spawnfunc_nexball_basketball(void) -{ +{SELFPARAM(); nexball_mode |= NBM_BASKETBALL; self.classname = "nexball_basketball"; if (!(balls & BALL_BASKET)) @@ -561,7 +574,7 @@ void spawnfunc_nexball_basketball(void) } void spawnfunc_nexball_football(void) -{ +{SELFPARAM(); nexball_mode |= NBM_FOOTBALL; self.classname = "nexball_football"; self.solid = SOLID_TRIGGER; @@ -572,7 +585,7 @@ void spawnfunc_nexball_football(void) } float nb_Goal_Customize() -{ +{SELFPARAM(); entity e, wp_owner; e = WaypointSprite_getviewentity(other); wp_owner = self.owner; @@ -582,14 +595,15 @@ float nb_Goal_Customize() } void SpawnGoal(void) -{ +{SELFPARAM(); if(!g_nexball) { remove(self); return; } EXACTTRIGGER_INIT; if(self.team != GOAL_OUT && Team_TeamToNumber(self.team) != -1) { - WaypointSprite_SpawnFixed("goal", (self.absmin + self.absmax) * 0.5, self, sprite, RADARICON_NONE, ((self.team) ? Team_ColorRGB(self.team) : '1 0.5 0')); + entity wp = WaypointSprite_SpawnFixed(WP_NbGoal, (self.absmin + self.absmax) * 0.5, self, sprite, RADARICON_NONE); + wp.colormod = ((self.team) ? Team_ColorRGB(self.team) : '1 0.5 0'); self.sprite.customizeentityforclient = nb_Goal_Customize; } @@ -601,39 +615,39 @@ void SpawnGoal(void) } void spawnfunc_nexball_redgoal(void) -{ +{SELFPARAM(); self.team = NUM_TEAM_1; SpawnGoal(); } void spawnfunc_nexball_bluegoal(void) -{ +{SELFPARAM(); self.team = NUM_TEAM_2; SpawnGoal(); } void spawnfunc_nexball_yellowgoal(void) -{ +{SELFPARAM(); self.team = NUM_TEAM_3; SpawnGoal(); } void spawnfunc_nexball_pinkgoal(void) -{ +{SELFPARAM(); self.team = NUM_TEAM_4; SpawnGoal(); } void spawnfunc_nexball_fault(void) -{ +{SELFPARAM(); self.team = GOAL_FAULT; if(self.noise == "") - self.noise = "misc/typehit.wav"; + self.noise = SND(TYPEHIT); SpawnGoal(); } void spawnfunc_nexball_out(void) -{ +{SELFPARAM(); self.team = GOAL_OUT; if(self.noise == "") - self.noise = "misc/typehit.wav"; + self.noise = SND(TYPEHIT); SpawnGoal(); } @@ -677,7 +691,7 @@ void spawnfunc_ball_bound(void) void W_Nexball_Think() -{ +{SELFPARAM(); //dprint("W_Nexball_Think\n"); //vector new_dir = steerlib_arrive(self.enemy.origin, 2500); vector new_dir = normalize(self.enemy.origin + '0 0 50' - self.origin); @@ -692,7 +706,7 @@ void W_Nexball_Think() } void W_Nexball_Touch(void) -{ +{SELFPARAM(); entity ball, attacker; attacker = self.owner; //self.think = func_null; @@ -707,7 +721,7 @@ void W_Nexball_Touch(void) if(!attacker.ballcarried) { LogNB("stole", attacker); - sound(other, CH_TRIGGER, ball.noise2, VOL_BASE, ATTEN_NORM); + _sound(other, CH_TRIGGER, ball.noise2, VOL_BASE, ATTEN_NORM); if(SAME_TEAM(attacker, other) && time > attacker.teamkill_complain) { @@ -723,13 +737,13 @@ void W_Nexball_Touch(void) } void W_Nexball_Attack(float t) -{ +{SELFPARAM(); entity ball; float mul, mi, ma; if(!(ball = self.ballcarried)) return; - W_SetupShot(self, false, 4, "nexball/shoot1.wav", CH_WEAPON_A, 0); + W_SetupShot(self, false, 4, SND(NB_SHOOT1), CH_WEAPON_A, 0); tracebox(w_shotorg, BALL_MINS, BALL_MAXS, w_shotorg, MOVE_WORLDONLY, world); if(trace_startsolid) { @@ -759,11 +773,11 @@ void W_Nexball_Attack(float t) } void W_Nexball_Attack2(void) -{ +{SELFPARAM(); if(self.ballcarried.enemy) { entity _ball = self.ballcarried; - W_SetupShot(self, false, 4, "nexball/shoot1.wav", CH_WEAPON_A, 0); + W_SetupShot(self, false, 4, SND(NB_SHOOT1), CH_WEAPON_A, 0); DropBall(_ball, w_shotorg, trigger_push_calculatevelocity(_ball.origin, _ball.enemy, 32)); _ball.think = W_Nexball_Think; _ball.nextthink = time; @@ -776,8 +790,7 @@ void W_Nexball_Attack2(void) entity missile; if(!(balls & BALL_BASKET)) return; - W_SetupShot(self, false, 2, "nexball/shoot2.wav", CH_WEAPON_A, 0); -// Send_Effect("grenadelauncher_muzzleflash", w_shotorg, w_shotdir * 1000, 1); + W_SetupShot(self, false, 2, SND(NB_SHOOT2), CH_WEAPON_A, 0); missile = spawn(); missile.owner = self; @@ -803,7 +816,7 @@ void W_Nexball_Attack2(void) } float ball_customize() -{ +{SELFPARAM(); if(!self.owner) { self.effects &= ~EF_FLAME; @@ -829,12 +842,10 @@ float ball_customize() return true; } -float w_nexball_weapon(float req) -{ - if(req == WR_THINK) + METHOD(BallStealer, wr_think, void(BallStealer thiswep, bool fire1, bool fire2)) { - if(self.BUTTON_ATCK) - if(weapon_prepareattack(0, autocvar_g_balance_nexball_primary_refire)) + if(fire1) + if(weapon_prepareattack(false, autocvar_g_balance_nexball_primary_refire)) if(autocvar_g_nexball_basketball_meter) { if(self.ballcarried && !self.metertime) @@ -847,40 +858,35 @@ float w_nexball_weapon(float req) W_Nexball_Attack(-1); weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_nexball_primary_animtime, w_ready); } - if(self.BUTTON_ATCK2) - if(weapon_prepareattack(1, autocvar_g_balance_nexball_secondary_refire)) + if(fire2) + if(weapon_prepareattack(true, autocvar_g_balance_nexball_secondary_refire)) { W_Nexball_Attack2(); weapon_thinkf(WFRAME_FIRE2, autocvar_g_balance_nexball_secondary_animtime, w_ready); } - if(!self.BUTTON_ATCK && self.metertime && self.ballcarried) + if(!fire1 && self.metertime && self.ballcarried) { W_Nexball_Attack(time - self.metertime); // DropBall or stealing will set metertime back to 0 weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_nexball_primary_animtime, w_ready); } } - else if(req == WR_INIT) + METHOD(BallStealer, wr_setup, void(BallStealer thiswep)) { - precache_model("models/weapons/g_porto.md3"); - precache_model("models/weapons/v_porto.md3"); - precache_model("models/weapons/h_porto.iqm"); - precache_model("models/elaser.mdl"); - precache_sound("nexball/shoot1.wav"); - precache_sound("nexball/shoot2.wav"); - precache_sound("misc/typehit.wav"); + //weapon_setup(WEP_PORTO.m_id); } - else if(req == WR_SETUP) + METHOD(BallStealer, wr_checkammo1, bool(BallStealer thiswep)) { - //weapon_setup(WEP_PORTO); + return true; + } + METHOD(BallStealer, wr_checkammo2, bool(BallStealer thiswep)) + { + return true; } - // No need to check WR_CHECKAMMO* or WR_AIM, it should always return true - return true; -} MUTATOR_HOOKFUNCTION(nexball_BallDrop) -{ +{SELFPARAM(); if(self.ballcarried && g_nexball) DropBall(self.ballcarried, self.origin, self.velocity); @@ -888,7 +894,7 @@ MUTATOR_HOOKFUNCTION(nexball_BallDrop) } MUTATOR_HOOKFUNCTION(nexball_PlayerPreThink) -{ +{SELFPARAM(); makevectors(self.v_angle); if(nexball_mode & NBM_BASKETBALL) { @@ -936,7 +942,8 @@ MUTATOR_HOOKFUNCTION(nexball_PlayerPreThink) if(self.weaponentity.weapons) { self.weapons = self.weaponentity.weapons; - WEP_ACTION(WEP_PORTO, WR_RESETPLAYER); + Weapon w = WEP_NEXBALL; + w.wr_resetplayer(w); self.switchweapon = self.weaponentity.switchweapon; W_SwitchWeapon(self.switchweapon); @@ -952,11 +959,11 @@ MUTATOR_HOOKFUNCTION(nexball_PlayerPreThink) } MUTATOR_HOOKFUNCTION(nexball_PlayerSpawn) -{ +{SELFPARAM(); self.weaponentity.weapons = '0 0 0'; if(nexball_mode & NBM_BASKETBALL) - self.weapons |= WEPSET_PORTO; + self.weapons |= WEPSET_NEXBALL; else self.weapons = '0 0 0'; @@ -964,7 +971,7 @@ MUTATOR_HOOKFUNCTION(nexball_PlayerSpawn) } MUTATOR_HOOKFUNCTION(nexball_PlayerPhysics) -{ +{SELFPARAM(); if(self.ballcarried) { self.stat_sv_airspeedlimit_nonqw *= autocvar_g_nexball_basketball_carrier_highspeed; @@ -973,25 +980,18 @@ MUTATOR_HOOKFUNCTION(nexball_PlayerPhysics) return false; } -MUTATOR_HOOKFUNCTION(nexball_SetStartItems) -{ - start_items |= IT_UNLIMITED_SUPERWEAPONS; // FIXME BAD BAD BAD BAD HACK, NEXBALL SHOULDN'T ABUSE PORTO'S WEAPON SLOT - - return false; -} - MUTATOR_HOOKFUNCTION(nexball_ForbidThrowing) -{ - if(self.weapon == WEP_MORTAR) +{SELFPARAM(); + if(self.weapon == WEP_MORTAR.m_id) return true; return false; } MUTATOR_HOOKFUNCTION(nexball_FilterItem) -{ +{SELFPARAM(); if(self.classname == "droppedweapon") - if(self.weapon == WEP_MORTAR) + if(self.weapon == WEP_MORTAR.m_id) return true; return false; @@ -1005,7 +1005,6 @@ MUTATOR_DEFINITION(gamemode_nexball) MUTATOR_HOOK(PlayerSpawn, nexball_PlayerSpawn, CBC_ORDER_ANY); MUTATOR_HOOK(PlayerPreThink, nexball_PlayerPreThink, CBC_ORDER_ANY); MUTATOR_HOOK(PlayerPhysics, nexball_PlayerPhysics, CBC_ORDER_ANY); - MUTATOR_HOOK(SetStartItems, nexball_SetStartItems, CBC_ORDER_ANY); MUTATOR_HOOK(ForbidThrowCurrentWeapon, nexball_ForbidThrowing, CBC_ORDER_ANY); MUTATOR_HOOK(FilterItem, nexball_FilterItem, CBC_ORDER_ANY); @@ -1038,7 +1037,7 @@ MUTATOR_DEFINITION(gamemode_nexball) MUTATOR_ONREMOVE { - print("This is a game type and it cannot be removed at runtime."); + LOG_INFO("This is a game type and it cannot be removed at runtime."); return -1; }