Мультиплеер

Общие вопросы о Unity3D

Мультиплеер

Сообщение NWOS 11 июл 2011, 10:15

Кто может изменить мой код тут мультиплеер, который создает сервера по моему IP кто-то может исправить его так чтобы сервера создавались по IP владельца :-s

Код: Выделить всё
using System;
    using System.Collections;
    using System.Collections.Generic;

    using ExitGames.Client.Photon;

    public class Game : IPhotonPeerListener
    {
        #region Members

        public string RoomName = "";
        public bool useTcp = false;
        public string ipPort = "77.122.221.253:5055";
        public static readonly string LobbyName = "Bootcamp_lobby"; // also used in all other realtime demos
        public static readonly string RoomNamePrefix = "Bootcamp Default";
        public static readonly string AppName = "LiteLobby";

        public int RoomNumber = Environment.TickCount % 2;

        public LitePeer peer;

        public Dictionary<int, Player> Players;
        public Player LocalPlayer;
        public PlayerLocal PlayerLocal;
        public ChatScreen chatScreen;

        public delegate void DebugOutputDelegate(string debug);
        public DebugOutputDelegate DebugListeners;
      
      private readonly usePhoton usePhoton;

        #endregion

        #region Constructor and Gameloop

        public Game(DebugOutputDelegate debugDelegate, usePhoton photon)
        {
         this.usePhoton = photon;
            this.DebugListeners = debugDelegate;
        }

        /// <summary>
        /// Update must be called by a gameloop (a single thread), so it can handle
        /// automatic movement and networking.
        /// </summary>
        public void Update()
        {
         this.Service();
        }

        #endregion

        #region IPhotonPeerListener Members

        // This is the callback for the Photon library's debug output
        public void DebugReturn(DebugLevel level, string debug)
        {
            this.DebugListeners(debug); // This demo simply ignores the debug level
        }

        // Photon library callback for state changes (connect, disconnect, etc.)
        // Processed within PhotonPeer.DispatchIncomingCommands()!
        public void PeerStatusCallback(StatusCode returnCode)
        {
            this.DebugReturn("nPeerReturn():" + returnCode);

            // handle returnCodes for connect, disconnect and errors (non-operations)
            switch (returnCode)
            {
                case StatusCode.Connect:
                    this.DebugReturn("Connect(ed)");
                    //this.JoinRandomWithLobby();
                    break;
                case StatusCode.Disconnect:
                    this.DebugReturn("Disconnect(ed) peer.state: " + this.peer.PeerState);
                    this.LocalPlayer.playerID = 0;
                    this.Players.Clear();
                    break;
                case StatusCode.ExceptionOnConnect:
                    this.DebugReturn("Exception_Connect(ed) peer.state: " + this.peer.PeerState);
                    this.LocalPlayer.playerID = 0;
                    this.Players.Clear();
                    break;
                case StatusCode.Exception:
                    this.DebugReturn("Exception peer.state: " + this.peer.PeerState);
                    this.Players.Clear();
                    this.LocalPlayer.playerID = 0;
                    break;
                case StatusCode.SendError:
                    this.DebugReturn("SendError! peer.state: " + this.peer.PeerState);
                    this.Players.Clear();
                    this.LocalPlayer.playerID = 0;
                    break;
                default:
                    this.DebugReturn("PeerStatusCallback: " + returnCode);
                    break;
            }
        }

        // Photon library callback to get us operation results (if our operation was executed server-side)
        // Only called for reliable commands! Anything sent unreliable will not produce a result.
        // Processed within PhotonPeer.DispatchIncomingCommands()!
        public void OperationResult(byte opCode, int returnCode, Hashtable returnValues, short invocID)
        {
            if (opCode != (byte)LiteOpCode.RaiseEvent)
            {
                this.DebugReturn("nPeerReturn() " + opCode + "/" + returnCode);
            }

            // handle operation returns (aside from "join", this demo does not watch for returns)
            switch (opCode)
            {
                case (byte)LiteOpCode.Join:
            {
                    // get the local player's numer from the returnvalues, get the player from the list and colorize it:
                    int actorNrReturnedForOpJoin = (int)returnValues[(byte)LiteOpKey.ActorNr];
                    this.LocalPlayer.playerID = actorNrReturnedForOpJoin;

               foreach (Player oldPlayer in this.Players.Values)
               {
                  if (oldPlayer.PlayerIsLocal == false)
                  {
                     usePhoton.RemoveRemotePlayer(oldPlayer);
                  }
               }
            
               this.Players.Clear();
               
               this.LocalPlayer.PlayerIsLocal = true;
               this.Players.Add(actorNrReturnedForOpJoin, this.LocalPlayer);
               this.DebugReturn("[LocalPlayer] " + this.LocalPlayer.name);
               
               foreach (DictionaryEntry actor in returnValues)
               {
                  this.DebugReturn(actor.Key.ToString());
               }
               
               Hashtable actors = (Hashtable)returnValues[(byte)14];
                    if (actors == null) break;      
               foreach (DictionaryEntry actor in actors)
                  {
                     int i = (int)actor.Key;
                     if (i == actorNrReturnedForOpJoin) continue;
                     Player pl = new Player(i);
                     usePhoton.AddRemotePlayer(pl);
                     pl.playerRemote.SetProperties((Hashtable)actor.Value);
                     this.Players.Add(i, pl);                       
                  }
                    break;
            }   
         }
        }

        // Called by Photon lib for each incoming event (player- and position-data in this demo, as well as joins and leaves).
        // Processed within PhotonPeer.DispatchIncomingCommands()!
        public void EventAction(byte eventCode, Hashtable photonEvent)
        {
            if (eventCode != Constants.EV_MOVE)
            {
                this.DebugReturn("EventAction() " + eventCode);
            }

            int actorNr = (int)photonEvent[(byte)LiteEventKey.ActorNr];
           
            // get the player that raised this event
            Player p;
            this.Players.TryGetValue(actorNr, out p);

            switch (eventCode)
            {
                case (byte)LiteEventCode.Join:
               int actor =(int)photonEvent[(byte)LiteEventKey.ActorNr];
               if (actor != this.LocalPlayer.playerID)
               {   
                  var remote = new Player(actor);
                  usePhoton.AddRemotePlayer(remote);
                  Hashtable properties = (Hashtable)photonEvent[(byte)14];
                  remote.playerRemote.SetProperties(properties);
                  this.Players.Add(actor, remote);                         
                    }
                    // get the list of current players and check it against local list - create any that's not yet there
                 
                    this.PrintPlayers();
                    break;

                case (byte)LiteEventCode.Leave:
                    this.Players.Remove(actorNr);
               usePhoton.RemoveRemotePlayer(p);
                    break;

                case (byte)LiteEventCode.SetProperties:
                    Hashtable properties = (Hashtable)photonEvent[(byte)LiteEventKey.Properties];
               p.playerRemote.SetProperties(properties);               
                    break;
            case Constants.EV_HIT:
                    DebugReturn("actorNR " + actorNr +  " _p.playerRemote.Name_ " + p.playerRemote.Name);
                  Hashtable data = (Hashtable)photonEvent[(byte)LiteEventKey.Data];
                  int target = (int)data["T"];
                  if (target == LocalPlayer.playerID)
                  {
                            switch ((byte)data["H"])
                            {
                                case 0:
                                    PlayerLocal.DownLifeHitSoldier(p.playerRemote.Name);
                                    break;
                                case 1:
                                    PlayerLocal.DownLifeHitSoldierGranade(p.playerRemote.Name);
                                    break;
                            }
                        }                  
                  break;
                case Constants.EV_MOVE:
               p.playerRemote.SetPosition((Hashtable)photonEvent[(byte)LiteEventKey.Data]);               
                    break;
                case Constants.EV_ANIM:
               p.playerRemote.SetAnim((Hashtable)photonEvent[(byte)LiteEventKey.Data]);
                    break;
            case Constants.EV_FRAG:         
               p.playerRemote.Dead = true;
               p.playerRemote.SetSpawnPosition((Hashtable)photonEvent[(byte)LiteEventKey.Data]);
               break;
                case Constants.EV_FIRE:               
                    p.playerRemote.SetFire((Hashtable)photonEvent[(byte)LiteEventKey.Data]);                   
                    break;
                case Constants.EV_CHAT:
                    chatScreen.IncomingMessage((Hashtable)photonEvent[(byte)LiteEventKey.Data]);
                    break;               
                   
            }
        }

        #endregion

        #region Game Handling

        // Here the connection to Photon is established (if not already connected).
        public bool Connect()
        {
                if (this.peer == null)
                {
                    this.peer = new LitePeer(this, this.useTcp);
                }
                else if (this.peer.PeerState != (byte)PeerStateValue.Disconnected)
                {
                    this.DebugReturn("already connected! disconnect first.");
                    return false;
                }

                // The amount of debugging/logging from the Photon library can be set this way:
                this.peer.DebugOut = DebugLevel.ERROR;

                try
                {
                    if (!this.peer.Connect(this.ipPort, AppName))
                    {
                        this.DebugReturn("not connected");
                        return false;
                    }
                }
                catch (System.Security.SecurityException ex)
                {
                    // Unity 3.0 requires a policy file for webplayer-builds. Currently, the security
                    // exception that's thrown is not translated into a returnCode / callback for Connect().
                    this.DebugReturn("Security Exception (check policy file): " + ex);
                }
           

            this.Players = new Dictionary<int, Player>();
            this.LocalPlayer = new Player(0);

            return true;
        }
   
        // new for lobby sample: joins a room/game and attachs it to a lobby
        public void JoinToLobby(string _roomName)
        {
            RoomName = _roomName;

         // if this client is in a game already, it is now outdated: clean list of players and local actor number
         foreach (Player oldPlayer in this.Players.Values)
         {
            if (oldPlayer.PlayerIsLocal == false)
            {
                    usePhoton.RemoveRemotePlayer(oldPlayer);
            }
         }
           
               
            this.Players.Clear();
            this.LocalPlayer.playerID = 0;

            // the LiteLobby application defines an (optional) parameter "lobby", which is given key (byte)5
            Hashtable operationParameters = new Hashtable();
            operationParameters.Add((byte)4, RoomName); // joins the random room
            operationParameters.Add((byte)5, LobbyName); // sets a lobby for this game

            if (!this.usePhoton.Player.gameObject.GetComponent<PlayerLocal>())
                {
                    // create a player Transform instance
                    this.PlayerLocal = this.usePhoton.Player.gameObject.AddComponent<PlayerLocal>();
                    this.PlayerLocal.Initialize(this);
                    this.PlayerLocal.name += this.LocalPlayer.playerID;

                    this.chatScreen = this.usePhoton.chatScreen;
                    this.chatScreen.NameSender = this.LocalPlayer.name;
                }
            
         Hashtable properties = this.PlayerLocal.GetProperties();
         operationParameters.Add((byte)14, properties);
         operationParameters.Add((byte)13, true);
            this.peer.OpCustom((byte)LiteOpCode.Join, operationParameters, true);
         this.chatScreen.Initialize(this);
        }
       
      // Disconnect from the server.
        internal void Disconnect()
        {
                if (this.peer != null)
                {
                    this.peer.Disconnect();   //this will dump all prepared outgoing data and immediately send a "disconnect"
                }
      }

        public void Service()
      {
            this.peer.Service();
        }

        // Simple "help" function to print current list of players.
        // As this function uses the players list, make sure it's not called while
        // peer.DispatchIncomingCommands() might modify the list!! (e.g. by lock(this))
        public void PrintPlayers()
        {
            string players = "Players: ";
            foreach (Player p in this.Players.Values)
            {
                players += p.ToString() + ", ";
            }
           
            this.DebugReturn(players);
        }

        // This is only used by the game / application, not by the Photon library
        public void DebugReturn(string debug)
        {
            this.DebugListeners(debug);
        }

        #endregion
    }
