Merged Lyberta/GivePlayerAmmo into Lyberta/RandomStartWeapons.
authorLyberta <lyberta@lyberta.net>
Sat, 26 Aug 2017 23:09:41 +0000 (02:09 +0300)
committerLyberta <lyberta@lyberta.net>
Sat, 26 Aug 2017 23:09:41 +0000 (02:09 +0300)
12 files changed:
balance-mario.cfg
balance-nexuiz25.cfg
balance-overkill.cfg
balance-samual.cfg
balance-xdf.cfg
balance-xonotic.cfg
balance-xpm.cfg
qcsrc/common/t_items.qc
qcsrc/common/t_items.qh
qcsrc/server/client.qc
qcsrc/server/miscfunctions.qc
qcsrc/server/miscfunctions.qh

index 42cf311..7961788 100644 (file)
@@ -9,6 +9,13 @@ set g_start_ammo_rockets 0
 set g_start_ammo_cells 0
 set g_start_ammo_plasma 0
 set g_start_ammo_fuel 0
+set g_random_start_weapons_count 0
+set g_random_start_weapons "machinegun mortar electro crylink vortex hagar devastator"
+set g_random_start_shells 15
+set g_random_start_bullets 80
+set g_random_start_rockets 40
+set g_random_start_cells 30
+set g_random_start_plasma 30
 set g_warmup_start_health 100 "starting values when being in warmup-stage"
 set g_warmup_start_armor 100 "starting values when being in warmup-stage"
 set g_warmup_start_ammo_shells 30 "starting values when being in warmup-stage"
index 4967fa7..37099c1 100644 (file)
@@ -9,6 +9,13 @@ set g_start_ammo_rockets 0
 set g_start_ammo_cells 0
 set g_start_ammo_plasma 0
 set g_start_ammo_fuel 0
+set g_random_start_weapons_count 0
+set g_random_start_weapons "machinegun mortar electro crylink vortex hagar devastator"
+set g_random_start_shells 15
+set g_random_start_bullets 80
+set g_random_start_rockets 15
+set g_random_start_cells 25
+set g_random_start_plasma 25
 set g_warmup_start_health 250 "starting values when being in warmup-stage"
 set g_warmup_start_armor 100 "starting values when being in warmup-stage"
 set g_warmup_start_ammo_shells 50 "starting values when being in warmup-stage"
index fc99616..e64a19e 100644 (file)
@@ -9,6 +9,13 @@ set g_start_ammo_rockets 0
 set g_start_ammo_cells 0
 set g_start_ammo_plasma 0
 set g_start_ammo_fuel 0
+set g_random_start_weapons_count 0
+set g_random_start_weapons "machinegun mortar electro crylink vortex hagar devastator"
+set g_random_start_shells 15
+set g_random_start_bullets 80
+set g_random_start_rockets 40
+set g_random_start_cells 30
+set g_random_start_plasma 30
 set g_warmup_start_health 100 "starting values when being in warmup-stage"
 set g_warmup_start_armor 100 "starting values when being in warmup-stage"
 set g_warmup_start_ammo_shells 30 "starting values when being in warmup-stage"
index 4357eff..4b579f0 100644 (file)
@@ -9,6 +9,13 @@ set g_start_ammo_rockets 0
 set g_start_ammo_cells 0
 set g_start_ammo_plasma 0
 set g_start_ammo_fuel 0
+set g_random_start_weapons_count 0
+set g_random_start_weapons "machinegun mortar electro crylink vortex hagar devastator"
+set g_random_start_shells 15
+set g_random_start_bullets 80
+set g_random_start_rockets 40
+set g_random_start_cells 30
+set g_random_start_plasma 30
 set g_warmup_start_health 100 "starting values when being in warmup-stage"
 set g_warmup_start_armor 100 "starting values when being in warmup-stage"
 set g_warmup_start_ammo_shells 30 "starting values when being in warmup-stage"
index a7d6b43..66a9240 100644 (file)
@@ -9,6 +9,13 @@ set g_start_ammo_rockets 0
 set g_start_ammo_cells 0
 set g_start_ammo_plasma 0
 set g_start_ammo_fuel 0
