protected void Melee(E_MeleeType meleeType, uLink.NetworkViewID viewID, uLink.NetworkMessageInfo info) { if (Owner.BlackBoard.DontUpdate) { return; } uLink.NetworkView view = uLink.NetworkView.Find(viewID); if (null == view) { // target was just destroyed return; } Agent targetAgent = view.GetComponent <Agent>(); if (targetAgent == null) { return; // wtf ? } #if !DEADZONE_CLIENT if (Owner.IsServer) { if (!ServerAnticheat.ReportAndValidateMelee(Owner.NetworkView.owner, Owner, targetAgent, info)) { // Ignore the action when it is not valid. This may happen even in a regular/fair game when // an attacking playerexperiences a lag. return; } } #endif AgentActionMelee a = AgentActionFactory.Create(AgentActionFactory.E_Type.Melee) as AgentActionMelee; a.Target = targetAgent; a.MeleeType = meleeType; Owner.BlackBoard.ActionAdd(a); if (a.IsFailed()) { return; // wtf ? } if (Owner.IsServer) { //send to proxies Owner.NetworkView.RPC("Melee", uLink.RPCMode.OthersExceptOwner, meleeType, viewID); //knockdown target immediatly, its player, we dont have time wait .... Vector3 direction = (a.Target.Position - Owner.Position).normalized; a.Target.KnockDown(Owner, meleeType, direction); } //Debug.Log(Time.timeSinceLevelLoad + " " + "Melee " + a.MeleeType + " " + a.Target.name); }
protected void Knockdown(E_MeleeType meleeType, uLink.NetworkViewID viewId, Vector3 direction) { #if !DEADZONE_CLIENT if (Owner.IsServer) { ServerAnticheat.ReportPotentialCheatAttempt("Knockdown", "should never be called on the server side", Owner.NetworkView.owner); return; } #endif if (Owner.BlackBoard.DontUpdate) { return; } uLink.NetworkView View = (viewId != uLink.NetworkViewID.unassigned) ? uLink.NetworkView.Find(viewId) : null; AgentHuman attacker = View ? View.GetComponent <AgentHuman>() : null; Owner.KnockDown(attacker, meleeType, direction); }
void HandleAction(AgentAction action) { if (action is AgentActionAttack) { if (Owner.IsOwner) { Owner.NetworkView.RPC("AttackS", uLink.RPCMode.Server, (action as AgentActionAttack).FromPos, (action as AgentActionAttack).AttackDir); } } else if (action is AgentActionInjury) { var injury = action as AgentActionInjury; if (Owner.IsServer) { uLink.NetworkViewID viewId = (injury.Attacker != null && injury.Attacker.NetworkView != null) ? injury.Attacker.NetworkView.viewID : uLink.NetworkViewID.unassigned; Owner.NetworkView.RPC("Injury", RPCMode.Others, viewId, injury.Pos, injury.Impulse, (short)injury.Damage, (short)injury.BodyPart); } } else if (action is AgentActionReload) { if (Owner.IsOwner) { Owner.NetworkView.RPC("Reload", uLink.RPCMode.Server); } } else if (action is AgentActionTeamCommand) { AgentActionTeamCommand a = action as AgentActionTeamCommand; if (Owner.IsOwner) { Owner.NetworkView.RPC("TeamCmd", RPCMode.Server, a.Command); } } else if (action is AgentActionRoll) { if (Owner.IsOwner) { Owner.NetworkView.RPC("Roll", uLink.RPCMode.Server, (action as AgentActionRoll).Direction); } } else if (action is AgentActionDeath) { var death = action as AgentActionDeath; if (Owner.IsServer) { uLink.NetworkViewID viewId = (death.Attacker != null && death.Attacker.NetworkView != null) ? death.Attacker.NetworkView.viewID : uLink.NetworkViewID.unassigned; Owner.NetworkView.RPC("Death", RPCMode.Others, viewId, death.Pos, death.Impulse, (short)death.Damage, (short)death.BodyPart); if (null != death.Attacker) { PPIManager.Instance.ServerAddScoreForKill(Owner.NetworkView.owner, death.Attacker.NetworkView.owner, Owner.BlackBoard.AttackersDamageData, death.BodyPart, Owner.GadgetsComponent.GetBoostGoldReward()); } /*if (Server.Instance.GameInfo.GameType == E_MPGameType.ZoneControl) * { * // currently not using rebalancing after death * //PPIManager.Instance.ServerRebalanceTeams(); * }*/ } } else if (action is AgentActionCoverEnter) { if (Owner.IsOwner) { Owner.NetworkView.RPC("CoverEnter", uLink.RPCMode.Server, Mission.Instance.GameZone.GetCoverIndex(Owner.BlackBoard.Cover), Owner.BlackBoard.Desires.CoverPosition); } } else if (action is AgentActionCoverLeave) { if (Owner.IsOwner) { Owner.NetworkView.RPC("CoverLeave", uLink.RPCMode.Server, ((AgentActionCoverLeave)action).TypeOfLeave); } } else if (action is AgentActionCoverFire) { if (Owner.IsOwner) { AgentActionCoverFire a = action as AgentActionCoverFire; Owner.NetworkView.RPC("CoverFireStart", uLink.RPCMode.Server, a.CoverPose, a.CoverDirection); } } else if (action is AgentActionCoverFireCancel) { if (Owner.IsOwner) { Owner.NetworkView.RPC("CoverFireStop", uLink.RPCMode.Server); } } else if (action is AgentActionWeaponChange) { if (Owner.IsOwner) { Owner.NetworkView.RPC("ChangeWeapon", uLink.RPCMode.Server, (action as AgentActionWeaponChange).NewWeapon); } } else if (action is AgentActionUseItem) { // Debug.Log ("ComponentNetworkAction.HandleAction(), time=" + Time.timeSinceLevelLoad + ", BlackBoard.KeepMotion=" + Owner.BlackBoard.KeepMotion + ", Owner.IsOwner=" + Owner.IsOwner); if (Owner.IsOwner) { if (Owner.IsInCover) { Owner.NetworkView.RPC("UseItemInCover", uLink.RPCMode.Server, Owner.BlackBoard.Desires.Gadget, Owner.BlackBoard.CoverPose, Owner.BlackBoard.CoverPosition); } else { Owner.NetworkView.RPC("UseItem", uLink.RPCMode.Server, Owner.BlackBoard.Desires.Gadget, Owner.BlackBoard.KeepMotion); } } } else if (action is AgentActionMelee) { if (Owner.IsOwner) { AgentActionMelee a = action as AgentActionMelee; uLink.NetworkViewID viewId = (a.Target != null && a.Target.NetworkView != null) ? a.Target.NetworkView.viewID : uLink.NetworkViewID.unassigned; Owner.NetworkView.RPC("Melee", uLink.RPCMode.Server, a.MeleeType, viewId); } } else if (action is AgentActionKnockdown) { if (Owner.IsServer) { AgentActionKnockdown a = action as AgentActionKnockdown; uLink.NetworkViewID viewId = (a.Attacker != null && a.Attacker.NetworkView != null) ? a.Attacker.NetworkView.viewID : uLink.NetworkViewID.unassigned; Owner.NetworkView.RPC("Knockdown", uLink.RPCMode.Others, a.MeleeType, viewId, a.Direction); } } }