public void OnDeath(ShPlayer player) { if (player.svPlayer.lastAttacker && player.svPlayer.lastAttacker != player) { player.svPlayer.lastAttacker.job.OnKillPlayer(player); // Only drop items if attacker present, to prevent AI suicide item farming if (Physics.Raycast( player.GetPosition + Vector3.up, Vector3.down, out RaycastHit hit, 10f, MaskIndex.world)) { ShEntity briefcase = player.manager.svManager.AddNewEntity( player.manager.svManager.briefcasePrefabs.GetRandom(), player.GetPlace, hit.point, Quaternion.LookRotation(player.GetPositionT.forward, Vector3.up), false); if (briefcase) { foreach (KeyValuePair <int, InventoryItem> pair in player.myItems) { if (Random.value < 0.8f) { InventoryItem i = new InventoryItem( pair.Value.item, Mathf.CeilToInt(pair.Value.count * Random.Range(0.05f, 0.3f))); briefcase.myItems.Add(pair.Key, i); } } } } } player.RemoveItemsDeath(); player.svPlayer.ClearWitnessed(); if (!player.isHuman) { player.svPlayer.SetState(StateIndex.Null); } player.svPlayer.Send(SvSendType.Self, Channel.Reliable, ClPacket.ShowTimer, player.svPlayer.RespawnTime); player.SetStance(StanceIndex.Dead, true); }
public override void OnDestroyEntity(ShEntity entity) { base.OnDestroyEntity(entity); if (entity is ShPlayer victim && bounties.ContainsKey(victim.username)) { player.svPlayer.Reward(3, 1000); bounties.Remove(victim.username); ChatHandler.SendToAll($"{player.username} assassinated {victim.username}"); if (victim == aiTarget) { aiTarget = null; } } }
public static bool SvAddCrime(SvPlayer player, ref byte crimeIndex, ref ShEntity victim) { try { if (GodModeLevel >= 1 && CheckGodMode.Run(player, null, "<color=#b7b5b5>Blocked crime and losing EXP!</color>")) { return(true); } } catch (Exception ex) { ErrorLogging.Run(ex); } return(false); }
override protected bool ValidTarget(ShEntity target) { if (target is ShPlayer p) { if (destinationMarker) { return(base.ValidTarget(target) && ValidPlayer(p) && p.curMount && p.curMount == player.curMount); } else { return(base.ValidTarget(target) && ValidPlayer(p) && !p.curMount); } } return(false); }
public override void OnDamageEntity(ShEntity damaged) { if (damaged is ShPlayer victim && victim.wantedLevel == 0) { if (victim.characterType == CharacterType.Mob) { player.svPlayer.SvAddCrime(CrimeIndex.AnimalCruelty, victim); } else if (player.curEquipable is ShGun) { player.svPlayer.SvAddCrime(CrimeIndex.ArmedAssault, victim); } else { player.svPlayer.SvAddCrime(CrimeIndex.Assault, victim); } }
public override void OnDestroyEntity(ShEntity entity) { base.OnDestroyEntity(entity); if (entity is ShPlayer victim) { if (!svManager.gangWar) { if (player.isHuman && victim.svPlayer.job is Gangster && this != victim.svPlayer.job) { ShTerritory t; if (gangstersKilled >= 1 && (t = player.svPlayer.GetTerritory) && t.ownerIndex != info.shared.jobIndex) { t.svTerritory.StartGangWar(info.shared.jobIndex); gangstersKilled = 0; } else { gangstersKilled++; } player.svPlayer.Reward(2, 50); } } else if (victim.svPlayer.job is Gangster) { ShTerritory t = player.svPlayer.GetTerritory; if (t && t.attackerIndex != Util.InvalidByte) { if (victim.svPlayer.job.info.shared.jobIndex == t.ownerIndex) { t.svTerritory.defendersKilled++; t.svTerritory.SendTerritoryStats(); player.svPlayer.Reward(3, 100); } else if (victim.svPlayer.job.info.shared.jobIndex == t.attackerIndex) { t.svTerritory.attackersKilled++; t.svTerritory.SendTerritoryStats(); player.svPlayer.Reward(3, 100); } } } } }
override public void ResetTarget() { if (targetPlayer) { targetPlayer.svPlayer.SvDismount(); targetPlayer.svPlayer.ResetAI(); } if (destinationMarker) { destinationMarker.Destroy(); destinationMarker = null; player.svPlayer.Send(SvSendType.Self, Channel.Reliable, ClPacket.DestroyTimer); } base.ResetTarget(); }
public void ButtonPush(ShEntity target, ShPlayer caller) { if (voidRunning) { caller.svPlayer.SendGameMessage("Do not challenge the void"); return; } const int cost = 500; if (caller.MyMoneyCount < cost) { caller.svPlayer.SendGameMessage("Not enough cash"); return; } caller.TransferMoney(DeltaInv.RemoveFromMe, cost); target.StartCoroutine(EnterTheVoid(target.svEntity.svManager)); }
protected bool SetTarget() { ResetTarget(); GetEntityCallback handler = GetTargetHandler(); for (int i = 0; i < 20; i++) { ShEntity e = handler(); if (ValidTarget(e)) { target = e; FoundTarget(); return(true); } } return(false); }
public override void OnSpecialAction(ShEntity target, string actionID) { if (!target || target.IsDead || !player.InActionRange(target)) { return; } if (targetPlayer != target) { player.svPlayer.SendGameMessage("Wrong target"); return; } player.svPlayer.Reward(2, Mathf.CeilToInt(timeDeadline - Time.time)); target.TransferItem(DeltaInv.AddToMe, deliveryItem); player.svPlayer.SendGameMessage("Successfully Delivered " + deliveryItem.itemName + " to " + targetPlayer.username); targetPlayer.svPlayer.SendGameMessage("Received delivery from " + player.username); ResetTarget(); }
public void RequestHeal(ShEntity target, ShPlayer player) => ((target as ShPlayer)?.svPlayer.job as Paramedic)?.RequestHeal(player);
public void DeliverItem(ShEntity target, ShPlayer player) => (player.svPlayer.job as DeliveryMan)?.DeliverItemAction(target);
public void RequestItem(ShEntity target, ShPlayer player) => ((target as ShPlayer)?.svPlayer.job as Mayor)?.RequestItemAction(player);
public void OnRemoveItemsDeath(ShPlayer player, bool dropItems) { List <InventoryItem> removedItems = new List <InventoryItem>(); // Allows players to keep items/rewards from job ranks foreach (InventoryItem myItem in player.myItems.Values.ToArray()) { int extra = myItem.count; if (player.svPlayer.job.info.upgrades.Length > player.rank) { for (int rankIndex = player.rank; rankIndex >= 0; rankIndex--) { foreach (InventoryStruct i in player.svPlayer.job.info.upgrades[rankIndex].items) { if (myItem.item.name == i.itemName) { extra = Mathf.Max(0, myItem.count - i.count); } } } } // Remove everything except legal items currently worn if (extra > 0 && (myItem.item.illegal || !(myItem.item is ShWearable w) || player.curWearables[(int)w.type].index != w.index)) { removedItems.Add(new InventoryItem(myItem.item, extra)); player.TransferItem(DeltaInv.RemoveFromMe, myItem.item.index, extra, true); } } if (dropItems && removedItems.Count > 0) { // Only drop items if attacker present, to prevent AI suicide item farming if (Physics.Raycast( player.GetPosition + Vector3.up, Vector3.down, out RaycastHit hit, 10f, MaskIndex.world)) { ShEntity briefcase = player.manager.svManager.AddNewEntity( player.manager.svManager.briefcasePrefabs.GetRandom(), player.GetPlace, hit.point, Quaternion.LookRotation(player.GetPositionT.forward, hit.normal), false); if (briefcase) { foreach (var invItem in removedItems) { if (Random.value < 0.8f) { invItem.count = Mathf.CeilToInt(invItem.count * Random.Range(0.05f, 0.3f)); briefcase.myItems.Add(invItem.item.index, invItem); } } } } } }
protected override bool ValidTarget(ShEntity target) => base.ValidTarget(target) && (target is ShPlayer p) && !p.curMount && !(p.svPlayer.job is Prisoner);
protected override bool ValidTarget(ShEntity target) { return(base.ValidTarget(target) && (target as ShPlayer).wantedLevel >= info.attackLevel); }
public virtual void ResetTarget() { player.svPlayer.DestroyGoalMarker(); target = null; }
protected virtual bool ValidTarget(ShEntity target) => target && target != player && target.isActiveAndEnabled && !target.IsDead;
public MinigameContainer(ShPlayer player, int entityID) { this.player = player; targetEntity = EntityCollections.FindByID(entityID); }
public override void OnHealEntity(ShEntity entity) { player.svPlayer.Reward(2, 100); }
protected override bool ValidTarget(ShEntity target) { return(base.ValidTarget(target) && (target as ShPlayer).IsKnockedOut); }