#include <common/weapons/_all.qh>
+ #include <common/mutators/mutator/buffs/buffs.qh>
+
#include "../lib/warpzone/util_server.qh"
#elif defined(CSQC)
#include "physics/movetypes/movetypes.qh"
return 0;
return ammo_pickupevalfunc(player, item);
}
- return item.bot_pickupbasevalue;
+
+ // reduce weapon value if bot already got a good arsenal
+ float c = 1;
+ int weapons_value = 0;
+ FOREACH(Weapons, it != WEP_Null && (player.weapons & it.m_wepset), {
+ weapons_value += it.bot_pickupbasevalue;
+ });
+ c -= bound(0, weapons_value / 20000, 1) * 0.5;
+
+ return item.bot_pickupbasevalue * c;
}
float ammo_pickupevalfunc(entity player, entity item)
if (need_shells)
if (item.ammo_shells)
if (player.ammo_shells < g_pickup_shells_max)
- c = (player.ammo_shells + item.ammo_shells) / player.ammo_shells;
+ c = item.ammo_shells / player.ammo_shells;
if (need_nails)
if (item.ammo_nails)
if (player.ammo_nails < g_pickup_nails_max)
- c = (player.ammo_nails + item.ammo_nails) / player.ammo_nails;
+ c = item.ammo_nails / player.ammo_nails;
if (need_rockets)
if (item.ammo_rockets)
if (player.ammo_rockets < g_pickup_rockets_max)
- c = (player.ammo_rockets + item.ammo_rockets) / player.ammo_rockets;
+ c = item.ammo_rockets / player.ammo_rockets;
if (need_cells)
if (item.ammo_cells)
if (player.ammo_cells < g_pickup_cells_max)
- c = (player.ammo_cells + item.ammo_cells) / player.ammo_cells;
+ c = item.ammo_cells / player.ammo_cells;
if (need_plasma)
if (item.ammo_plasma)
if (player.ammo_plasma < g_pickup_plasma_max)
- c = (player.ammo_plasma + item.ammo_plasma) / player.ammo_plasma;
+ c = item.ammo_plasma / player.ammo_plasma;
if (need_fuel)
if (item.ammo_fuel)
if (player.ammo_fuel < g_pickup_fuel_max)
- c = (player.ammo_fuel + item.ammo_fuel) / player.ammo_fuel;
+ c = item.ammo_fuel / player.ammo_fuel;
- rating *= min(3, c);
+ rating *= min(2, c);
if(wpn)
- // Skilled bots will grab more
- rating += wpn.bot_pickupbasevalue * (0.1 + 0.1 * bound(0, skill / 10, 1));
+ rating += wpn.bot_pickupbasevalue * 0.1;
return rating;
}
+.int item_group;
+.int item_group_count;
float healtharmor_pickupevalfunc(entity player, entity item)
{
float c = 0;
float rating = item.bot_pickupbasevalue;
- if (item.armorvalue)
+ float itemarmor = item.armorvalue;
+ float itemhealth = item.health;
+ if(item.item_group)
+ {
+ itemarmor *= min(4, item.item_group_count);
+ itemhealth *= min(4, item.item_group_count);
+ }
+ if (itemarmor)
if (player.armorvalue < item.max_armorvalue)
- c = (player.armorvalue + player.health + item.armorvalue) / (max(1, player.armorvalue + player.health));
- if (item.health)
+ c = itemarmor / max(1, player.armorvalue * 2/3 + player.health * 1/3);
+ if (itemhealth)
if (player.health < item.max_health)
- c = (player.health + item.health) / (max(1, player.health));
+ c = itemhealth / max(1, player.health);
- rating *= min(3, c);
+ rating *= min(2, c);
return rating;
}
delete(this);
return;
}
+
+ setItemGroup(this);
}
void StartItem(entity this, GameItem def)
);
}
+#define IS_SMALL(def) ((def.instanceOfHealth && def == ITEM_HealthSmall) || (def.instanceOfArmor && def == ITEM_ArmorSmall))
+int group_count = 1;
+
+void setItemGroup(entity this)
+{
+ if(!IS_SMALL(this.itemdef))
+ return;
+
+ FOREACH_ENTITY_RADIUS(this.origin, 120, (it != this) && IS_SMALL(it.itemdef),
+ {
+ if(!this.item_group)
+ {
+ if(!it.item_group)
+ {
+ it.item_group = group_count;
+ group_count++;
+ }
+ this.item_group = it.item_group;
+ }
+ else // spawning item is already part of a item_group X
+ {
+ if(!it.item_group)
+ it.item_group = this.item_group;
+ else if(it.item_group != this.item_group) // found an item near the spawning item that is part of a different item_group Y
+ {
+ int grY = it.item_group;
+ // move all items of item_group Y to item_group X
+ FOREACH_ENTITY(IS_SMALL(it.itemdef),
+ {
+ if(it.item_group == grY)
+ it.item_group = this.item_group;
+ });
+ }
+ }
+ });
+}
+
+void setItemGroupCount()
+{
+ for (int k = 1; k <= group_count; k++)
+ {
+ int count = 0;
+ FOREACH_ENTITY(IS_SMALL(it.itemdef) && it.item_group == k, { count++; });
+ if (count)
+ FOREACH_ENTITY(IS_SMALL(it.itemdef) && it.item_group == k, { it.item_group_count = count; });
+ }
+}
+
spawnfunc(item_rockets)
{
if(!this.ammo_rockets)
else if(argv(j) == "fuel_regen") this.items |= ITEM_JetpackRegen.m_itemid;
else
{
+ FOREACH(Buffs, it != BUFF_Null,
+ {
+ s = Buff_UndeprecateName(argv(j));
+ if(s == it.m_name)
+ {
+ this.buffs |= (it.m_itemid);
+ break;
+ }
+ });
FOREACH(Weapons, it != WEP_Null, {
s = W_UndeprecateName(argv(j));
if(s == it.netname)
if(this.ammo_fuel != 0) this.netname = sprintf("%s %s%d %s", this.netname, valueprefix, max(0, this.ammo_fuel), "fuel");
if(this.health != 0) this.netname = sprintf("%s %s%d %s", this.netname, valueprefix, max(0, this.health), "health");
if(this.armorvalue != 0) this.netname = sprintf("%s %s%d %s", this.netname, valueprefix, max(0, this.armorvalue), "armor");
+ FOREACH(Buffs, it != BUFF_Null, this.netname = sprintf("%s %s%d %s", this.netname, itemprefix, !!(this.buffs & (it.m_itemid)), it.m_name));
FOREACH(Weapons, it != WEP_Null, this.netname = sprintf("%s %s%d %s", this.netname, itemprefix, !!(this.weapons & (it.m_wepset)), it.netname));
}
this.netname = strzone(this.netname);
return (v0 != v1);
}
+bool GiveBuff(entity e, Buff thebuff, int op, int val)
+{
+ bool had_buff = (e.buffs & thebuff.m_itemid);
+ switch(op)
+ {
+ case OP_SET:
+ if(val > 0)
+ e.buffs |= thebuff.m_itemid;
+ else
+ e.buffs &= ~thebuff.m_itemid;
+ break;
+ case OP_MIN:
+ case OP_PLUS:
+ if(val > 0)
+ e.buffs |= thebuff.m_itemid;
+ break;
+ case OP_MAX:
+ if(val <= 0)
+ e.buffs &= ~thebuff.m_itemid;
+ break;
+ case OP_MINUS:
+ if(val > 0)
+ e.buffs &= ~thebuff.m_itemid;
+ break;
+ }
+ bool have_buff = (e.buffs & thebuff.m_itemid);
+ return (had_buff != have_buff);
+}
+
void GiveSound(entity e, float v0, float v1, float t, Sound snd_incr, Sound snd_decr)
{
if(v1 == v0)
got += GiveValue(e, armorvalue, op, val);
case "allweapons":
FOREACH(Weapons, it != WEP_Null && !(it.spawnflags & WEP_FLAG_MUTATORBLOCKED), got += GiveWeapon(e, it.m_id, op, val));
+ //case "allbuffs": // all buffs makes a player god, do not want!
+ //FOREACH(Buffs, it != BUFF_Null, got += GiveBuff(e, it.m_itemid, op, val));
case "allammo":
got += GiveValue(e, ammo_cells, op, val);
got += GiveValue(e, ammo_plasma, op, val);
got += GiveValue(e, ammo_fuel, op, val);
break;
default:
+ FOREACH(Buffs, it != BUFF_Null && Buff_UndeprecateName(cmd) == it.m_name,
+ {
+ got += GiveBuff(e, it, op, val);
+ break;
+ });
FOREACH(Weapons, it != WEP_Null && W_UndeprecateName(cmd) == it.netname, {
got += GiveWeapon(e, it.m_id, op, val);
break;