Exemple #1
0
        //运行时和编辑时获取的方式不一样,运行时直接从实例中取即可,编辑时需要起一个虚拟机来加载序列化信息。
        private List <SerializedInfo> GetInfoList()
        {
            List <SerializedInfo> infoList = new List <SerializedInfo>();
            LuaEnv   luaEnv   = null;
            LuaTable luaClass = null;
            LuaTable defineTable;

            if (!Application.isPlaying)
            {
                luaEnv = new LuaEnv();
                luaEnv.AddLoader(LuaEngine.GetInstance().BaseLoader);
                luaEnv.DoString("ExecuteInEditorScript = true");
                var rets = luaEnv.DoString($"return require \"{m_LuaScriptPath.stringValue}\"");
                luaClass = (LuaTable)rets[0];
            }
            else
            {
                var rets = LuaEngine.GetInstance().LuaEnv.DoString($"return require \"{m_LuaScriptPath.stringValue}\"");
                luaClass = (LuaTable)rets[0];
            }
            luaClass.Get("_DefineList", out defineTable);
            defineTable.ForEach <int, LuaTable>((index, infoTable) =>
            {
                SerializedInfo info = new SerializedInfo();
                infoTable.Get("name", out info.ValueName);
                infoTable.Get("type", out info.ValueType);
                infoList.Add(info);
            });
            if (!Application.isPlaying)
            {
                luaEnv.Dispose();
            }
            return(infoList);
        }
        //Moves the actor to the new zone if exists. No packets are sent nor position changed. Merged zone is removed.
        public void DoSeamlessZoneChange(Player player, uint destinationZoneId)
        {
            Area oldZone;

            if (player.zone != null)
            {
                oldZone = player.zone;
                oldZone.RemoveActorFromZone(player);
            }

            //Add player to new zone and update
            Zone newZone = GetZone(destinationZoneId);

            //This server does not contain that zoneId
            if (newZone == null)
            {
                return;
            }

            newZone.AddActorToZone(player);

            player.zone   = newZone;
            player.zoneId = destinationZoneId;

            player.zone2   = null;
            player.zoneId2 = 0;

            player.SendSeamlessZoneInPackets();

            player.SendMessage(0x20, "", "Doing Seamless Zone Change");

            LuaEngine.GetInstance().CallLuaFunction(player, newZone, "onZoneIn", true);
        }
Exemple #3
0
        public void DoCompletionCheck()
        {
            List <LuaParam> returned = LuaEngine.GetInstance().CallLuaFunctionForReturn(owner, this, "isObjectivesComplete", true);

            if (returned != null && returned.Count >= 1 && returned[0].typeID == 3)
            {
                owner.SendDataPacket("attention", Server.GetWorldManager().GetActor(), "", 25225, (object)GetQuestId());
                owner.SendGameMessage(Server.GetWorldManager().GetActor(), 25225, 0x20, (object)GetQuestId());
            }
        }
        //Moves actor to new zone, and sends packets to spawn at the given coords.
        public void DoZoneChangeContent(Player player, PrivateAreaContent contentArea, float spawnX, float spawnY, float spawnZ, float spawnRotation, ushort spawnType = SetActorPositionPacket.SPAWNTYPE_WARP_DUTY)
        {
            //Content area was null
            if (contentArea == null)
            {
                Program.Log.Debug("Request to change to content area not on this server by: {0}.", player.customDisplayName);
                return;
            }

            player.playerSession.LockUpdates(true);

            Area oldZone = player.zone;

            //Remove player from currentZone if transfer else it's login
            if (player.zone != null)
            {
                oldZone.RemoveActorFromZone(player);
            }

            contentArea.AddActorToZone(player);

            //Update player actor's properties
            player.zoneId = contentArea.GetParentZone().actorId;

            player.privateArea     = contentArea.GetPrivateAreaName();
            player.privateAreaType = contentArea.GetPrivateAreaType();
            player.zone            = contentArea;
            player.positionX       = spawnX;
            player.positionY       = spawnY;
            player.positionZ       = spawnZ;
            player.rotation        = spawnRotation;

            //Send "You have entered an instance" if it's a Private Area
            player.SendGameMessage(GetActor(), 34108, 0x20);

            //Send packets
            player.playerSession.QueuePacket(DeleteAllActorsPacket.BuildPacket(player.actorId));
            player.playerSession.QueuePacket(_0xE2Packet.BuildPacket(player.actorId, 0x10));
            player.SendZoneInPackets(this, spawnType);
            player.playerSession.ClearInstance();
            player.SendInstanceUpdate();

            player.playerSession.LockUpdates(false);



            LuaEngine.GetInstance().CallLuaFunction(player, contentArea, "onZoneIn", true);
        }
 private List <LuaParam> StartCoroutine(string funcName, params object[] args)
 {
     if (directorScript != null)
     {
         if (!directorScript.Globals.Get(funcName).IsNil())
         {
             currentCoroutine = directorScript.CreateCoroutine(directorScript.Globals[funcName]).Coroutine;
             DynValue value = currentCoroutine.Resume(args);
             LuaEngine.GetInstance().ResolveResume(null, currentCoroutine, value);
         }
         else
         {
             Program.Log.Error("Could not find script for director {0}.", GetName());
         }
     }
     return(null);
 }