+set g_random_start_weapons_count 0
+set g_random_start_weapons "machinegun mortar electro crylink vortex hagar devastator"
+set g_random_start_shells 15
+set g_random_start_bullets 80
+set g_random_start_rockets 40
+set g_random_start_cells 30
+set g_random_start_plasma 30
 set g_warmup_start_health 100 "starting values when being in warmup-stage"
 set g_warmup_start_armor 100 "starting values when being in warmup-stage"
 set g_warmup_start_ammo_shells 30 "starting values when being in warmup-stage"
index 5bd1536..a1fd084 100644 (file)
@@ -9,6 +9,13 @@ set g_start_ammo_rockets 0
 set g_start_ammo_cells 0
 set g_start_ammo_plasma 0
 set g_start_ammo_fuel 0
+set g_random_start_weapons_count 0
+set g_random_start_weapons "machinegun mortar electro crylink vortex hagar devastator"
+set g_random_start_shells 15
+set g_random_start_bullets 80
+set g_random_start_rockets 40
+set g_random_start_cells 30
+set g_random_start_plasma 30
 set g_warmup_start_health 100 "starting values when being in warmup-stage"
 set g_warmup_start_armor 100 "starting values when being in warmup-stage"
 set g_warmup_start_ammo_shells 30 "starting values when being in warmup-stage"
index 5c14aa3..4b3cfb9 100644 (file)
@@ -9,6 +9,13 @@ set g_start_ammo_rockets 0
 set g_start_ammo_cells 0
 set g_start_ammo_plasma 0
 set g_start_ammo_fuel 0
+set g_random_start_weapons_count 0
+set g_random_start_weapons "machinegun mortar electro crylink vortex hagar devastator"
+set g_random_start_shells 15
+set g_random_start_bullets 80
+set g_random_start_rockets 40
+set g_random_start_cells 30
+set g_random_start_plasma 30
 set g_warmup_start_health 100 "starting values when being in warmup-stage"
 set g_warmup_start_armor 100 "starting values when being in warmup-stage"
 set g_warmup_start_ammo_shells 30 "starting values when being in warmup-stage"
index 6ee7c1d..7955250 100644 (file)
@@ -759,6 +759,87 @@ void GivePlayerFuel(entity player, float amount)
        GivePlayerResource(player, ammo_fuel, amount);
 }
 
+void GivePlayerRandomWeapons(entity player, int num_weapons,
+       string weapon_names, float shells, float bullets, float rockets,
+       float cells, float plasma)
+{
+       if (num_weapons == 0)
+       {
+               return;
+       }
+       int num_potential_weapons = tokenize_console(weapon_names);
+       for (int i = 0; i < num_weapons; ++i)
+       {
+               RandomSelection_Init();
+               for (int j = 0; j < num_potential_weapons; ++j)
+               {
+                       string weapon = argv(j);
+                       FOREACH(Weapons, it != WEP_Null,
+                       {
+                               // Finding a weapon which player doesn't have.
+                               if (!(player.weapons & it.m_wepset) && (it.netname == weapon))
+                               {
+                                       RandomSelection_AddEnt(it, 1, 1);
+                                       break;
+                               }
+                       });
+               }
+               if (RandomSelection_chosen_ent == NULL)
+               {
+                       return;
+               }
+               player.weapons |= RandomSelection_chosen_ent.m_wepset;
+               switch (RandomSelection_chosen_ent.ammo_field)
+               {
+                       case (ammo_shells):
+                       {
+                               if (player.ammo_shells != 0)
+                               {
+                                       break;
+                               }
+                               GivePlayerAmmo(player, ammo_shells, shells);
+                               break;
+                       }
+                       case (ammo_nails):
+                       {
+                               if (player.ammo_nails != 0)
+                               {
+                                       break;
+                               }
+                               GivePlayerAmmo(player, ammo_nails, bullets);
+                               break;
+                       }
+                       case (ammo_rockets):
+                       {
+                               if (player.ammo_rockets != 0)
+                               {
+                                       break;
+                               }
+                               GivePlayerAmmo(player, ammo_rockets, rockets);
+                               break;
+                       }
+                       case (ammo_cells):
+                       {
+                               if (player.ammo_cells != 0)
+                               {
+                                       break;
+                               }
+                               GivePlayerAmmo(player, ammo_cells, cells);
+                               break;
+                       }
+                       case (ammo_plasma):
+                       {
+                               if (player.ammo_plasma != 0)
+                               {
+                                       break;
+                               }
+                               GivePlayerAmmo(player, ammo_plasma, plasma);
+                               break;
+                       }
+               }
+       }
+}
+
 float Item_GiveAmmoTo(entity item, entity player, .float ammotype, float ammomax)
 {
        if (!item.(ammotype))
index 14cbd8e..af7d917 100644 (file)
@@ -121,6 +121,20 @@ void GivePlayerAmmo(entity player, .float ammotype, float amount);
 /// \return No return.
 void GivePlayerFuel(entity player, float amount);
 
+/// \brief Give several random weapons and ammo to the player.
+/// \param[in,out] player Player to give weapons to.
+/// \param[in] num_weapons Number of weapons to give.
+/// \param[in] weapon_names Names of weapons to give separated by spaces.
+/// \param[in] shells Amount of shells to give with shell-based weapon.
+/// \param[in] bullets Amount of bullets to give with bullet-based weapon.
+/// \param[in] rockets Amount of rockets to give with rocket-based weapon.
+/// \param[in] cells Amount of cells to give with cell-based weapon.
+/// \param[in] cells Amount of plasma to give with plasma-based weapon.
+/// \return No return.
+void GivePlayerRandomWeapons(entity player, int num_weapons,
+       string weapon_names, float shells, float bullets, float rockets,
+       float cells, float plasma);
+
 float Item_GiveAmmoTo(entity item, entity player, .float ammotype, float ammomax);
 
 float Item_GiveTo(entity item, entity player);
index 0c12e40..bb06092 100644 (file)
@@ -544,6 +544,10 @@ void PutPlayerInServer(entity this)
                this.health = start_health;
                this.armorvalue = start_armorvalue;
                this.weapons = start_weapons;
+               GivePlayerRandomWeapons(this, random_start_weapons_count,
+                       cvar_string("g_random_start_weapons"), random_start_shells,
+                       random_start_bullets, random_start_rockets, random_start_cells,
+                       random_start_plasma);
        }
        SetSpectatee_status(this, 0);
 
