]> git.rm.cloudns.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Add vehicle and turret spawning features, WARNING: EXPERIMENTAL ONLY
authorLegendaryGuard <rootuser999@gmail.com>
Wed, 30 Jun 2021 21:19:58 +0000 (23:19 +0200)
committerLegendaryGuard <rootuser999@gmail.com>
Wed, 30 Jun 2021 21:19:58 +0000 (23:19 +0200)
qcsrc/common/mutators/mutator/nades/nades.qc
qcsrc/common/mutators/mutator/nades/nades.qh

index e35a5c6181e3004e02810575d560814fbd087a64..acf91bfcdd424781c0ff06ecb6dfb75fd6543430 100644 (file)
@@ -174,6 +174,10 @@ void DrawAmmoNades(vector myPos, vector mySize, bool draw_expanding, float expan
 #include <common/gamemodes/_mod.qh>
 #include <common/monsters/sv_spawn.qh>
 #include <common/monsters/sv_monsters.qh>
+//LegendGuard adds include for spawning vehicles 20-06-2021
+#include <common/vehicles/all.qh>
+//LegendGuard adds include for spawning turrets 22-06-2021
+#include <common/turrets/all.qh>
 
 .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);
+               }
+       }
 }
 
 /***********************************************************************************/
index 322ca38aba786431507b9edb44d605979c975526..cae1509eb4a255340158f772cae1d69af35ac664 100644 (file)
@@ -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);