Exemple #6
0
        //如果Lua文件改变了,则需要重新初始化一遍需要序列化的信息。同时保留已经序列化的数据。
        private void ReloadLua()
        {
            var fullPath = LuaEngine.GetInstance().GetFullLuaPath(m_LuaScriptPath.stringValue);

            if (File.Exists(fullPath))
            {
                long curTime = File.GetLastWriteTime(fullPath).Ticks;
                if (curTime != lastWriteTime)
                {
                    lastWriteTime = curTime;
                    infoList      = GetInfoList();
                    var preObjValues = mLuaBehaviour.SerializedObjValues;
                    var preValues    = mLuaBehaviour.SerializedValues;
                    mLuaBehaviour.SerializedObjValues = new List <LuaBehaviour.SerializedObjValue>();
                    mLuaBehaviour.SerializedValues    = new List <LuaBehaviour.SerializedValue>();
                    foreach (var info in infoList)
                    {
                        if (info.ValueType != null)
                        {
                            if (info.ValueType.IsSubclassOf(typeof(UnityEngine.Object)))
                            {
                                mLuaBehaviour.SerializedObjValues.Add(
                                    new LuaBehaviour.SerializedObjValue()
                                {
                                    key   = info.ValueName,
                                    value = GetObjValueInLuaBehavior(info, preObjValues)
                                });
                            }
                            else
                            {
                                mLuaBehaviour.SerializedValues.Add(
                                    new LuaBehaviour.SerializedValue()
                                {
                                    key     = info.ValueName,
                                    jsonStr = GetValueInLuaBehavior(info, preValues)
                                });
                            }
                        }
                        else
                        {
                            Debug.LogErrorFormat("'{0}' is not registered", info.ValueName);
                        }
                    }
                }
            }
        }
        //Session started, zone into world
        public void DoZoneIn(Player player, bool isLogin, ushort spawnType)
        {
            //Add player to new zone and update
            Area playerArea;

            if (player.privateArea != null)
            {
                playerArea = GetPrivateArea(player.zoneId, player.privateArea, player.privateAreaType);
            }
            else
            {
                playerArea = GetZone(player.zoneId);
            }

            //This server does not contain that zoneId
            if (playerArea == null)
            {
                return;
            }

            //Set the current zone and add player
            player.zone = playerArea;

            playerArea.AddActorToZone(player);

            //Send packets
            if (!isLogin)
            {
                player.playerSession.QueuePacket(DeleteAllActorsPacket.BuildPacket(player.actorId));
                player.playerSession.QueuePacket(_0xE2Packet.BuildPacket(player.actorId, 0x2));
                //player.SendZoneInPackets(this, spawnType);
            }

            player.SendZoneInPackets(this, spawnType);

            player.destinationZone      = 0;
            player.destinationSpawnType = 0;
            Database.SavePlayerPosition(player);

            player.playerSession.LockUpdates(false);

            LuaEngine.GetInstance().CallLuaFunction(player, playerArea, "onZoneIn", true);
        }
        public void OnEventStart(Player player, object[] args)
        {
            object[] args2 = new object[args.Length + (player == null ? 1 : 2)];
            Array.Copy(args, 0, args2, (player == null ? 1 : 2), args.Length);
            if (player != null)
            {
                args2[0] = player;
                args2[1] = this;
            }
            else
            {
                args2[0] = this;
            }

            Coroutine coroutine = directorScript.CreateCoroutine(directorScript.Globals["onEventStarted"]).Coroutine;
            DynValue  value     = coroutine.Resume(args2);

            LuaEngine.GetInstance().ResolveResume(player, coroutine, value);
        }
        public override SubPacket CreateScriptBindPacket()
        {
            List <LuaParam> actualLParams = new List <LuaParam>();

            actualLParams.Insert(0, new LuaParam(2, classPath));
            actualLParams.Insert(1, new LuaParam(4, 4));
            actualLParams.Insert(2, new LuaParam(4, 4));
            actualLParams.Insert(3, new LuaParam(4, 4));
            actualLParams.Insert(4, new LuaParam(4, 4));
            actualLParams.Insert(5, new LuaParam(4, 4));

            List <LuaParam> lparams = LuaEngine.GetInstance().CallLuaFunctionForReturn(null, this, "init", false);

            for (int i = 1; i < lparams.Count; i++)
            {
                actualLParams.Add(lparams[i]);
            }

            return(ActorInstantiatePacket.BuildPacket(actorId, actorName, className, actualLParams));
        }
        //Adds a second zone to pull actors from. Used for an improved seamless zone change.
        public void MergeZones(Player player, uint mergedZoneId)
        {
            //Add player to new zone and update
            Zone mergedZone = GetZone(mergedZoneId);

            //This server does not contain that zoneId
            if (mergedZone == null)
            {
                return;
            }

            mergedZone.AddActorToZone(player);

            player.zone2   = mergedZone;
            player.zoneId2 = mergedZone.actorId;

            player.SendMessage(0x20, "", "Merging Zones");

            LuaEngine.GetInstance().CallLuaFunction(player, mergedZone, "onZoneIn", true);
        }
