public void Launch(CharacterEntity attacker, bool isLeftHandWeapon) { if (attacker == null || !NetworkServer.active) { return; } var characterColliders = Physics.OverlapSphere(attacker.TempTransform.position, damagePrefab.GetAttackRange() + 5f, 1 << GameInstance.Singleton.characterLayer); for (int i = 0; i < spread; ++i) { Transform launchTransform; attacker.GetDamageLaunchTransform(isLeftHandWeapon, out launchTransform); // An transform's rotation, position will be set when set `Attacker` // So don't worry about them before damage entity going to spawn // Velocity also being set when set `Attacker` too. var addRotationX = Random.Range(-staggerY, staggerY); var addRotationY = Random.Range(-staggerX, staggerX); var position = launchTransform.position; var direction = attacker.TempTransform.forward; var damageEntity = DamageEntity.InstantiateNewEntity(damagePrefab, isLeftHandWeapon, position, direction, attacker.netId, addRotationX, addRotationY); damageEntity.weaponDamage = Mathf.CeilToInt(damage / spread); var msg = new OpMsgCharacterAttack(); msg.weaponId = GetId(); msg.position = position; msg.direction = direction; msg.attackerNetId = attacker.netId; msg.addRotationX = addRotationX; msg.addRotationY = addRotationY; foreach (var characterCollider in characterColliders) { var character = characterCollider.GetComponent <CharacterEntity>(); if (character != null && !(character is BotEntity)) { NetworkServer.SendToClient(character.connectionToClient.connectionId, msg.OpId, msg); } } } attacker.RpcEffect(attacker.netId, CharacterEntity.RPC_EFFECT_DAMAGE_SPAWN); }
public static DamageEntity InstantiateNewEntity(OpMsgCharacterAttack msg) { return(InstantiateNewEntity(msg.weaponId, msg.isLeftHandWeapon, msg.position, msg.direction, msg.attackerNetId, msg.addRotationX, msg.addRotationY)); }