Аватара пользователя
NWOS
UNIт
 
Сообщения: 70
Зарегистрирован: 22 июн 2011, 12:51
Откуда: Украина

Re: Мультиплеер

Сообщение ElPax 12 июл 2011, 00:40

это же пример для буткампа с фотона ? тогда и мне интерестно. Хотя зачем те такое сервак фотона всеравно прийдеться подымать. или я нерпавильно понял что то ?
ElPax
UNIт
 
Сообщения: 50
Зарегистрирован: 17 июн 2011, 19:21

Re: Мультиплеер

Сообщение NWOS 12 июл 2011, 07:00

Да ето BootCamp я скачал пакет для него (мультиплеер пакет).А что в нем нетак?Мб тогда подскажеш готовый мультиплеер с созданием сервера к примеру ну как в кс?
Аватара пользователя
NWOS
UNIт
 
Сообщения: 70
Зарегистрирован: 22 июн 2011, 12:51
Откуда: Украина

Re: Мультиплеер

Сообщение ElPax 12 июл 2011, 09:06

Ну просто при Фотоне ты подымаеш их сервак а уже в игре идет система лобби тоесть создания сервера как комнаты\потока человеком который играет. Для твоей нужды найди новый M2H Networking именно новый он идет под юньку 3. Ссылку дать извени немогу потому что он платный. Но он уже есть в паблике просто поищи.
ElPax
UNIт
 
