public void AddWeaponKill(E_WeaponID id, E_BodyPart bodyPart, int num = 1) { if (uLink.Network.isServer == false) { throw new uLink.NetworkException("AddWeaponKill: could be called only on server"); } int index = PlayerData.InventoryList.Weapons.FindIndex(p => p.ID == id); if (index < 0) { return; } PPIWeaponData weaponData = PlayerData.InventoryList.Weapons[index]; //DebugUtils.Assert( weaponData.IsValid() ); // nemusi byt validni napriklad pri pouziti itemu se spatne nastavenym ID itemu (takze se vola WeaponKill na zadanou zbran) if (weaponData.IsValid()) { PPIRoundScore.WeaponStatistics weaponStats; try { weaponStats = Score.WeaponStats[id]; weaponStats.StatsKills += num; } catch (KeyNotFoundException) { weaponStats = new PPIRoundScore.WeaponStatistics(); weaponStats.StatsKills = num; } Score.WeaponStats[id] = weaponStats; } else { Debug.LogError("AddWeaponKill() with weapon '" + id + "' : weapon not found"); } Score.HeadShots += bodyPart == E_BodyPart.Head ? 1 : 0; // Debug.Log("Weapon kill " + PlayerData.InventoryList.Weapons[index].ToString() + " " + PlayerData.Stats.Games[(int)Game.GetMultiplayerGameType()].ToString()); }
public void ServerAddScoreForKill(uLink.NetworkPlayer victim, uLink.NetworkPlayer killer, List <BlackBoard.DamageData> damageData, E_BodyPart bodyPart, int extraGold) { #if !DEADZONE_CLIENT PlayerPersistantInfo victimPPI = PPIManager.Instance.GetPPI(victim); PlayerPersistantInfo killerPPI = PPIManager.Instance.GetPPI(killer); if (killer != victim) { victimPPI.Score.Deaths++; // check this!!!! SynchronizeScore(victimPPI); killerPPI.Score.Kills++; // check this!!!! killerPPI.AddGoldFromGameplay(extraGold); Server.Instance.ShowMessageOnClients(killerPPI.NameForGui + " " + TextDatabase.instance[MPMessages.Kill] + " " + victimPPI.NameForGui); DistributeKills(victim, killer, bodyPart); if (extraGold > 0) { Server.Instance.ShowGoldMsgOnClient(killerPPI.Player, (short)extraGold); } } else { killerPPI.Score.Deaths++; // check this!!!! killerPPI.AddScore(GameplayRewards.Suicide); Server.Instance.ShowMessageOnClients(killerPPI.NameForGui + " " + TextDatabase.instance[MPMessages.Suicide]); SynchronizeScore(killerPPI); } ServerSetState(victim, PlayerPersistantInfo.E_State.Connected, true); SortDescending(); #endif }
void DistributeKills(uLink.NetworkPlayer victim, uLink.NetworkPlayer killer, E_BodyPart bodyPart) { ComponentPlayer p = Player.GetPlayer(victim); float left = p.Owner.BlackBoard.RealMaxHealth; Dictionary <uLink.NetworkPlayer, float> killers = new Dictionary <uLink.NetworkPlayer, float>(); foreach (BlackBoard.DamageData data in p.Owner.BlackBoard.AttackersDamageData) { float damage = Mathf.Min(left, data.Damage); if (Player.GetPlayer(data.Attacker) == null) //player is fadeout , f**k him.. or it cause crash in hud on client { continue; } if (killers.ContainsKey(data.Attacker)) { killers[data.Attacker] += damage; } else { killers.Add(data.Attacker, damage); } left -= damage; if (left <= 0) { break; } } //PlayerPersistantInfo victimPPI = PPIManager.Instance.GetPPI(victim); foreach (KeyValuePair <uLink.NetworkPlayer, float> pair in killers) { PlayerPersistantInfo killerPPI = PPIManager.Instance.GetPPI(pair.Key); if (killerPPI == null) { continue; // one of the killers could disconnect } float percent = pair.Value / p.Owner.BlackBoard.RealMaxHealth; if (pair.Key == killer) { percent = 1.0f; } else if (percent < 0.1f) { percent = 0.1f; } else if (percent > 0.6f) { percent = 0.6f; } int score = Mathf.FloorToInt(GameplayRewards.Kill * percent); if (killer == pair.Key) { Server.Instance.ShowCombatMsgOnClient(killerPPI.Player, Client.E_MessageType.Kill, (short)score, (short)(score * GameplayRewards.MoneyModificator)); if (bodyPart == E_BodyPart.Head) { Server.Instance.ShowCombatMsgOnClient(killerPPI.Player, Client.E_MessageType.HeadShot, GameplayRewards.HeadShot, (short)(GameplayRewards.HeadShot * GameplayRewards.MoneyModificator)); score += GameplayRewards.HeadShot; } } else { Server.Instance.ShowCombatMsgOnClient(killerPPI.Player, Client.E_MessageType.KillAssist, (short)score, (short)(score * GameplayRewards.MoneyModificator)); } killerPPI.AddScore(score); if (Server.Instance.GameInfo.GameType == E_MPGameType.DeathMatch) { killerPPI.AddExperience(score, E_AddMoneyAction.KillDM); } else { killerPPI.AddExperience(score, E_AddMoneyAction.KillZC); } SynchronizeScore(killerPPI); } }