Exemple #11
0
        // actorClassId, [], [], numBattleCommon, [battleCommon], numEventCommon, [eventCommon], args for either initForBattle/initForEvent
        public override SubPacket CreateScriptBindPacket(Player player)
        {
            List <LuaParam> lParams;

            lParams = LuaEngine.GetInstance().CallLuaFunctionForReturn(player, this, "init", false);

            if (lParams != null && lParams.Count >= 3 && lParams[2].typeID == 0 && (int)lParams[2].value == 0)
            {
                isStatic = true;
            }
            else
            {
                //charaWork.property[2] = 1;
                //npcWork.hateType = 1;
            }

            if (lParams == null)
            {
                string classPathFake = "/Chara/Npc/Populace/PopulaceStandard";
                string classNameFake = "PopulaceStandard";
                lParams  = LuaUtils.CreateLuaParamList(classPathFake, false, false, false, false, false, 0xF47F6, false, false, 0, 0);
                isStatic = true;
                //ActorInstantiatePacket.BuildPacket(actorId, actorName, classNameFake, lParams).DebugPrintSubPacket();
                return(ActorInstantiatePacket.BuildPacket(actorId, actorName, classNameFake, lParams));
            }
            else
            {
                lParams.Insert(0, new LuaParam(2, classPath));
                lParams.Insert(1, new LuaParam(4, 4));
                lParams.Insert(2, new LuaParam(4, 4));
                lParams.Insert(3, new LuaParam(4, 4));
                lParams.Insert(4, new LuaParam(4, 4));
                lParams.Insert(5, new LuaParam(4, 4));
                lParams.Insert(6, new LuaParam(0, (int)actorClassId));
            }

            //ActorInstantiatePacket.BuildPacket(actorId, actorName, className, lParams).DebugPrintSubPacket();
            return(ActorInstantiatePacket.BuildPacket(actorId, actorName, className, lParams));
        }
Exemple #12
0
 public void Update(double deltaTime)
 {
     LuaEngine.GetInstance().CallLuaFunction(null, this, "onUpdate", true, deltaTime);
 }
