From: LegendaryGuard Date: Wed, 30 Jun 2021 21:19:58 +0000 (+0200) Subject: Add vehicle and turret spawning features, WARNING: EXPERIMENTAL ONLY X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=c19e788805182436741c8e5c33a33ab9a311e0c7;p=xonotic%2Fxonotic-data.pk3dir.git Add vehicle and turret spawning features, WARNING: EXPERIMENTAL ONLY --- diff --git a/qcsrc/common/mutators/mutator/nades/nades.qc b/qcsrc/common/mutators/mutator/nades/nades.qc index e35a5c618..acf91bfcd 100644 --- a/qcsrc/common/mutators/mutator/nades/nades.qc +++ b/qcsrc/common/mutators/mutator/nades/nades.qc @@ -174,6 +174,10 @@ void DrawAmmoNades(vector myPos, vector mySize, bool draw_expanding, float expan #include #include #include +//LegendGuard adds include for spawning vehicles 20-06-2021 +#include +//LegendGuard adds include for spawning turrets 22-06-2021 +#include .float nade_time_primed; .float nade_lifetime; @@ -625,7 +629,7 @@ void nade_heal_touch(entity this, entity toucher) { float maxhealth; float health_factor; - if(IS_PLAYER(toucher) || IS_MONSTER(toucher)) + if(IS_PLAYER(toucher) || IS_MONSTER(toucher) || IS_VEHICLE(toucher)) if(!IS_DEAD(toucher)) if(!STAT(FROZEN, toucher)) { @@ -768,6 +772,105 @@ void nade_emerald_randomweapons(entity e, vector org) return; } +//LegendGuard adds vehicle spawn option for emerald nade 20-06-2021 +void nade_emerald_SpawnVehicle(entity ent, vector org, entity veh) +{ + ent.noalign = true; // don't drop to floor + ent.angles = '0 0 0'; + ent.gravity = 1; + setorigin(ent, org); + ent.velocity = randomvec() * 150 + '0 0 325'; + ent.spawnfunc_checked = true; + time = 0.5; + vehicle_initialize(ent, veh, 1); +} + +//LegendGuard adds random vehicle spawn selection function for emerald nade 20-06-2021 +void nade_emerald_randomvehicles(entity e, vector org) +{ + RandomSelection_Init(); + FOREACH(Vehicles, it != VEH_Null && (!((it.spawnflags & VHF_MULTISLOT))), + { + if(it.spawnflags & VHF_MULTISLOT) + continue; + float chanceveh = 1; + if(it.spawnflags & VHF_MOVE_FLY) + chanceveh = 0; + RandomSelection_AddEnt(it, chanceveh, 1); + }); + nade_emerald_SpawnVehicle(e, org, RandomSelection_chosen_ent); +} + +//LegendGuard adds turret spawn option for emerald nade 22-06-2021 +//EXPERIMENTAL +//TODO: turrets must be spawned by owner team, cannot be spawned to attack owner team or both +void nade_emerald_SpawnTurret(entity ent, vector org, entity tur) +{ + FOREACH_CLIENT(IS_PLAYER(it), + { + if (it.spawned != false) + { + if (it.turspawncount < autocvar_g_nades_emerald_turretspawnlimit) + { + //ent = spawn(); + ent.owner = it.owner; + ent.realowner = it.realowner; + ent.team = it.team; + ent.noalign = true; // don't drop to floor + //ent.angles = '0 0 0'; + ent.gravity = 1; + //try this if turret_aim_generic where IS_GROUND doesn't work: + tur.gravity = 1; + setorigin(ent, org); + //ent.velocity = randomvec() * 150 + '0 0 325'; + ent.spawnfunc_checked = true; + ent.solid = SOLID_CORPSE; + //setthink(ent, turrets_respawn); + // fading handled globally + //bool turret_initialize(entity this, Turret tur) + turret_initialize(ent, tur); + it.turspawncount++; + PrintToChatAll(sprintf("^1AFTER^7 it.turspawncount: ^3%f", it.turspawncount)); + //if (!IS_ONGROUND(ent)) + // ent.gravity = 1; setorigin(ent, org); + it.spawned = false; + } + else + { + it.spawned = false; + centerprint(it, strcat(BOLD_OPERATOR, "^1You cannot spawn more turrets!")); + } + PrintToChatAll(sprintf("^4tur- ^2it.netname: %s", it.netname)); + PrintToChatAll(sprintf("^4tur- ^1tur.classname: %s", tur.classname)); + } + return; + }); +} + +//LegendGuard adds random turret spawn function for emerald nade 22-06-2021 +//EXPERIMENTAL +void nade_emerald_randomturrets(entity e, vector org) +{ + /*//taken from: qcsrc/common/turrets/turret.qh + const int TSF_SUSPENDED = 1; + const int TSF_TERRAINBASE = 2; // currently unused + const int TSF_NO_AMMO_REGEN = 4; // disable builtin ammo regeneration + const int TSF_NO_PATHBREAK = 8; // don't break path to chase enemies, will still fire at them if possible + const int TSL_NO_RESPAWN = 16; // don't re-spawn + const int TSL_ROAM = 32; // roam while idle*/ + RandomSelection_Init(); + FOREACH(Turrets, it != TUR_Null && (!((it.spawnflags & TSF_SUSPENDED))), + { + if(it.spawnflags & TSF_SUSPENDED) + continue; + float chancetur = 1; + if(it.spawnflags & TSF_NO_PATHBREAK) + chancetur = 0; + RandomSelection_AddEnt(it, chancetur, 1); + }); + nade_emerald_SpawnTurret(e, org, RandomSelection_chosen_ent); +} + void nade_emerald_randomitem(entity e, vector org) { float a = random(); @@ -842,31 +945,27 @@ void nade_emerald_dropping(vector org) //ITEM_Shells; ITEM_Bullets; ITEM_Rockets; ITEM_Cells; ITEM_Plasma; ITEM_JetpackFuel; //ITEM_Strength; ITEM_Shield; int itemcount = autocvar_g_nades_emerald_spawncount; - for(int j = 0; j < itemcount; ++j) + entity e = spawn(); + e.spawnfunc_checked = true; + if(!IS_GAMETYPE(CA)) { - entity e = spawn(); - e.spawnfunc_checked = true; - - if(!IS_GAMETYPE(CA)) + //int cvar which manages the ONLY dropping per each type of item 14-03-2021 + switch (autocvar_g_nades_emerald_dropitemselect) { - //int cvar which manages the ONLY dropping per each type of item 14-03-2021 - switch (autocvar_g_nades_emerald_dropitemselect) - { - case 0: nade_emerald_randomitem(e, org); return; - case 1: nade_emerald_dropitem(e, org, ITEM_HealthSmall); return; - case 2: nade_emerald_dropitem(e, org, ITEM_ArmorSmall); return; - case 3: nade_emerald_allammoitemdrop(e, org); return; - case 4: nade_emerald_dropitem(e, org, ITEM_Shells); return; - case 5: nade_emerald_dropitem(e, org, ITEM_Bullets); return; - case 6: nade_emerald_dropitem(e, org, ITEM_Rockets); return; - case 7: nade_emerald_dropitem(e, org, ITEM_Cells); return; - case 8: nade_emerald_dropitem(e, org, ITEM_Jetpack); return; - case 9: nade_emerald_dropitem(e, org, ITEM_JetpackFuel); return; - case 10: nade_emerald_dropitem(e, org, ITEM_Shield); return; - case 11: nade_emerald_dropitem(e, org, ITEM_Strength); return; - case 12: nade_emerald_randomweapons(e, org); return; - default: nade_emerald_randomitem(e, org); return; - } + case 0: for(int j = 0; j < itemcount; ++j){ nade_emerald_randomitem(e, org); return;} + case 1: for(int j = 0; j < itemcount; ++j){ nade_emerald_dropitem(e, org, ITEM_HealthSmall); return;} + case 2: for(int j = 0; j < itemcount; ++j){ nade_emerald_dropitem(e, org, ITEM_ArmorSmall); return;} + case 3: for(int j = 0; j < itemcount; ++j){ nade_emerald_allammoitemdrop(e, org); return;} + case 4: for(int j = 0; j < itemcount; ++j){ nade_emerald_dropitem(e, org, ITEM_Shells); return;} + case 5: for(int j = 0; j < itemcount; ++j){ nade_emerald_dropitem(e, org, ITEM_Bullets); return;} + case 6: for(int j = 0; j < itemcount; ++j){ nade_emerald_dropitem(e, org, ITEM_Rockets); return;} + case 7: for(int j = 0; j < itemcount; ++j){ nade_emerald_dropitem(e, org, ITEM_Cells); return;} + case 8: for(int j = 0; j < itemcount; ++j){ nade_emerald_dropitem(e, org, ITEM_Jetpack); return;} + case 9: for(int j = 0; j < itemcount; ++j){ nade_emerald_dropitem(e, org, ITEM_JetpackFuel); return;} + case 10: for(int j = 0; j < itemcount; ++j){ nade_emerald_dropitem(e, org, ITEM_Shield); return;} + case 11: for(int j = 0; j < itemcount; ++j){ nade_emerald_dropitem(e, org, ITEM_Strength); return;} + case 12: for(int j = 0; j < itemcount; ++j){ nade_emerald_randomweapons(e, org); return;} + default: for(int j = 0; j < itemcount; ++j){ nade_emerald_randomitem(e, org); return;} } } } @@ -936,7 +1035,6 @@ void nade_emerald_ball(entity this) //CSQCProjectile(proj, true, PROJECTILE_NAPALM_FIRE, true); } - void emerald_fountain_think(entity this) { if(round_handler_IsActive()) @@ -976,42 +1074,73 @@ void emerald_fountain_think(entity this) void nade_emerald_boom(entity this) { - for (int c = 0; c < autocvar_g_nades_emerald_ball_count; c++) - nade_emerald_ball(this); + entity e = spawn(); + bool spawnlimited = false; - entity fountain = new(nade_emerald_fountain); - fountain.owner = this.owner; - fountain.realowner = this.realowner; - fountain.origin = this.origin; - fountain.flags = FL_PROJECTILE; - IL_PUSH(g_projectiles, fountain); - IL_PUSH(g_bot_dodge, fountain); - setorigin(fountain, fountain.origin); - setthink(fountain, emerald_fountain_think); - fountain.nextthink = time; - fountain.ltime = time + autocvar_g_nades_emerald_fountain_lifetime; - fountain.pushltime = fountain.ltime; - fountain.team = this.team; - - //nade model maintaining - setmodel(fountain, MDL_PROJECTILE_GRENADE); - entity timer = new(nade_timer); - setmodel(timer, MDL_NADE_TIMER); - setattachment(timer, fountain, ""); - timer.colormap = this.colormap; - timer.glowmod = this.glowmod; - setthink(timer, nade_timer_think); - timer.nextthink = time; - timer.wait = fountain.ltime; - timer.owner = fountain; - timer.skin = 10; - - set_movetype(fountain, MOVETYPE_TOSS); - fountain.bot_dodge = true; - fountain.nade_special_time = time; - setsize(fountain, '-16 -16 -16', '16 16 16'); - CSQCProjectile(fountain, true, PROJECTILE_NADE_EMERALD_BURN, true); - nade_emerald_dropping(fountain.origin); + switch (autocvar_g_nades_emerald_itemselectvehtur) + { + case 1: + { + FOREACH_CLIENT(IS_PLAYER(it), + { + if (it.vehspawncount < autocvar_g_nades_emerald_vehiclespawnlimit) + { + spawnlimited = false; + //PrintToChatAll(sprintf("^2BEFORE^7 it.vehspawncount: ^3%f", it.vehspawncount)); + it.vehspawncount++; + //PrintToChatAll(sprintf("^1AFTER^7 it.vehspawncount: ^3%f", it.vehspawncount)); + } + else + spawnlimited = true; + }); + if(spawnlimited == true) + PrintToChatAll("^1Someone tried to spawn more vehicles than the maximum allowed! Sorry, cannot be spawned, spawn limit has been reached!"); + else + nade_emerald_randomvehicles(e, this.origin); + + return; + } + case 2: nade_emerald_randomturrets(e, this.origin); return; //EXPERIMENTAL + default: + { + for (int c = 0; c < autocvar_g_nades_emerald_ball_count; c++) + nade_emerald_ball(this); + + entity fountain = new(nade_emerald_fountain); + fountain.owner = this.owner; + fountain.realowner = this.realowner; + fountain.origin = this.origin; + fountain.flags = FL_PROJECTILE; + IL_PUSH(g_projectiles, fountain); + IL_PUSH(g_bot_dodge, fountain); + setorigin(fountain, fountain.origin); + setthink(fountain, emerald_fountain_think); + fountain.nextthink = time; + fountain.ltime = time + autocvar_g_nades_emerald_fountain_lifetime; + fountain.pushltime = fountain.ltime; + fountain.team = this.team; + + //nade model maintaining + setmodel(fountain, MDL_PROJECTILE_GRENADE); + entity timer = new(nade_timer); + setmodel(timer, MDL_NADE_TIMER); + setattachment(timer, fountain, ""); + timer.colormap = this.colormap; + timer.glowmod = this.glowmod; + setthink(timer, nade_timer_think); + timer.nextthink = time; + timer.wait = fountain.ltime; + timer.owner = fountain; + timer.skin = 10; + + set_movetype(fountain, MOVETYPE_TOSS); + fountain.bot_dodge = true; + fountain.nade_special_time = time; + setsize(fountain, '-16 -16 -16', '16 16 16'); + CSQCProjectile(fountain, true, PROJECTILE_NADE_EMERALD_BURN, true); + nade_emerald_dropping(fountain.origin); + } + } } /***********************************************************************************/ diff --git a/qcsrc/common/mutators/mutator/nades/nades.qh b/qcsrc/common/mutators/mutator/nades/nades.qh index 322ca38ab..cae1509eb 100644 --- a/qcsrc/common/mutators/mutator/nades/nades.qh +++ b/qcsrc/common/mutators/mutator/nades/nades.qh @@ -74,6 +74,9 @@ float autocvar_g_nades_emerald_ball_count = 3; float autocvar_g_nades_emerald_fountain_lifetime = 1; //if much time, fountain will remain bool autocvar_g_nades_emerald_powerupjetpack_randomdrop = 0; int autocvar_g_nades_emerald_dropitemselect = 0; //admin/user selects which item wants to drop in-game, if not will be random +int autocvar_g_nades_emerald_vehiclespawnlimit = 6; //LegendGuard adds new nade cvar of vehicle spawn count limit for the server 26-06-2021 +int autocvar_g_nades_emerald_turretspawnlimit = 2; // EXPERIMENTAL 26-06-2021 +int autocvar_g_nades_emerald_itemselectvehtur = 0; //cvar to select vehicles, turrets or random items, still EXPERIMENTAL float autocvar_g_nades_ammo_time = 5; //LegendGuard adds new nade cvars 13-02-2021 float autocvar_g_nades_ammo_rate = 30; float autocvar_g_nades_ammo_friend = 1; @@ -166,6 +169,9 @@ Nade Nade_FromProjectile(int proj) .float nade_show_particles; .float nade_veil_prevalpha; .float nade_dark_prevalpha; //LegendGuard adds new nade .variable 08-02-2021 +.int vehspawncount; //LegendGuard adds new .variable 22-06-2021 +.int turspawncount; //EXPERIMENTAL 26-06-2021 +.bool spawned; //EXPERIMENTAL 26-06-2021 bool orb_send(entity this, entity to, int sf);