index 78d290c..62be9cb 100644 (file)
@@ -643,6 +643,12 @@ void readplayerstartcvars()
                start_ammo_cells = cvar("g_start_ammo_cells");
                start_ammo_plasma = cvar("g_start_ammo_plasma");
                start_ammo_fuel = cvar("g_start_ammo_fuel");
+               random_start_weapons_count = cvar("g_random_start_weapons_count");
+               random_start_shells = cvar("g_random_start_shells");
+               random_start_bullets = cvar("g_random_start_bullets");
+               random_start_rockets = cvar("g_random_start_rockets");
+               random_start_cells = cvar("g_random_start_cells");
+               random_start_plasma = cvar("g_random_start_plasma");
        }
 
        if (warmup_stage)
@@ -711,6 +717,11 @@ void readplayerstartcvars()
        start_ammo_cells = max(0, start_ammo_cells);
        start_ammo_plasma = max(0, start_ammo_plasma);
        start_ammo_fuel = max(0, start_ammo_fuel);
+       random_start_shells = max(0, random_start_shells);
+       random_start_bullets = max(0, random_start_bullets);
+       random_start_rockets = max(0, random_start_rockets);
+       random_start_cells = max(0, random_start_cells);
+       random_start_plasma = max(0, random_start_plasma);
 
        warmup_start_ammo_shells = max(0, warmup_start_ammo_shells);
        warmup_start_ammo_nails = max(0, warmup_start_ammo_nails);
index 1c01a57..8dc3faa 100644 (file)
@@ -188,6 +188,18 @@ float start_ammo_rockets;
 float start_ammo_cells;
 float start_ammo_plasma;
 float start_ammo_fuel;
+/// \brief Number of random start weapons to give to players.
+int random_start_weapons_count;
+/// \brief Amount of shells to give with a shell-based random start weapon.
+float random_start_shells;
+/// \brief Amount of bullets to give with a bullet-based random start weapon.
+float random_start_bullets;
+/// \brief Amount of rockets to give with a rocket-based random start weapon.
+float random_start_rockets;
+/// \brief Amount of cells to give with a cell-based random start weapon.
+float random_start_cells;
+/// \brief Amount of plasma to give with a plasma-based random start weapon.
+float random_start_plasma;
 float start_health;
 float start_armorvalue;
 WepSet warmup_start_weapons;