Exemple #13
0
 public void DoAbandon()
 {
     LuaEngine.GetInstance().CallLuaFunctionForReturn(owner, this, "onAbandonQuest", true);
     owner.SendGameMessage(owner, Server.GetWorldManager().GetActor(), 25236, 0x20, (object)GetQuestId());
 }
 public PrivateAreaContent(Zone parent, string classPath, string privateAreaName, uint privateAreaType, Director director, Player contentStarter) //TODO: Make it a list
     : base(parent, parent.actorId, classPath, privateAreaName, privateAreaType, 0, 0, 0)
 {
     currentDirector = director;
     LuaEngine.GetInstance().CallLuaFunction(contentStarter, this, "onCreate", false, currentDirector);
 }
        public void ProcessPacket(ZoneConnection client, SubPacket subpacket)
        {
            Session session = mServer.GetSession(subpacket.header.sourceId);

            if (session == null && subpacket.gameMessage.opcode != 0x1000)
            {
                return;
            }

            //Normal Game Opcode
            switch (subpacket.gameMessage.opcode)
            {
            //World Server - Error
            case 0x100A:
                ErrorPacket worldError = new ErrorPacket(subpacket.data);
                switch (worldError.errorCode)
                {
                case 0x01:
                    session.GetActor().SendGameMessage(Server.GetWorldManager().GetActor(), 60005, 0x20);
                    break;
                }
                break;

            //World Server - Session Begin
            case 0x1000:
                subpacket.DebugPrintSubPacket();

                SessionBeginPacket beginSessionPacket = new SessionBeginPacket(subpacket.data);

                session = mServer.AddSession(subpacket.header.sourceId);

                if (!beginSessionPacket.isLogin)
                {
                    Server.GetWorldManager().DoZoneIn(session.GetActor(), false, session.GetActor().destinationSpawnType);
                }

                Program.Log.Info("{0} has been added to the session list.", session.GetActor().customDisplayName);

                client.FlushQueuedSendPackets();
                break;

            //World Server - Session End
            case 0x1001:
                SessionEndPacket endSessionPacket = new SessionEndPacket(subpacket.data);

                if (endSessionPacket.destinationZoneId == 0)
                {
                    session.GetActor().CleanupAndSave();
                }
                else
                {
                    session.GetActor().CleanupAndSave(endSessionPacket.destinationZoneId, endSessionPacket.destinationSpawnType, endSessionPacket.destinationX, endSessionPacket.destinationY, endSessionPacket.destinationZ, endSessionPacket.destinationRot);
                }

                Server.GetServer().RemoveSession(session.id);
                Program.Log.Info("{0} has been removed from the session list.", session.GetActor().customDisplayName);

                session.QueuePacket(SessionEndConfirmPacket.BuildPacket(session, endSessionPacket.destinationZoneId));
                client.FlushQueuedSendPackets();
                break;

            //World Server - Party Synch
            case 0x1020:
                PartySyncPacket partySyncPacket = new PartySyncPacket(subpacket.data);
                Server.GetWorldManager().PartyMemberListRecieved(partySyncPacket);
                break;

            //Ping
            case 0x0001:
                //subpacket.DebugPrintSubPacket();
                PingPacket pingPacket = new PingPacket(subpacket.data);
                session.QueuePacket(PongPacket.BuildPacket(session.id, pingPacket.time));
                session.Ping();
                break;

            //Unknown
            case 0x0002:

                subpacket.DebugPrintSubPacket();
                session.QueuePacket(_0x2Packet.BuildPacket(session.id));
                client.FlushQueuedSendPackets();

                break;

            //Chat Received
            case 0x0003:
                ChatMessagePacket chatMessage = new ChatMessagePacket(subpacket.data);
                //Program.Log.Info("Got type-{5} message: {0} @ {1}, {2}, {3}, Rot: {4}", chatMessage.message, chatMessage.posX, chatMessage.posY, chatMessage.posZ, chatMessage.posRot, chatMessage.logType);

                if (chatMessage.message.StartsWith("!"))
                {
                    if (Server.GetCommandProcessor().DoCommand(chatMessage.message, session))
                    {
                        return;
                    }
                    ;
                }

                if (chatMessage.logType == SendMessagePacket.MESSAGE_TYPE_SAY || chatMessage.logType == SendMessagePacket.MESSAGE_TYPE_SHOUT)
                {
                    session.GetActor().BroadcastPacket(SendMessagePacket.BuildPacket(session.id, chatMessage.logType, session.GetActor().customDisplayName, chatMessage.message), false);
                }

                break;

            //Langauge Code (Client safe to send packets to now)
            case 0x0006:
                LangaugeCodePacket langCode = new LangaugeCodePacket(subpacket.data);
                LuaEngine.GetInstance().CallLuaFunction(session.GetActor(), session.GetActor(), "onBeginLogin", true);
                Server.GetWorldManager().DoZoneIn(session.GetActor(), true, 0x1);
                LuaEngine.GetInstance().CallLuaFunction(session.GetActor(), session.GetActor(), "onLogin", true);
                session.languageCode = langCode.languageCode;
                break;

            //Unknown - Happens a lot at login, then once every time player zones
            case 0x0007:
                //subpacket.DebugPrintSubPacket();
                ZoneInCompletePacket zoneInCompletePacket = new ZoneInCompletePacket(subpacket.data);
                break;

            //Update Position
            case 0x00CA:
                //Update Position
                UpdatePlayerPositionPacket posUpdate = new UpdatePlayerPositionPacket(subpacket.data);
                session.UpdatePlayerActorPosition(posUpdate.x, posUpdate.y, posUpdate.z, posUpdate.rot, posUpdate.moveState);
                session.GetActor().SendInstanceUpdate();

                if (session.GetActor().IsInZoneChange())
                {
                    session.GetActor().SetZoneChanging(false);
                }

                break;

            //Set Target
            case 0x00CD:
                //subpacket.DebugPrintSubPacket();

                SetTargetPacket setTarget        = new SetTargetPacket(subpacket.data);
                session.GetActor().currentTarget = setTarget.actorID;
                session.GetActor().BroadcastPacket(SetActorTargetAnimatedPacket.BuildPacket(session.id, setTarget.actorID), true);
                break;

            //Lock Target
            case 0x00CC:
                LockTargetPacket lockTarget            = new LockTargetPacket(subpacket.data);
                session.GetActor().currentLockedTarget = lockTarget.actorID;
                break;

            //Start Event
            case 0x012D:
                subpacket.DebugPrintSubPacket();
                EventStartPacket eventStart = new EventStartPacket(subpacket.data);

                /*
                 * if (eventStart.error != null)
                 * {
                 *  player.errorMessage += eventStart.error;
                 *
                 *  if (eventStart.errorIndex == eventStart.errorNum - 1)
                 *      Program.Log.Error("\n"+player.errorMessage);
                 *
                 *
                 *  break;
                 * }
                 */

                Actor ownerActor = Server.GetStaticActors(eventStart.scriptOwnerActorID);


                session.GetActor().currentEventOwner = eventStart.scriptOwnerActorID;
                session.GetActor().currentEventName  = eventStart.triggerName;


                if (ownerActor == null)
                {
                    //Is it a instance actor?
                    ownerActor = session.GetActor().zone.FindActorInArea(session.GetActor().currentEventOwner);
                    if (ownerActor == null)
                    {
                        //Is it a Director?
                        Director director = session.GetActor().GetDirector(eventStart.scriptOwnerActorID);
                        if (director != null)
                        {
                            ownerActor = director;
                        }
                        else
                        {
                            Program.Log.Debug("\n===Event START===\nCould not find actor 0x{0:X} for event started by caller: 0x{1:X}\nEvent Starter: {2}\nParams: {3}", eventStart.actorID, eventStart.scriptOwnerActorID, eventStart.triggerName, LuaUtils.DumpParams(eventStart.luaParams));
                            break;
                        }
                    }
                }

                session.GetActor().StartEvent(ownerActor, eventStart);

                Program.Log.Debug("\n===Event START===\nSource Actor: 0x{0:X}\nCaller Actor: 0x{1:X}\nVal1: 0x{2:X}\nVal2: 0x{3:X}\nEvent Starter: {4}\nParams: {5}", eventStart.actorID, eventStart.scriptOwnerActorID, eventStart.val1, eventStart.val2, eventStart.triggerName, LuaUtils.DumpParams(eventStart.luaParams));
                break;

            //Unknown, happens at npc spawn and cutscene play????
            case 0x00CE:
                subpacket.DebugPrintSubPacket();
                break;

            //Event Result
            case 0x012E:
                subpacket.DebugPrintSubPacket();
                EventUpdatePacket eventUpdate = new EventUpdatePacket(subpacket.data);
                Program.Log.Debug("\n===Event UPDATE===\nSource Actor: 0x{0:X}\nCaller Actor: 0x{1:X}\nVal1: 0x{2:X}\nVal2: 0x{3:X}\nStep: 0x{4:X}\nParams: {5}", eventUpdate.actorID, eventUpdate.scriptOwnerActorID, eventUpdate.val1, eventUpdate.val2, eventUpdate.step, LuaUtils.DumpParams(eventUpdate.luaParams));

                /*
                 * //Is it a static actor? If not look in the player's instance
                 * Actor updateOwnerActor = Server.GetStaticActors(session.GetActor().currentEventOwner);
                 * if (updateOwnerActor == null)
                 * {
                 *  updateOwnerActor = Server.GetWorldManager().GetActorInWorld(session.GetActor().currentEventOwner);
                 *
                 *  if (session.GetActor().currentDirector != null && session.GetActor().currentEventOwner == session.GetActor().currentDirector.actorId)
                 *      updateOwnerActor = session.GetActor().currentDirector;
                 *
                 *  if (updateOwnerActor == null)
                 *      break;
                 * }
                 */
                session.GetActor().UpdateEvent(eventUpdate);

                //LuaEngine.DoActorOnEventUpdated(session.GetActor(), updateOwnerActor, eventUpdate);

                break;

            case 0x012F:
                subpacket.DebugPrintSubPacket();
                ParameterDataRequestPacket paramRequest = new ParameterDataRequestPacket(subpacket.data);
                if (paramRequest.paramName.Equals("charaWork/exp"))
                {
                    session.GetActor().SendCharaExpInfo();
                }
                break;

            //Group Created Confirm
            case 0x0133:
                GroupCreatedPacket groupCreated = new GroupCreatedPacket(subpacket.data);
                Server.GetWorldManager().SendGroupInit(session, groupCreated.groupId);
                break;

            /* RECRUITMENT */
            //Start Recruiting
            case 0x01C3:
                StartRecruitingRequestPacket recruitRequestPacket = new StartRecruitingRequestPacket(subpacket.data);
                session.QueuePacket(StartRecruitingResponse.BuildPacket(session.id, true));
                break;

            //End Recruiting
            case 0x01C4:
                session.QueuePacket(EndRecruitmentPacket.BuildPacket(session.id));
                break;

            //Party Window Opened, Request State
            case 0x01C5:
                session.QueuePacket(RecruiterStatePacket.BuildPacket(session.id, false, false, 0));
                break;

            //Search Recruiting
            case 0x01C7:
                RecruitmentSearchRequestPacket recruitSearchPacket = new RecruitmentSearchRequestPacket(subpacket.data);
                break;

            //Get Recruitment Details
            case 0x01C8:
                RecruitmentDetailsRequestPacket currentRecruitDetailsPacket = new RecruitmentDetailsRequestPacket(subpacket.data);
                RecruitmentDetails details = new RecruitmentDetails();
                details.recruiterName = "Localhost Character";
                details.purposeId     = 2;
                details.locationId    = 1;
                details.subTaskId     = 1;
                details.comment       = "This is a test details packet sent by the server. No implementation has been Created yet...";
                details.num[0]        = 1;
                session.QueuePacket(CurrentRecruitmentDetailsPacket.BuildPacket(session.id, details));
                break;

            //Accepted Recruiting
            case 0x01C6:
                subpacket.DebugPrintSubPacket();
                break;

            /* SOCIAL STUFF */
            case 0x01C9:
                AddRemoveSocialPacket addBlackList = new AddRemoveSocialPacket(subpacket.data);
                session.QueuePacket(BlacklistAddedPacket.BuildPacket(session.id, true, addBlackList.name));
                break;

            case 0x01CA:
                AddRemoveSocialPacket RemoveBlackList = new AddRemoveSocialPacket(subpacket.data);
                session.QueuePacket(BlacklistRemovedPacket.BuildPacket(session.id, true, RemoveBlackList.name));
                break;

            case 0x01CB:
                int offset1 = 0;
                session.QueuePacket(SendBlacklistPacket.BuildPacket(session.id, new String[] { "Test" }, ref offset1));
                break;

            case 0x01CC:
                AddRemoveSocialPacket addFriendList = new AddRemoveSocialPacket(subpacket.data);
                session.QueuePacket(FriendlistAddedPacket.BuildPacket(session.id, true, (uint)addFriendList.name.GetHashCode(), true, addFriendList.name));
                break;

            case 0x01CD:
                AddRemoveSocialPacket RemoveFriendList = new AddRemoveSocialPacket(subpacket.data);
                session.QueuePacket(FriendlistRemovedPacket.BuildPacket(session.id, true, RemoveFriendList.name));
                break;

            case 0x01CE:
                int offset2 = 0;
                session.QueuePacket(SendFriendlistPacket.BuildPacket(session.id, new Tuple <long, string>[] { new Tuple <long, string>(01, "Test2") }, ref offset2));
                break;

            case 0x01CF:
                session.QueuePacket(FriendStatusPacket.BuildPacket(session.id, null));
                break;

            /* SUPPORT DESK STUFF */
            //Request for FAQ/Info List
            case 0x01D0:
                FaqListRequestPacket faqRequest = new FaqListRequestPacket(subpacket.data);
                session.QueuePacket(FaqListResponsePacket.BuildPacket(session.id, new string[] { "Testing FAQ1", "Coded style!" }));
                break;

            //Request for body of a faq/info selection
            case 0x01D1:
                FaqBodyRequestPacket faqBodyRequest = new FaqBodyRequestPacket(subpacket.data);
                session.QueuePacket(FaqBodyResponsePacket.BuildPacket(session.id, "HERE IS A GIANT BODY. Nothing else to say!"));
                break;

            //Request issue list
            case 0x01D2:
                GMTicketIssuesRequestPacket issuesRequest = new GMTicketIssuesRequestPacket(subpacket.data);
                session.QueuePacket(IssueListResponsePacket.BuildPacket(session.id, new string[] { "Test1", "Test2", "Test3", "Test4", "Test5" }));
                break;

            //Request if GM ticket exists
            case 0x01D3:
                session.QueuePacket(StartGMTicketPacket.BuildPacket(session.id, false));
                break;

            //Request for GM response message
            case 0x01D4:
                session.QueuePacket(GMTicketPacket.BuildPacket(session.id, "This is a GM Ticket Title", "This is a GM Ticket Body."));
                break;

            //GM Ticket Sent
            case 0x01D5:
                GMSupportTicketPacket gmTicket = new GMSupportTicketPacket(subpacket.data);
                Program.Log.Info("Got GM Ticket: \n" + gmTicket.ticketTitle + "\n" + gmTicket.ticketBody);
                session.QueuePacket(GMTicketSentResponsePacket.BuildPacket(session.id, true));
                break;

            //Request to end ticket
            case 0x01D6:
                session.QueuePacket(EndGMTicketPacket.BuildPacket(session.id));
                break;

            default:
                Program.Log.Debug("Unknown command 0x{0:X} received.", subpacket.gameMessage.opcode);
                subpacket.DebugPrintSubPacket();
                break;
            }
        }
 public void OnCommandEvent(Player player, Command command)
 {
     LuaEngine.GetInstance().CallLuaFunction(player, this, "onCommandEvent", false, command);
 }
 public void OnTalkEvent(Player player, Npc npc)
 {
     LuaEngine.GetInstance().CallLuaFunction(player, this, "onTalkEvent", false, npc);
 }
