//运行时和编辑时获取的方式不一样,运行时直接从实例中取即可,编辑时需要起一个虚拟机来加载序列化信息。 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); }
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); }
//如果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); }
// 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)); }
public void Update(double deltaTime) { LuaEngine.GetInstance().CallLuaFunction(null, this, "onUpdate", true, deltaTime); }
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); }
public void DoOnActorSpawn(Player player) { LuaEngine.GetInstance().CallLuaFunction(player, this, "onSpawn", true); }
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); }