void Update() { // show while in lobby and while not creating a character if (manager.state == NetworkState.Lobby && !uiCharacterCreation.IsVisible()) { panel.SetActive(true); // characters available message received already? if (manager.charactersAvailableMsg != null) { // instantiate/destroy enough slots CharactersAvailableMsg.CharacterPreview[] characters = manager.charactersAvailableMsg.characters; UIUtils.BalancePrefabs(slotPrefab.gameObject, characters.Length, content); // refresh all List <Player> prefabs = manager.GetPlayerClasses(); for (int i = 0; i < characters.Length; ++i) { Player prefab = prefabs.Find(p => p.name == characters[i].className); UICharacterSelectionSlot slot = content.GetChild(i).GetComponent <UICharacterSelectionSlot>(); // name and icon slot.nameText.text = characters[i].name; slot.image.sprite = prefab.GetComponent <Player>().classIcon; // select button: calls AddPlayer which calls OnServerAddPlayer // -> button sends a request to the server // -> if we press button again while request hasn't finished // then we will get the error: // 'ClientScene::AddPlayer: playerControllerId of 0 already in use.' // which will happen sometimes at low-fps or high-latency // -> internally ClientScene.AddPlayer adds to localPlayers // immediately, so let's check that first slot.selectButton.interactable = ClientScene.localPlayer == null; int icopy = i; // needed for lambdas, otherwise i is Count slot.selectButton.onClick.SetListener(() => { CharacterSelectMsg message = new CharacterSelectMsg { index = icopy }; ClientScene.AddPlayer(manager.client.connection, message); // make sure we can't select twice and call AddPlayer twice panel.SetActive(false); }); // delete button: sends delete message slot.deleteButton.onClick.SetListener(() => { CharacterDeleteMsg message = new CharacterDeleteMsg { index = icopy }; manager.client.Send(CharacterDeleteMsg.MsgId, message); }); } createButton.interactable = characters.Length < manager.characterLimit; createButton.onClick.SetListener(() => { panel.SetActive(false); uiCharacterCreation.Show(); }); quitButton.onClick.SetListener(() => { NetworkManagerMMO.Quit(); }); } } else { panel.SetActive(false); } }
// Create a local client and connect to the local server public void SetupLocalClient() { myClient = ClientScene.ConnectLocalServer(); myClient.RegisterHandler(MsgType.Connect, OnConnected); isAtStartup = false; }
internal void Register() { ClientScene.UnregisterPrefab(this.prefab); set_AssetId(this.netID, default); ClientScene.RegisterPrefab(this.prefab, this.hash); }
private void AddBot() { ClientScene.AddPlayer(1); }
void OnGUI() { if (!showGUI) { return; } GUILayout.BeginArea(new Rect(10 + offsetX, 40 + offsetY, 215, 9999)); if (!NetworkClient.isConnected && !NetworkServer.active) { if (!NetworkClient.active) { /* * // LAN Host * if (Application.platform != RuntimePlatform.WebGLPlayer) * { * if (GUILayout.Button("LAN Host")) * { * manager.StartHost(); * } * } */ // LAN Client + IP GUILayout.BeginHorizontal(); if (GUILayout.Button("LAN Client")) { manager.StartClient(); } manager.networkAddress = GUILayout.TextField(manager.networkAddress); GUILayout.EndHorizontal(); // LAN Server Only if (Application.platform == RuntimePlatform.WebGLPlayer) { // cant be a server in webgl build GUILayout.Box("( WebGL cannot be server )"); } else { if (GUILayout.Button("LAN Server Only")) { manager.StartServer(); } } } else { // Connecting GUILayout.Label("Connecting to " + manager.networkAddress + ".."); if (GUILayout.Button("Cancel Connection Attempt")) { manager.StopClient(); } } } else { // server / client status message if (NetworkServer.active) { GUILayout.Label("Server: active. Transport: " + Transport.activeTransport); } if (NetworkClient.isConnected) { GUILayout.Label("Client: address=" + manager.networkAddress); } } // client ready if (NetworkClient.isConnected && !ClientScene.ready) { if (GUILayout.Button("Client Ready")) { ClientScene.Ready(NetworkClient.connection); if (ClientScene.localPlayer == null) { ClientScene.AddPlayer(); } } } // stop if (NetworkServer.active || NetworkClient.isConnected) { if (GUILayout.Button("Stop")) { manager.StopHost(); } } GUILayout.EndArea(); }
public void OnConnected(NetworkMessage m) { Debug.Log("Connect!"); ClientScene.AddPlayer(myClient.connection, 1); }
private void Update() { if (ControlledByPlayer == NetworkInstanceId.Invalid) { return; } //don't start it too early: if (!PlayerManager.LocalPlayer) { return; } //Only update if it is inhand of localplayer if (PlayerManager.LocalPlayer != ClientScene.FindLocalObject(ControlledByPlayer)) { return; } if (FireCountDown > 0) { FireCountDown -= Time.deltaTime; //prevents the next projectile taking miliseconds longer than it should if (FireCountDown < 0) { FireCountDown = 0; } } //Check if magazine in opposite hand or if unloading if (Input.GetKeyDown(KeyCode.R)) { //PlaceHolder for click UI GameObject currentHandItem = UIManager.Hands.CurrentSlot.Item; GameObject otherHandItem = UIManager.Hands.OtherSlot.Item; string hand; if (currentHandItem != null) { if (CurrentMagazine == null) { //RELOAD if (currentHandItem.GetComponent <MagazineBehaviour>() && otherHandItem.GetComponent <Weapon>()) { string ammoType = currentHandItem.GetComponent <MagazineBehaviour>().ammoType; if (AmmoType == ammoType) { hand = UIManager.Hands.CurrentSlot.eventName; Reload(currentHandItem, hand, true); } if (AmmoType != ammoType) { UIManager.Chat.AddChatEvent(new ChatEvent("You try to load the wrong ammo into your weapon", ChatChannel.Examine)); } } if (otherHandItem.GetComponent <MagazineBehaviour>() && currentHandItem.GetComponent <Weapon>()) { string ammoType = otherHandItem.GetComponent <MagazineBehaviour>().ammoType; if (AmmoType == ammoType) { hand = UIManager.Hands.OtherSlot.eventName; Reload(otherHandItem, hand, false); } if (AmmoType != ammoType) { UIManager.Chat.AddChatEvent(new ChatEvent("You try to load the wrong ammo into your weapon", ChatChannel.Examine)); } } } else { //UNLOAD if (currentHandItem.GetComponent <Weapon>() && otherHandItem == null) { ManualUnload(CurrentMagazine); } else if (currentHandItem.GetComponent <Weapon>() && otherHandItem.GetComponent <MagazineBehaviour>()) { UIManager.Chat.AddChatEvent(new ChatEvent("You weapon is already loaded, you cant fit more Magazines in it, silly!", ChatChannel.Examine)); } else if (otherHandItem.GetComponent <Weapon>() && currentHandItem.GetComponent <MagazineBehaviour>()) { UIManager.Chat.AddChatEvent(new ChatEvent("You weapon is already loaded, you cant fit more Magazines in it, silly!", ChatChannel.Examine)); } } } } if (Input.GetMouseButtonUp(0)) { InAutomaticAction = false; //remove recoil after shooting is released CurrentRecoilVariance = 0; } if (InAutomaticAction && FireCountDown <= 0) { AttemptToFireWeapon(); } }
void OnGUI() { if (!showGUI) { return; } int xpos = 10 + offsetX; int ypos = 10 + offsetY; int spacing = 24; if (NetworkClient.active && !ClientScene.ready) { if (GUI.Button(new Rect(xpos, ypos, 200, 20), "Client Ready")) { ClientScene.Ready(manager.client.connection); if (ClientScene.localPlayers.Count == 0) { ClientScene.AddPlayer(0); } } ypos += spacing; } if (NetworkServer.active || NetworkClient.active) { if (!clientSetup) { myClient = manager.client; SetupClient(); clientSetup = true; } if (GUI.Button(new Rect(xpos, ypos, 200, 20), "Disconnect")) { manager.StopHost(); gm.leaveGame(); } ypos += spacing; } if (!NetworkServer.active && !NetworkClient.active) { clientSetup = false; if (manager.matchInfo == null) { if (manager.matches == null) { if (GUI.Button(new Rect(xpos, ypos, 200, 20), "Create Match")) { manager.matchMaker.CreateMatch(manager.matchName, manager.matchSize, true, "", "", "", 0, 0, manager.OnMatchCreate); gm.begin(1); } ypos += spacing; GUI.Label(new Rect(xpos, ypos, 100, 20), "Room Name:"); manager.matchName = GUI.TextField(new Rect(xpos + 100, ypos, 100, 20), manager.matchName); ypos += spacing; ypos += 10; if (GUI.Button(new Rect(xpos, ypos, 200, 20), "Find Match")) { manager.matchMaker.ListMatches(0, 20, "", true, 0, 0, manager.OnMatchList); } ypos += spacing; } else { foreach (var match in manager.matches) { if (GUI.Button(new Rect(xpos, ypos, 200, 20), "Join Match:" + match.name)) { manager.matchName = match.name; manager.matchSize = (uint)match.currentSize; manager.matchMaker.JoinMatch(match.networkId, "", "", "", 0, 0, manager.OnMatchJoined); gm.begin(2); } ypos += spacing; } if (GUI.Button(new Rect(xpos, ypos, 200, 20), "Back")) { manager.matches = null; } ypos += spacing; } } if (GUI.Button(new Rect(xpos, ypos, 200, 20), "Change MM server")) { showServer = !showServer; } if (showServer) { ypos += spacing; if (GUI.Button(new Rect(xpos, ypos, 100, 20), "Local")) { manager.SetMatchHost("localhost", 1337, false); showServer = false; } ypos += spacing; if (GUI.Button(new Rect(xpos, ypos, 100, 20), "Internet")) { manager.SetMatchHost("mm.unet.unity3d.com", 443, true); showServer = false; } ypos += spacing; if (GUI.Button(new Rect(xpos, ypos, 100, 20), "Staging")) { manager.SetMatchHost("staging-mm.unet.unity3d.com", 443, true); showServer = false; } } ypos += spacing; try { GUI.Label(new Rect(xpos, ypos, 300, 20), "MM Uri: " + manager.matchMaker.baseUri); } catch { } ypos += spacing; } }
public override void OnStartClient() { GameObject parentObject = ClientScene.FindLocalObject(parentNetId); atc = parentObject.GetComponent <AreaTreeController>(); }
void OnGUI() { if (!showGUI) { return; } int xpos = 10 + offsetX; int ypos = 40 + offsetY; int spacing = 24; if (!NetworkClient.active && !NetworkServer.active && manager.matchMaker == null) { if (GUI.Button(new Rect(xpos, ypos, 200, 20), "Start Host (H)")) { manager.StartHost(); } ypos += spacing; if (GUI.Button(new Rect(xpos, ypos, 100, 20), "Connect (C)")) { manager.StartClient(); } manager.networkAddress = GUI.TextField(new Rect(xpos + 100, ypos, 100, 20), manager.networkAddress); ypos += spacing; if (GUI.Button(new Rect(xpos, ypos, 200, 20), "Start Server Only (S)")) { manager.StartServer(); } ypos += spacing; if (GUI.Button(new Rect(xpos, ypos, 200, 20), "To Main Menu (Esc)")) { ToMainMenu(); } ypos += spacing; } else { if (NetworkServer.active) { GUI.Label(new Rect(xpos, ypos, 300, 20), "Server: port=" + manager.networkPort); ypos += spacing; } if (NetworkClient.active) { GUI.Label(new Rect(xpos, ypos, 300, 20), "Client: address=" + manager.networkAddress + " port=" + manager.networkPort); ypos += spacing; } } if (NetworkClient.active && !ClientScene.ready) { if (GUI.Button(new Rect(xpos, ypos, 200, 20), "Client Ready")) { ClientScene.Ready(manager.client.connection); if (ClientScene.localPlayers.Count == 0) { ClientScene.AddPlayer(0); } } ypos += spacing; } if (NetworkServer.active || NetworkClient.active) { if (GUI.Button(new Rect(xpos, ypos, 200, 20), "Stop (X)")) { manager.StopHost(); } ypos += spacing; } }
public override void OnClientSceneChanged(NetworkConnection conn) { ClientScene.AddPlayer(conn, 0); }
public override void OnStartClient() { Physics2D.IgnoreCollision(GetComponent <BoxCollider2D>(), ClientScene.FindLocalObject(spawnedBy).GetComponent <BoxCollider2D>(), true); }
// Start is called before the first frame update void Start() { LobbyUICanvas = GameObject.FindObjectOfType <Canvas>(); ClientScene.RegisterPrefab(PlayerLobbyCursorPrefab); }
/// <summary> /// 開始時の処理 /// </summary> void Start() { // もしクライアントとして実行中じゃなかったら何もしない if (!Global.Instance.IsClient) { return; } // 物理演算があるので常時処理しておきたい Application.runInBackground = true; // ネットワーク越しに座標など同期する必要があるプレハブを登録する foreach (var kvp in Global.Instance.NetPrefabs) { ClientScene.RegisterSpawnHandler( kvp.Key, (position, assetId) => { return(GameObject.Instantiate <GameObject>(kvp.Value)); }, (spawned) => GameObject.Destroy(spawned) ); } // サーバーアドレスの取得 string address; if (string.IsNullOrEmpty(Application.absoluteURL)) { address = "localhost"; } else { address = new Uri(Application.absoluteURL).GetComponents(UriComponents.Host, UriFormat.Unescaped); } // サーバーへ接続する _Client = new NetworkClient(); _Client.Connect(address, this.Port); _Client.RegisterHandler( MsgType.Connect, (netMsg) => { ClientScene.Ready(netMsg.conn); ClientScene.AddPlayer(0); } ); // ギミック無効化要求ハンドラ登録 _Client.RegisterHandler( MyMsgType.DisableGimmick, (netMsg) => { var gimmicks = Server.Instance.GetComponentsInChildren <Gimmick>(true); for (int i = 0; i < gimmicks.Length; i++) { var gimmick = gimmicks[i]; var c = gimmick.GetComponent <Collider2D>(); if (c != null) { c.enabled = false; // 一旦衝突判定を無効化しておかないとクライアント側で正しい初期位置に戻ってくれない } gimmick.gameObject.SetActive(false); //gimmick.Initialize(); } } ); // ギミック有効化要求ハンドラ登録 _Client.RegisterHandler( MyMsgType.EnableGimmick, (netMsg) => { var gimmicks = Server.Instance.GetComponentsInChildren <Gimmick>(true); for (int i = 0; i < gimmicks.Length; i++) { gimmicks[i].gameObject.SetActive(true); } } ); // ギミック衝突判定有効化要求ハンドラ登録 _Client.RegisterHandler( MyMsgType.EnableGimmickCollision, (netMsg) => { var gimmicks = Server.Instance.GetComponentsInChildren <Gimmick>(true); for (int i = 0; i < gimmicks.Length; i++) { var gimmick = gimmicks[i]; var c = gimmick.GetComponent <Collider2D>(); if (c != null) { c.enabled = true; } } } ); }
public void SetUpServer() { NetworkServer.Listen(-1); NetworkServer.SpawnObjects(); ClientScene.ConnectLocalServer(); }
// Update is called once per frame protected void Update() { movementRange = baseMovementRange + (boosterRange * boosterCount); if (ownerId != NetworkInstanceId.Invalid && ownerId.Value != 0) { if (hasMoved) { spotlight.color = owner.color + Color.white * .5f; } else { spotlight.color = Color.red; } if ((Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt)) && Player.localPlayer.playerActive && owner == Player.localPlayer) { spotlight.gameObject.SetActive(true); } else { spotlight.gameObject.SetActive(false); } } if (colliderTransform != null) { colliderTransform.localScale = new Vector3(movementRange, movementRange, 2); } if (travelDestination != NetworkInstanceId.Invalid) { targetPoint = ClientScene.FindLocalObject(travelDestination).transform.position; if (transform.position != targetPoint) { Quaternion look = Quaternion.LookRotation(-(targetPoint - transform.position), Vector3.forward); look.x = look.y = 0; transform.rotation = look; if (Vector3.Distance(transform.position, targetPoint) > .01f) { transform.position = Vector3.Lerp(transform.position, targetPoint, moveSpeed * Time.deltaTime); } else { travelDestination = NetworkInstanceId.Invalid; transform.position = targetPoint; GameManager.singleton.ResetCamera(); } if (Vector3.Distance(transform.position, targetPoint) <= .01f) { hasMoved = true; if (OnShipMoveEnd != null) { OnShipMoveEnd(this); } } } } }
private static void Postfix() { // for some reason using entity_item_security_key directly doesn't work well in MP, // so take the relatively simple cloak powerup and give it the appearance and type of a security key GameObject prefab = PrefabManager.item_prefabs[(int)ItemPrefab.entity_item_cloak]; var prefabkeyA2 = PrefabManager.item_prefabs[(int)ItemPrefab.entity_item_security_key].GetChildByName("keyA2"); for (int i = 0; i < CTF.TeamCount; i++) { GameObject flag = UnityEngine.Object.Instantiate(prefab, Vector3.zero, Quaternion.identity); UnityEngine.Object.Destroy(flag.GetChildByName("cloak_ball (1)")); var color = CTF.FlagColor(i); var lightColor = MPTeams.TeamColor(MPTeams.AllTeams[i], 5); Material newMat = null; var keyA2 = UnityEngine.Object.Instantiate(prefabkeyA2, flag.transform); foreach (var rend in keyA2.GetComponentsInChildren <MeshRenderer>()) { if (newMat == null) { newMat = new Material(rend.sharedMaterial.shader); newMat.CopyPropertiesFromMaterial(rend.sharedMaterial); newMat.SetColor("_Color", color); newMat.SetColor("_EmissionColor", color); } rend.sharedMaterial = newMat; } var light = flag.GetChildByName("_light").GetComponent <Light>(); light.color = lightColor; //light.intensity = 4.455539f; light.intensity = 2f; light.range = 4f; light.bounceIntensity = 0f; keyA2.GetChildByName("inner_ring001").GetComponent <HighlighterConstant>().color = color; var partRend = keyA2.GetChildByName("outer_ring_004").GetChildByName("_particle1").GetComponent <ParticleSystemRenderer>(); var newPartMat = new Material(partRend.sharedMaterial.shader); newPartMat.CopyPropertiesFromMaterial(partRend.sharedMaterial); newPartMat.SetColor("_CoreColor", color); newPartMat.SetColor("_TintColor", color); partRend.sharedMaterial = newPartMat; if (flag == null) { Debug.LogWarningFormat("CTF: Failed to instantiate prefab: {0} in RegisterSpawnHandlers", prefab.name); return; } var assetId = CTF.FlagAssetId(i); var netId = flag.GetComponent <NetworkIdentity>(); netId.GetType().GetField("m_AssetId", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(netId, assetId); UnityEngine.Object.DontDestroyOnLoad(flag); flag.SetActive(false); var item = flag.GetComponent <Item>(); //item.m_current_segment = -1; //item.m_stationary = false; item.m_index = i; //item.m_light_flicker = 0; item.m_type = ItemType.KEY_SECURITY; item.m_rotate_speed = 180f; item.m_light_flicker = 0.2f; //flag.tag = "Item"; //flag.GetComponent<NetworkIdentity>().a CTF.FlagObjs.Add(flag); //Debug.Log("Flag " + i + " color " + color + " assetid " + flag.GetComponent<NetworkIdentity>().assetId); m_registered_prefabs.Add(assetId, flag); ClientScene.RegisterSpawnHandler(assetId, NetworkSpawnItemHandler, NetworkUnspawnItemHandler); } Debug.Log("CTF: Created " + CTF.FlagObjs.Count + " flag prefabs"); }
private void Update() { if (ControlledByPlayer == NetworkInstanceId.Invalid) { return; } //don't start it too early: if (!isServer && !PlayerManager.LocalPlayer) { return; } //only perform the rest of the update if the weapon is in the hand of the local player or //we are the server if (!isServer && PlayerManager.LocalPlayer != ClientScene.FindLocalObject(ControlledByPlayer)) { return; } //update the time until the next shot can happen if (FireCountDown > 0) { FireCountDown -= Time.deltaTime; //prevents the next projectile taking miliseconds longer than it should if (FireCountDown < 0) { FireCountDown = 0; } } //this will only be executed on the server since only the server //maintains the queued actions if (queuedShots.Count > 0 && FireCountDown <= 0) { //fire the next shot in the queue DequeueAndProcessServerShot(); } if (queuedUnload && queuedShots.Count == 0) { // done processing shot queue, // perform the queued unload action, causing all clients and server to update their version of this Weapon //due to the syncvar hook MagNetID = NetworkInstanceId.Invalid; queuedUnload = false; } if (queuedLoadMagNetID != NetworkInstanceId.Invalid && queuedShots.Count == 0) { //done processing shot queue, perform the reload, causing all clients and server to update their version of this Weapon //due to the syncvar hook MagNetID = queuedLoadMagNetID; queuedLoadMagNetID = NetworkInstanceId.Invalid; } //rest of the Update is only needed for the weapon if it is held by the local player if (PlayerManager.LocalPlayer != ClientScene.FindLocalObject(ControlledByPlayer)) { return; } //check if burst should stop if the weapon is held by the local player if (Input.GetMouseButtonUp(0)) { StopAutomaticBurst(); } }
public static T FindClientComponent <T>(NetworkInstanceId id) where T : Component { var otherObject = ClientScene.FindLocalObject(id); return(otherObject.GetComponent <T>()); }
/// <summary> /// Attempt to fire a single shot of the weapon (this is called once per bullet for a burst of automatic fire). This /// should be invoked by the client when they want to perform a shot. /// </summary> /// <param name="isSuicide">if the shot should be a suicide shot, striking the weapon holder</param> /// <returns>true iff something happened</returns> private bool AttemptToFireWeapon(bool isSuicide) { PlayerScript shooter = ClientScene.FindLocalObject(ControlledByPlayer).GetComponent <PlayerScript>(); if (shooter.canNotInteract()) { return(false); } //suicide is not allowed in some cases. isSuicide = isSuicide && AllowSuicide; //ignore if we are hovering over UI if (EventSystem.current.IsPointerOverGameObject()) { return(false); } //if we have no mag/clip loaded play empty sound if (CurrentMagazine == null) { StopAutomaticBurst(); PlayEmptySFX(); return(true); } //if we are out of ammo for this weapon eject magazine and play out of ammo sfx else if (Projectile != null && CurrentMagazine.ammoRemains <= 0 && FireCountDown <= 0) { StopAutomaticBurst(); RequestUnload(CurrentMagazine); OutOfAmmoSFX(); return(true); } else { //if we have a projectile to shoot, we have ammo and we are not waiting to be allowed to shoot again, Fire! if (Projectile != null && CurrentMagazine.ammoRemains > 0 && FireCountDown <= 0) { //fire a single round if its a semi or automatic weapon if (WeaponType == WeaponType.SemiAutomatic || WeaponType == WeaponType.FullyAutomatic) { //shot direction Vector2 dir = (Camera.main.ScreenToWorldPoint(Input.mousePosition) - PlayerManager.LocalPlayer.transform.position).normalized; if (!isServer) { //we're a client, request the server to make us shoot RequestShootMessage.Send(gameObject, dir, Projectile.name, UIManager.DamageZone, isSuicide, PlayerManager.LocalPlayer); //Prediction (client bullets don't do any damage) dir = ApplyRecoil(dir); DisplayShot(PlayerManager.LocalPlayer, dir, UIManager.DamageZone, isSuicide); } else { // we are the server, go ahead and shoot ServerShoot(PlayerManager.LocalPlayer, dir, UIManager.DamageZone, isSuicide); } if (WeaponType == WeaponType.FullyAutomatic) { PlayerManager.LocalPlayerScript.mouseInputController.OnMouseDownDir(dir); } } if (WeaponType == WeaponType.FullyAutomatic && !InAutomaticAction) { StartBurst(isSuicide); } else { ContinueBurst(isSuicide); } return(true); } } return(true); }
void UpdatePassengerOnSeats() { hasDriver = false; for (int i = 0; i < Seats.Length; i++) { if (Seats[i].PassengerID != -1) { //搜索具有乘客ID的玩家将其捕捉到车辆中。 NetworkInstanceId passengerid = new NetworkInstanceId((uint)Seats[i].PassengerID); GameObject obj = ClientScene.FindLocalObject(passengerid); if (obj) { CharacterDriver driver = obj.GetComponent <CharacterDriver>(); if (driver) { driver.NeedParachute = NeedParachute; FPSController fps = driver.GetComponent <FPSController>(); if (fps) { fps.FixedRotation(); } if (Seats[i].ForceView != PlayerViewType.None) { PlayerView view = driver.GetComponent <PlayerView>(); if (view) { view.View = Seats[i].ForceView; view.OrbitDistance = Seats[i].ViewDistance; } } if (Seats[i].FixRotation) { driver.transform.rotation = Seats[i].transform.rotation; } driver.character.Motor.grounded = false; driver.transform.position = Seats[i].transform.position; driver.transform.parent = Seats[i].transform; driver.CurrentVehicle = this; driver.character.controller.enabled = false; driver.DrivingSeat = Seats[i]; hasDriver = true; if (driver.character.IsAlive == false) { Seats[i].PassengerID = -1; } } } } else { Seats[i].CleanSeat(); } } if (isServer) { GenSeatsData(); } }
void CmdDisablePickup(NetworkInstanceId pickupID) { GameObject pickup = ClientScene.FindLocalObject(pickupID); pickup.GetComponent <PickupBehaviour>().Disable(); }
/// <summary> /// Deserialize a message from the network. /// </summary> /// <remarks> /// Only receives what it needs and decompresses floats if you chose to. /// </remarks> /// <param name="writer">The Networkreader to read from.</param> override public void Deserialize(NetworkReader reader) { // The first received byte tells us what we need to be syncing. byte syncInfoByte = reader.ReadByte(); bool syncPosition = shouldSyncPosition(syncInfoByte); bool syncRotation = shouldSyncRotation(syncInfoByte); bool syncScale = shouldSyncScale(syncInfoByte); bool syncVelocity = shouldSyncVelocity(syncInfoByte); bool syncAngularVelocity = shouldSyncAngularVelocity(syncInfoByte); NetworkInstanceId netID = reader.ReadNetworkId(); int syncIndex = (int)reader.ReadPackedUInt32(); state.ownerTimestamp = (int)reader.ReadPackedUInt32(); // Find the GameObject GameObject ob = null; if (NetworkServer.active) { ob = NetworkServer.FindLocalObject(netID); } else { ob = ClientScene.FindLocalObject(netID); } if (!ob) { Debug.LogWarning("Could not find target for network state message."); return; } // It doesn't matter which SmoothSync is returned since they all have the same list. smoothSync = ob.GetComponent <SmoothSync>(); // If we want the server to relay non-owned object information out to other clients, set these variables so we know what we need to send. if (NetworkServer.active && !smoothSync.hasAuthority) { state.serverShouldRelayPosition = syncPosition; state.serverShouldRelayRotation = syncRotation; state.serverShouldRelayScale = syncScale; state.serverShouldRelayVelocity = syncVelocity; state.serverShouldRelayAngularVelocity = syncAngularVelocity; } // Find the correct object to sync according to the syncIndex. for (int i = 0; i < smoothSync.childObjectSmoothSyncs.Length; i++) { if (smoothSync.childObjectSmoothSyncs[i].syncIndex == syncIndex) { smoothSync = smoothSync.childObjectSmoothSyncs[i]; } } if (!smoothSync) { Debug.LogWarning("Could not find target for network state message."); return; } // Read position. if (syncPosition) { if (smoothSync.isPositionCompressed) { if (smoothSync.isSyncingXPosition) { state.position.x = HalfHelper.Decompress(reader.ReadUInt16()); } if (smoothSync.isSyncingYPosition) { state.position.y = HalfHelper.Decompress(reader.ReadUInt16()); } if (smoothSync.isSyncingZPosition) { state.position.z = HalfHelper.Decompress(reader.ReadUInt16()); } } else { if (smoothSync.isSyncingXPosition) { state.position.x = reader.ReadSingle(); } if (smoothSync.isSyncingYPosition) { state.position.y = reader.ReadSingle(); } if (smoothSync.isSyncingZPosition) { state.position.z = reader.ReadSingle(); } } } else { if (smoothSync.stateCount > 0) { state.position = smoothSync.stateBuffer[0].position; } else { state.position = smoothSync.getPosition(); } } // Read rotation. if (syncRotation) { Vector3 rot = new Vector3(); if (smoothSync.isRotationCompressed) { if (smoothSync.isSyncingXRotation) { rot.x = HalfHelper.Decompress(reader.ReadUInt16()); } if (smoothSync.isSyncingYRotation) { rot.y = HalfHelper.Decompress(reader.ReadUInt16()); } if (smoothSync.isSyncingZRotation) { rot.z = HalfHelper.Decompress(reader.ReadUInt16()); } state.rotation = Quaternion.Euler(rot); } else { if (smoothSync.isSyncingXRotation) { rot.x = reader.ReadSingle(); } if (smoothSync.isSyncingYRotation) { rot.y = reader.ReadSingle(); } if (smoothSync.isSyncingZRotation) { rot.z = reader.ReadSingle(); } state.rotation = Quaternion.Euler(rot); } } else { if (smoothSync.stateCount > 0) { state.rotation = smoothSync.stateBuffer[0].rotation; } else { state.rotation = smoothSync.getRotation(); } } // Read scale. if (syncScale) { if (smoothSync.isScaleCompressed) { if (smoothSync.isSyncingXScale) { state.scale.x = HalfHelper.Decompress(reader.ReadUInt16()); } if (smoothSync.isSyncingYScale) { state.scale.y = HalfHelper.Decompress(reader.ReadUInt16()); } if (smoothSync.isSyncingZScale) { state.scale.z = HalfHelper.Decompress(reader.ReadUInt16()); } } else { if (smoothSync.isSyncingXScale) { state.scale.x = reader.ReadSingle(); } if (smoothSync.isSyncingYScale) { state.scale.y = reader.ReadSingle(); } if (smoothSync.isSyncingZScale) { state.scale.z = reader.ReadSingle(); } } } else { if (smoothSync.stateCount > 0) { state.scale = smoothSync.stateBuffer[0].scale; } else { state.scale = smoothSync.getScale(); } } // Read velocity. if (syncVelocity) { if (smoothSync.isVelocityCompressed) { if (smoothSync.isSyncingXVelocity) { state.velocity.x = HalfHelper.Decompress(reader.ReadUInt16()); } if (smoothSync.isSyncingYVelocity) { state.velocity.y = HalfHelper.Decompress(reader.ReadUInt16()); } if (smoothSync.isSyncingZVelocity) { state.velocity.z = HalfHelper.Decompress(reader.ReadUInt16()); } } else { if (smoothSync.isSyncingXVelocity) { state.velocity.x = reader.ReadSingle(); } if (smoothSync.isSyncingYVelocity) { state.velocity.y = reader.ReadSingle(); } if (smoothSync.isSyncingZVelocity) { state.velocity.z = reader.ReadSingle(); } } } else { state.velocity = Vector3.zero; } // Read anguluar velocity. if (syncAngularVelocity) { if (smoothSync.isAngularVelocityCompressed) { if (smoothSync.isSyncingXAngularVelocity) { state.angularVelocity.x = HalfHelper.Decompress(reader.ReadUInt16()); } if (smoothSync.isSyncingYAngularVelocity) { state.angularVelocity.y = HalfHelper.Decompress(reader.ReadUInt16()); } if (smoothSync.isSyncingZAngularVelocity) { state.angularVelocity.z = HalfHelper.Decompress(reader.ReadUInt16()); } } else { if (smoothSync.isSyncingXAngularVelocity) { state.angularVelocity.x = reader.ReadSingle(); } if (smoothSync.isSyncingYAngularVelocity) { state.angularVelocity.y = reader.ReadSingle(); } if (smoothSync.isSyncingZAngularVelocity) { state.angularVelocity.z = reader.ReadSingle(); } } } else { state.angularVelocity = Vector3.zero; } }
void Update() { // show if connected, not in world, not in charcreation if (manager.IsClientConnected() && !Utils.ClientLocalPlayer() && !uiCharacterCreation.IsVisible()) { panel.SetActive(true); // characters available message received already? if (manager.charactersAvailableMsg != null) { // instantiate/destroy enough slots CharactersAvailableMsg.CharacterPreview[] characters = manager.charactersAvailableMsg.characters; UIUtils.BalancePrefabs(slotPrefab.gameObject, characters.Length, content); // refresh all List <Player> prefabs = manager.GetPlayerClasses(); for (int i = 0; i < characters.Length; ++i) { Player prefab = prefabs.Find(p => p.name == characters[i].className); UICharacterSelectionSlot slot = content.GetChild(i).GetComponent <UICharacterSelectionSlot>(); // name and icon slot.nameText.text = characters[i].name; slot.image.sprite = prefab.GetComponent <Player>().classIcon; // select button: calls AddPLayer which calls OnServerAddPlayer int icopy = i; // needed for lambdas, otherwise i is Count slot.selectButton.onClick.SetListener(() => { CharacterSelectMsg message = new CharacterSelectMsg { index = icopy }; ClientScene.AddPlayer(manager.client.connection, 0, message); // make sure we can't select twice and call AddPlayer twice panel.SetActive(false); }); // delete button: sends delete message slot.deleteButton.onClick.SetListener(() => { CharacterDeleteMsg message = new CharacterDeleteMsg { index = icopy }; manager.client.Send(CharacterDeleteMsg.MsgId, message); }); } createButton.interactable = characters.Length < manager.characterLimit; createButton.onClick.SetListener(() => { panel.SetActive(false); uiCharacterCreation.Show(); }); quitButton.onClick.SetListener(() => { NetworkManagerMMO.Quit(); }); } // addon system hooks Utils.InvokeMany(typeof(UICharacterSelection), this, "Update_"); } else { panel.SetActive(false); } }
void Update() { if (!exploPause) { exploTimer -= Time.deltaTime; } // Check if the timer is over if (exploTimer <= 0) { exploTimer = 10.0f; GameObject exploParent = new GameObject(); exploParent.AddComponent <NetworkIdentity> ().localPlayerAuthority = true; ClientScene.RegisterPrefab(exploParent); exploParent.name = "Explosions"; Destroy(exploParent, exploDispa); // Center of the explosion if (playerMove) { var position = settings.RoundPosition(myTransform.position + new Vector3(0, 0.6f, 0)); playerMove.CmdSpawnExplo(position.x, position.z, exploParent); } // Propagation of the explosion ExploPropag(ref up, Directions.Up, exploParent); ExploPropag(ref right, Directions.Right, exploParent); ExploPropag(ref down, Directions.Down, exploParent); ExploPropag(ref left, Directions.Left, exploParent); if (playerMove) { playerMove.RpcIncrem(); } // Play the explosion sound AudioSource.PlayClipAtPoint(exploSound, myTransform.position); // Destruction of the bomb Destroy(gameObject); } // Check if the bomb is pushed if (pushing) { // Make the animation of the push myTransform.position = Vector3.MoveTowards(myTransform.position, nextPos, Time.deltaTime * 10.0f); // If bomb pushing animation finished if (myTransform.position == nextPos) { pushing = false; CmdPush(Vector3.zero); Push(Vector3.zero); } } if (midAxe != Vector3.zero) { myTransform.RotateAround(midAxe, Vector3.left, 100.0f * Time.deltaTime); } }
void OnGUI() { if (!showGUI) { return; } NetworkManager manager = (NetworkManager)this.manager; int xpos = 10 + offsetX; int ypos = 40 + offsetY; const int spacing = 24; bool noConnection = (manager.client == null || manager.client.connection == null || manager.client.connection.connectionId == -1); if (!manager.IsClientConnected() && !NetworkServer.active && manager.matchMaker == null) { if (noConnection) { if (UnityEngine.Application.platform != RuntimePlatform.WebGLPlayer) { if (GUI.Button(new Rect(xpos, ypos, 200, 20), "LAN Host(H)")) { manager.StartHost(); } ypos += spacing; } if (GUI.Button(new Rect(xpos, ypos, 105, 20), "LAN Client(C)")) { manager.StartClient(); } manager.networkAddress = GUI.TextField(new Rect(xpos + 100, ypos, 95, 20), manager.networkAddress); ypos += spacing; if (UnityEngine.Application.platform == RuntimePlatform.WebGLPlayer) { // cant be a server in webgl build GUI.Box(new Rect(xpos, ypos, 200, 25), "( WebGL cannot be server )"); ypos += spacing; } else { if (GUI.Button(new Rect(xpos, ypos, 200, 20), "LAN Server Only(S)")) { manager.StartServer(); } ypos += spacing; } } else { GUI.Label(new Rect(xpos, ypos, 200, 20), "Connecting to " + manager.networkAddress + ":" + manager.networkPort + ".."); ypos += spacing; if (GUI.Button(new Rect(xpos, ypos, 200, 20), "Cancel Connection Attempt")) { manager.StopClient(); } } } else { if (NetworkServer.active) { string serverMsg = "Server: port=" + manager.networkPort; if (manager.useWebSockets) { serverMsg += " (Using WebSockets)"; } GUI.Label(new Rect(xpos, ypos, 300, 20), serverMsg); ypos += spacing; } if (manager.IsClientConnected()) { GUI.Label(new Rect(xpos, ypos, 300, 20), "Client: address=" + manager.networkAddress + " port=" + manager.networkPort); ypos += spacing; } } if (manager.IsClientConnected() && !ClientScene.ready) { if (GUI.Button(new Rect(xpos, ypos, 200, 20), "Client Ready")) { ClientScene.Ready(manager.client.connection); if (ClientScene.localPlayers.Count == 0) { ClientScene.AddPlayer(0); } } ypos += spacing; } if (NetworkServer.active || manager.IsClientConnected()) { if (GUI.Button(new Rect(xpos, ypos, 200, 20), "Stop (X)")) { NetworkServer.SetAllClientsNotReady(); if (NetworkServer.active) { manager.StopHost(); } else { manager.StopClient(); } } ypos += spacing; } if (!NetworkServer.active && !manager.IsClientConnected() && noConnection) { ypos += 10; if (UnityEngine.Application.platform == RuntimePlatform.WebGLPlayer) { GUI.Box(new Rect(xpos - 5, ypos, 220, 25), "(WebGL cannot use Match Maker)"); return; } if (manager.matchMaker == null) { if (GUI.Button(new Rect(xpos, ypos, 200, 20), "Enable Match Maker (M)")) { manager.StartMatchMaker(); } ypos += spacing; } else { if (manager.matchInfo == null) { if (manager.matches == null) { if (GUI.Button(new Rect(xpos, ypos, 200, 20), "Create Internet Match")) { manager.StartHostAll(manager.matchName, manager.matchSize); //manager.matchMaker.CreateMatch(manager.matchName, manager.matchSize, true, "", "", "", 0, 0, manager.OnMatchCreate); } ypos += spacing; GUI.Label(new Rect(xpos, ypos, 100, 20), "Room Name:"); manager.matchName = GUI.TextField(new Rect(xpos + 100, ypos, 100, 20), manager.matchName); ypos += spacing; ypos += 10; if (GUI.Button(new Rect(xpos, ypos, 200, 20), "Find Internet Match")) { manager.matchMaker.ListMatches(0, 20, "", false, 0, 0, manager.OnMatchList); } ypos += spacing; } else { for (int i = 0; i < manager.matches.Count; i++) { var match = manager.matches[i]; if (GUI.Button(new Rect(xpos, ypos, 200, 20), "Join Match:" + match.name)) { manager.StartClientAll(match); //manager.matchName = match.name; //manager.matchMaker.JoinMatch(match.networkId, "", "", "", 0, 0, manager.OnMatchJoined); } ypos += spacing; } if (GUI.Button(new Rect(xpos, ypos, 200, 20), "Back to Match Menu")) { manager.matches = null; } ypos += spacing; } } if (GUI.Button(new Rect(xpos, ypos, 200, 20), "Change MM server")) { showServer = !showServer; } if (showServer) { ypos += spacing; if (GUI.Button(new Rect(xpos, ypos, 100, 20), "Local")) { manager.SetMatchHost("localhost", 1337, false); showServer = false; } ypos += spacing; if (GUI.Button(new Rect(xpos, ypos, 100, 20), "Internet")) { manager.SetMatchHost("mm.unet.unity3d.com", 443, true); showServer = false; } ypos += spacing; if (GUI.Button(new Rect(xpos, ypos, 100, 20), "Staging")) { manager.SetMatchHost("staging-mm.unet.unity3d.com", 443, true); showServer = false; } } ypos += spacing; GUI.Label(new Rect(xpos, ypos, 300, 20), "MM Uri: " + manager.matchMaker.baseUri); ypos += spacing; if (GUI.Button(new Rect(xpos, ypos, 200, 20), "Disable Match Maker")) { manager.StopMatchMaker(); } ypos += spacing; } } }
#pragma warning disable 618 [ClientRpc] public void RpcSetBuilding(NetworkInstanceId buildingId) { Building = ClientScene.FindLocalObject(buildingId).GetComponent <Building>(); #pragma warning restore 618 }
void RpcSetSpellslingerAsInactive(NetworkInstanceId spellSlingerWhoDamagedMe) { GameObject spellSlinger = ClientScene.FindLocalObject(spellSlingerWhoDamagedMe); gameObject.SetActive(false); }
public void RpcUpdateMaze(NetworkInstanceId nid) { GameObject newMaze = ClientScene.FindLocalObject(nid); LogicSystem.current.currentMaze = newMaze; }
private void startAsLocalClient() { networkClient = ClientScene.ConnectLocalServer(); networkClient.RegisterHandler(MsgType.Connect, OnConnected_Client); }