Exemple #18
0
 public void DoOnActorSpawn(Player player)
 {
     LuaEngine.GetInstance().CallLuaFunction(player, this, "onSpawn", true);
 }
Exemple #19
0
        public Npc(int actorNumber, ActorClass actorClass, string uniqueId, Area spawnedArea, float posX, float posY, float posZ, float rot, ushort actorState, uint animationId, string customDisplayName)
            : base((4 << 28 | spawnedArea.actorId << 19 | (uint)actorNumber))
        {
            this.positionX        = posX;
            this.positionY        = posY;
            this.positionZ        = posZ;
            this.rotation         = rot;
            this.currentMainState = actorState;
            this.animationId      = animationId;

            this.displayNameId     = actorClass.displayNameId;
            this.customDisplayName = customDisplayName;

            this.uniqueIdentifier = uniqueId;

            this.zoneId = spawnedArea.actorId;
            this.zone   = spawnedArea;

            this.actorClassId = actorClass.actorClassId;

            this.currentSubState.motionPack = (ushort)animationId;

            LoadNpcAppearance(actorClass.actorClassId);

            className      = actorClass.classPath.Substring(actorClass.classPath.LastIndexOf("/") + 1);
            this.classPath = String.Format("{0}/{1}", actorClass.classPath.Substring(0, actorClass.classPath.LastIndexOf('/')).ToLower(), className);

            charaWork.battleSave.potencial = 1.0f;

            // todo: these really need to be read from db etc
            {
                charaWork.parameterSave.state_mainSkill[0]   = 3;
                charaWork.parameterSave.state_mainSkill[2]   = 3;
                charaWork.parameterSave.state_mainSkillLevel = 1;

                charaWork.parameterSave.hp[0]    = 80;
                charaWork.parameterSave.hpMax[0] = 80;
            }
            for (int i = 0; i < 32; i++)
            {
                charaWork.property[i] = (byte)(((int)actorClass.propertyFlags >> i) & 1);
            }

            npcWork.pushCommand         = actorClass.pushCommand;
            npcWork.pushCommandSub      = actorClass.pushCommandSub;
            npcWork.pushCommandPriority = actorClass.pushCommandPriority;

            if (actorClassId == 1080078 || actorClassId == 1080079 || actorClassId == 1080080 || (actorClassId >= 1080123 && actorClassId <= 1080135) || (actorClassId >= 5000001 && actorClassId <= 5000090) || (actorClassId >= 5900001 && actorClassId <= 5900038))
            {
                isMapObj = true;
                List <LuaParam> lParams = LuaEngine.GetInstance().CallLuaFunctionForReturn(null, this, "init", false);
                if (lParams == null || lParams.Count < 6)
                {
                    isMapObj = false;
                }
                else
                {
                    layout   = (uint)(Int32)lParams[4].value;
                    instance = (uint)(Int32)lParams[5].value;
                    isStatic = true;
                }
            }
            GenerateActorName((int)actorNumber);
            this.aiContainer = new AIContainer(this, null, new PathFind(this), new TargetFind(this));
        }
        //Moves actor to new zone, and sends packets to spawn at the given coords.
        public void DoZoneChange(Player player, uint destinationZoneId, string destinationPrivateArea, int destinationPrivateAreaType, byte spawnType, float spawnX, float spawnY, float spawnZ, float spawnRotation)
        {
            //Add player to new zone and update
            Area newArea;

            if (destinationPrivateArea == null)
            {
                newArea = GetZone(destinationZoneId);
            }
            else //Add check for -1 if it is a instance
            {
                newArea = GetZone(destinationZoneId).GetPrivateArea(destinationPrivateArea, (uint)destinationPrivateAreaType);
            }

            //This server does not contain that zoneId
            if (newArea == null)
            {
                Program.Log.Debug("Request to change to zone not on this server by: {0}.", player.customDisplayName);
                RequestWorldServerZoneChange(player, destinationZoneId, spawnType, spawnX, spawnY, spawnZ, spawnRotation);
                return;
            }

            player.playerSession.LockUpdates(true);

            Area oldZone = player.zone;

            //Remove player from currentZone if transfer else it's login
            if (player.zone != null)
            {
                oldZone.RemoveActorFromZone(player);
            }

            newArea.AddActorToZone(player);

            //Update player actor's properties
            player.zoneId = newArea is PrivateArea ? ((PrivateArea)newArea).GetParentZone().actorId : newArea.actorId;

            player.privateArea     = newArea is PrivateArea ? ((PrivateArea)newArea).GetPrivateAreaName() : null;
            player.privateAreaType = newArea is PrivateArea ? ((PrivateArea)newArea).GetPrivateAreaType() : 0;
            player.zone            = newArea;
            player.positionX       = spawnX;
            player.positionY       = spawnY;
            player.positionZ       = spawnZ;
            player.rotation        = spawnRotation;

            //Delete any GL directors
            GuildleveDirector glDirector = player.GetGuildleveDirector();

            if (glDirector != null)
            {
                player.RemoveDirector(glDirector);
            }

            //Delete content if have
            if (player.currentContentGroup != null)
            {
                player.currentContentGroup.RemoveMember(player.actorId);
                player.SetCurrentContentGroup(null);

                if (oldZone is PrivateAreaContent)
                {
                    ((PrivateAreaContent)oldZone).CheckDestroy();
                }
            }

            //Send packets
            player.playerSession.QueuePacket(DeleteAllActorsPacket.BuildPacket(player.actorId));
            player.playerSession.QueuePacket(_0xE2Packet.BuildPacket(player.actorId, 0x2));
            player.SendZoneInPackets(this, spawnType);
            player.playerSession.ClearInstance();
            player.SendInstanceUpdate();

            player.playerSession.LockUpdates(false);

            //Send "You have entered an instance" if it's a Private Area
            if (newArea is PrivateArea)
            {
                player.SendGameMessage(GetActor(), 34108, 0x20);
            }

            LuaEngine.GetInstance().CallLuaFunction(player, newArea, "onZoneIn", true);
        }