Сообщения: 50
Зарегистрирован: 17 июн 2011, 19:21

Re: Мультиплеер

Сообщение NWOS 12 июл 2011, 18:12

Помойму нашёл - http://www.unity3d.ru/distribution/view ... =11&t=2220

Извени конешно за мою тупость, не всё понялч то ты написал, мне главное скажи етот мультиплеер готовый то что мне нужно?Или мне прийдется его дописывать там создание сервера и т д :-\
Аватара пользователя
NWOS
UNIт
 
Сообщения: 70
Зарегистрирован: 22 июн 2011, 12:51
Откуда: Украина

Re: Мультиплеер

Сообщение ElPax 12 июл 2011, 18:18

То что ты нашол старая версия но для учебы сойдет. Да там есть все что ты хочеш. Там помоему 4 примера. 1. Шутер 2. Чат. 3.Лобби 4.Дедикатед сервер как в контре.
ElPax
UNIт
 
Сообщения: 50
Зарегистрирован: 17 июн 2011, 19:21

Re: Мультиплеер

Сообщение ElPax 12 июл 2011, 18:20

Ой тю недосмотрел это еще и просто туториал :) Дам наводку. Смотри тут http://forum.rl-team.net/forumdisplay.php?f=67.
ElPax
UNIт
 
Сообщения: 50
Зарегистрирован: 17 июн 2011, 19:21

