public void Fire(Vector3 towards) { if (CustomNetworkManager.isServer) { return; } if (numArrowsLeft > 0) { Vector3 towardsFromTowerNonFlat = towards - arrowOrigin.position; Vector3 towardsFromTower = new Vector3(towardsFromTowerNonFlat.x, 0, towardsFromTowerNonFlat.z); // Remove y-component Vector3 eulerDir = Quaternion.LookRotation(towardsFromTower).eulerAngles; // Send msg to server that we wish to fire an projectile and await broadcast from server before we spawn local copy Color objColor = calculateArrowColor(); Vector3 arrowScale = calculateArrowScale(); ProjectileDetails pDetails = new ProjectileDetails() { dmg = damage, range = range }; FireProjectileMsg msg = NetworkUtils.cFireProjectileMsg(ProjectileType.PlayerArrow, pDetails, arrowOrigin.position, eulerDir, arrowScale, speed, objColor, 8); NetworkManager.singleton.client.Send((short)CustomProtocol.FireProjectile, msg); numArrowsLeft -= 1; } }
private void handleFireProjectileMsg(NetworkMessage data) { FireProjectileMsg msg = data.ReadMessage <FireProjectileMsg>(); VisualObject proj = Instantiate(visualProjectilePrefabs[msg.type], msg.objDetails.pos, Quaternion.identity).GetComponent <VisualObject>(); // Spawn real projectile on only server spawnedProjectiles.Add(msg.objDetails.id, proj); proj.init(msg.objDetails); }
private void handleFireProjectileMsg(NetworkMessage data) { FireProjectileMsg msg = data.ReadMessage <FireProjectileMsg>(); ProjectileBase obj = Instantiate(projectilePrefabs[msg.type], msg.objDetails.pos, Quaternion.identity).GetComponent <ProjectileBase>(); // Spawn real projectile on only server msg.objDetails.id = getNewProjectileID(); //Give the new projectile an ID, so we can locate and destroy it later spawnedProjectiles.Add(msg.objDetails.id, obj); obj.initProjectile(msg.objDetails, msg.projDetails); NetworkServer.SendToAll((short)CustomProtocol.FireProjectile, msg); }