Re: Мультиплеер

Сообщение NWOS 12 июл 2011, 18:44

Можеш дать полную сылку на тему? :-s
Аватара пользователя
NWOS
UNIт
 
Сообщения: 70
Зарегистрирован: 22 июн 2011, 12:51
Откуда: Украина

Re: Мультиплеер

Сообщение ElPax 12 июл 2011, 20:48

ElPax
UNIт
 
Сообщения: 50
Зарегистрирован: 17 июн 2011, 19:21

Re: Мультиплеер

Сообщение NWOS 12 июл 2011, 21:42

По той сылке что ты дал я там уже был,
Еще по етой http://forum.unity3d.com/threads/75385 там небесплатно 8-x
Аватара пользователя
NWOS
UNIт
 
Сообщения: 70
Зарегистрирован: 22 июн 2011, 12:51
Откуда: Украина

Re: Мультиплеер

Сообщение ElPax 12 июл 2011, 21:51

по той ссылке что я дал бесплатно но под хайдом в 50 сообщений попроси у кого то ссылку из под хайда там. а та ссылка что у тя - платная полностью это офф ссылка.
ElPax
UNIт
 
Сообщения: 50
Зарегистрирован: 17 июн 2011, 19:21

Re: Мультиплеер

Сообщение NWOS 12 июл 2011, 21:58

У тебя случайно нет 50 сообщений там?
Аватара пользователя
NWOS
UNIт
 
Сообщения: 70
Зарегистрирован: 22 июн 2011, 12:51
Откуда: Украина

Re: Мультиплеер

Сообщение NWOS 13 июл 2011, 11:24

ппц, меня там забанили непонятно за что вопще... :(
можеш если не трудно сылку достать?;(
Аватара пользователя
NWOS
UNIт
 
Сообщения: 70
Зарегистрирован: 22 июн 2011, 12:51
Откуда: Украина

Re: Мультиплеер

Сообщение seaman 13 июл 2011, 12:05

Личка
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Мультиплеер

Сообщение NWOS 13 июл 2011, 19:18

Спасибо :)

закрывайте тему.
Аватара пользователя
NWOS
UNIт
 
Сообщения: 70
Зарегистрирован: 22 июн 2011, 12:51
Откуда: Украина


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 28