Overhaul of the director system and opening quests. Private Areas further implemented as well.

This commit is contained in:
Filip Maj 2017-03-07 00:09:37 -05:00
parent dcaad5729d
commit e898c045f7
69 changed files with 2602 additions and 1816 deletions

View File

@ -237,7 +237,9 @@ namespace FFXIVClassic_Map_Server
rotation = @rot, rotation = @rot,
destinationZoneId = @destZone, destinationZoneId = @destZone,
destinationSpawnType = @destSpawn, destinationSpawnType = @destSpawn,
currentZoneId = @zoneId currentZoneId = @zoneId,
currentPrivateArea = @privateArea,
currentPrivateAreaType = @privateAreaType
WHERE id = @charaId WHERE id = @charaId
"; ";
@ -248,6 +250,8 @@ namespace FFXIVClassic_Map_Server
cmd.Parameters.AddWithValue("@z", player.positionZ); cmd.Parameters.AddWithValue("@z", player.positionZ);
cmd.Parameters.AddWithValue("@rot", player.rotation); cmd.Parameters.AddWithValue("@rot", player.rotation);
cmd.Parameters.AddWithValue("@zoneId", player.zoneId); cmd.Parameters.AddWithValue("@zoneId", player.zoneId);
cmd.Parameters.AddWithValue("@privateArea", player.privateArea);
cmd.Parameters.AddWithValue("@privateAreaType", player.privateAreaType);
cmd.Parameters.AddWithValue("@destZone", player.destinationZone); cmd.Parameters.AddWithValue("@destZone", player.destinationZone);
cmd.Parameters.AddWithValue("@destSpawn", player.destinationSpawnType); cmd.Parameters.AddWithValue("@destSpawn", player.destinationSpawnType);
@ -327,7 +331,7 @@ namespace FFXIVClassic_Map_Server
VALUES VALUES
(@charaId, @slot, @questId, @questData, @questFlags) (@charaId, @slot, @questId, @questData, @questFlags)
ON DUPLICATE KEY UPDATE ON DUPLICATE KEY UPDATE
questData = @questData, questFlags = @questFlags questId = @questId, questData = @questData, questFlags = @questFlags
"; ";
cmd = new MySqlCommand(query, conn); cmd = new MySqlCommand(query, conn);
@ -385,7 +389,9 @@ namespace FFXIVClassic_Map_Server
achievementPoints, achievementPoints,
playTime, playTime,
destinationZoneId, destinationZoneId,
destinationSpawnType destinationSpawnType,
currentPrivateArea,
currentPrivateAreaType
FROM characters WHERE id = @charId"; FROM characters WHERE id = @charId";
cmd = new MySqlCommand(query, conn); cmd = new MySqlCommand(query, conn);
@ -419,10 +425,17 @@ namespace FFXIVClassic_Map_Server
player.destinationZone = reader.GetUInt32("destinationZoneId"); player.destinationZone = reader.GetUInt32("destinationZoneId");
player.destinationSpawnType = reader.GetByte("destinationSpawnType"); player.destinationSpawnType = reader.GetByte("destinationSpawnType");
if (!reader.IsDBNull(reader.GetOrdinal("currentPrivateArea")))
player.privateArea = reader.GetString("currentPrivateArea");
player.privateAreaType = reader.GetUInt32("currentPrivateAreaType");
if (player.destinationZone != 0) if (player.destinationZone != 0)
player.zoneId = player.destinationZone; player.zoneId = player.destinationZone;
player.zone = Server.GetWorldManager().GetZone(player.zoneId); if (player.privateArea != null && !player.privateArea.Equals(""))
player.zone = Server.GetWorldManager().GetPrivateArea(player.zoneId, player.privateArea, player.privateAreaType);
else
player.zone = Server.GetWorldManager().GetZone(player.zoneId);
} }
} }

View File

@ -152,7 +152,7 @@
<Compile Include="packets\receive\supportdesk\GMSupportTicketPacket.cs" /> <Compile Include="packets\receive\supportdesk\GMSupportTicketPacket.cs" />
<Compile Include="packets\receive\supportdesk\GMTicketIssuesRequestPacket.cs" /> <Compile Include="packets\receive\supportdesk\GMTicketIssuesRequestPacket.cs" />
<Compile Include="packets\receive\_0x02ReceivePacket.cs" /> <Compile Include="packets\receive\_0x02ReceivePacket.cs" />
<Compile Include="packets\receive\_0x07Packet.cs" /> <Compile Include="packets\receive\ZoneInCompletePacket.cs" />
<Compile Include="packets\send\actor\ActorDoEmotePacket.cs" /> <Compile Include="packets\send\actor\ActorDoEmotePacket.cs" />
<Compile Include="packets\send\actor\ActorInstantiatePacket.cs" /> <Compile Include="packets\send\actor\ActorInstantiatePacket.cs" />
<Compile Include="packets\send\actor\ActorSpecialGraphicPacket.cs" /> <Compile Include="packets\send\actor\ActorSpecialGraphicPacket.cs" />

View File

@ -1,48 +1,48 @@
using FFXIVClassic.Common; using FFXIVClassic.Common;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Text; using System.Text;
using FFXIVClassic_Map_Server.dataobjects; using FFXIVClassic_Map_Server.dataobjects;
using FFXIVClassic_Map_Server.packets.receive; using FFXIVClassic_Map_Server.packets.receive;
using FFXIVClassic_Map_Server.packets.send; using FFXIVClassic_Map_Server.packets.send;
using FFXIVClassic_Map_Server.packets.send.login; using FFXIVClassic_Map_Server.packets.send.login;
using FFXIVClassic_Map_Server.packets.send.actor; using FFXIVClassic_Map_Server.packets.send.actor;
using FFXIVClassic_Map_Server.packets.send.supportdesk; using FFXIVClassic_Map_Server.packets.send.supportdesk;
using FFXIVClassic_Map_Server.packets.receive.social; using FFXIVClassic_Map_Server.packets.receive.social;
using FFXIVClassic_Map_Server.packets.send.social; using FFXIVClassic_Map_Server.packets.send.social;
using FFXIVClassic_Map_Server.packets.receive.supportdesk; using FFXIVClassic_Map_Server.packets.receive.supportdesk;
using FFXIVClassic_Map_Server.packets.receive.recruitment; using FFXIVClassic_Map_Server.packets.receive.recruitment;
using FFXIVClassic_Map_Server.packets.send.recruitment; using FFXIVClassic_Map_Server.packets.send.recruitment;
using FFXIVClassic_Map_Server.packets.receive.events; using FFXIVClassic_Map_Server.packets.receive.events;
using FFXIVClassic_Map_Server.lua; using FFXIVClassic_Map_Server.lua;
using FFXIVClassic_Map_Server.Actors; using FFXIVClassic_Map_Server.Actors;
using FFXIVClassic_Map_Server.packets.WorldPackets.Send; using FFXIVClassic_Map_Server.packets.WorldPackets.Send;
using FFXIVClassic_Map_Server.packets.WorldPackets.Receive; using FFXIVClassic_Map_Server.packets.WorldPackets.Receive;
using FFXIVClassic_Map_Server.actors.director; using FFXIVClassic_Map_Server.actors.director;
namespace FFXIVClassic_Map_Server namespace FFXIVClassic_Map_Server
{ {
class PacketProcessor class PacketProcessor
{ {
Server mServer; Server mServer;
public PacketProcessor(Server server) public PacketProcessor(Server server)
{ {
mServer = server; mServer = server;
} }
public void ProcessPacket(ZoneConnection client, SubPacket subpacket) public void ProcessPacket(ZoneConnection client, SubPacket subpacket)
{ {
Session session = mServer.GetSession(subpacket.header.targetId); Session session = mServer.GetSession(subpacket.header.targetId);
if (session == null && subpacket.gameMessage.opcode != 0x1000) if (session == null && subpacket.gameMessage.opcode != 0x1000)
return; return;
//Normal Game Opcode //Normal Game Opcode
switch (subpacket.gameMessage.opcode) switch (subpacket.gameMessage.opcode)
{ {
//World Server - Error //World Server - Error
case 0x100A: case 0x100A:
ErrorPacket worldError = new ErrorPacket(subpacket.data); ErrorPacket worldError = new ErrorPacket(subpacket.data);
@ -52,8 +52,8 @@ namespace FFXIVClassic_Map_Server
session.GetActor().SendGameMessage(Server.GetWorldManager().GetActor(), 60005, 0x20); session.GetActor().SendGameMessage(Server.GetWorldManager().GetActor(), 60005, 0x20);
break; break;
} }
break; break;
//World Server - Session Begin //World Server - Session Begin
case 0x1000: case 0x1000:
subpacket.DebugPrintSubPacket(); subpacket.DebugPrintSubPacket();
session = mServer.AddSession(subpacket.header.targetId); session = mServer.AddSession(subpacket.header.targetId);
@ -83,264 +83,266 @@ namespace FFXIVClassic_Map_Server
//World Server - Party Synch //World Server - Party Synch
case 0x1020: case 0x1020:
PartySyncPacket partySyncPacket = new PartySyncPacket(subpacket.data); PartySyncPacket partySyncPacket = new PartySyncPacket(subpacket.data);
Server.GetWorldManager().PartyMemberListRecieved(partySyncPacket); Server.GetWorldManager().PartyMemberListRecieved(partySyncPacket);
break; break;
//Ping //Ping
case 0x0001: case 0x0001:
//subpacket.DebugPrintSubPacket(); //subpacket.DebugPrintSubPacket();
PingPacket pingPacket = new PingPacket(subpacket.data); PingPacket pingPacket = new PingPacket(subpacket.data);
client.QueuePacket(BasePacket.CreatePacket(PongPacket.BuildPacket(session.id, pingPacket.time), true, false)); client.QueuePacket(BasePacket.CreatePacket(PongPacket.BuildPacket(session.id, pingPacket.time), true, false));
session.Ping(); session.Ping();
break; break;
//Unknown //Unknown
case 0x0002: case 0x0002:
subpacket.DebugPrintSubPacket(); subpacket.DebugPrintSubPacket();
client.QueuePacket(_0x2Packet.BuildPacket(session.id), true, false); client.QueuePacket(_0x2Packet.BuildPacket(session.id), true, false);
client.FlushQueuedSendPackets(); client.FlushQueuedSendPackets();
break; break;
//Chat Received //Chat Received
case 0x0003: case 0x0003:
ChatMessagePacket chatMessage = new ChatMessagePacket(subpacket.data); 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); //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 (chatMessage.message.StartsWith("!"))
{ {
if (Server.GetCommandProcessor().DoCommand(chatMessage.message, session)) if (Server.GetCommandProcessor().DoCommand(chatMessage.message, session))
return; ; return; ;
} }
if (chatMessage.logType == SendMessagePacket.MESSAGE_TYPE_SAY || chatMessage.logType == SendMessagePacket.MESSAGE_TYPE_SHOUT) if (chatMessage.logType == SendMessagePacket.MESSAGE_TYPE_SAY || chatMessage.logType == SendMessagePacket.MESSAGE_TYPE_SHOUT)
session.GetActor().BroadcastPacket(SendMessagePacket.BuildPacket(session.id, session.id, chatMessage.logType, session.GetActor().customDisplayName, chatMessage.message), false); session.GetActor().BroadcastPacket(SendMessagePacket.BuildPacket(session.id, session.id, chatMessage.logType, session.GetActor().customDisplayName, chatMessage.message), false);
break; break;
//Langauge Code (Client safe to send packets to now) //Langauge Code (Client safe to send packets to now)
case 0x0006: case 0x0006:
LangaugeCodePacket langCode = new LangaugeCodePacket(subpacket.data); LangaugeCodePacket langCode = new LangaugeCodePacket(subpacket.data);
session = mServer.AddSession(subpacket.header.targetId); session = mServer.AddSession(subpacket.header.targetId);
LuaEngine.OnBeginLogin(session.GetActor()); LuaEngine.OnBeginLogin(session.GetActor());
Server.GetWorldManager().DoZoneIn(session.GetActor(), true, 0x1); Server.GetWorldManager().DoZoneIn(session.GetActor(), true, 0x1);
LuaEngine.OnLogin(session.GetActor()); LuaEngine.OnLogin(session.GetActor());
session.languageCode = langCode.languageCode; session.languageCode = langCode.languageCode;
break; break;
//Unknown - Happens a lot at login, then once every time player zones //Unknown - Happens a lot at login, then once every time player zones
case 0x0007: case 0x0007:
//subpacket.DebugPrintSubPacket(); subpacket.DebugPrintSubPacket();
_0x07Packet unknown07 = new _0x07Packet(subpacket.data); ZoneInCompletePacket zoneInCompletePacket = new ZoneInCompletePacket(subpacket.data);
break; LuaEngine.OnZoneInDone(session.GetActor());
//Update Position break;
case 0x00CA: //Update Position
//Update Position case 0x00CA:
UpdatePlayerPositionPacket posUpdate = new UpdatePlayerPositionPacket(subpacket.data); //Update Position
session.UpdatePlayerActorPosition(posUpdate.x, posUpdate.y, posUpdate.z, posUpdate.rot, posUpdate.moveState); UpdatePlayerPositionPacket posUpdate = new UpdatePlayerPositionPacket(subpacket.data);
session.GetActor().SendInstanceUpdate(); session.UpdatePlayerActorPosition(posUpdate.x, posUpdate.y, posUpdate.z, posUpdate.rot, posUpdate.moveState);
session.GetActor().SendInstanceUpdate();
if (session.GetActor().IsInZoneChange())
session.GetActor().SetZoneChanging(false); if (session.GetActor().IsInZoneChange())
session.GetActor().SetZoneChanging(false);
break;
//Set Target break;
case 0x00CD: //Set Target
//subpacket.DebugPrintSubPacket(); case 0x00CD:
//subpacket.DebugPrintSubPacket();
SetTargetPacket setTarget = new SetTargetPacket(subpacket.data);
session.GetActor().currentTarget = setTarget.actorID; SetTargetPacket setTarget = new SetTargetPacket(subpacket.data);
session.GetActor().BroadcastPacket(SetActorTargetAnimatedPacket.BuildPacket(session.id, session.id, setTarget.actorID), true); session.GetActor().currentTarget = setTarget.actorID;
break; session.GetActor().BroadcastPacket(SetActorTargetAnimatedPacket.BuildPacket(session.id, session.id, setTarget.actorID), true);
//Lock Target break;
case 0x00CC: //Lock Target
LockTargetPacket lockTarget = new LockTargetPacket(subpacket.data); case 0x00CC:
session.GetActor().currentLockedTarget = lockTarget.actorID; LockTargetPacket lockTarget = new LockTargetPacket(subpacket.data);
break; session.GetActor().currentLockedTarget = lockTarget.actorID;
//Start Event break;
case 0x012D: //Start Event
subpacket.DebugPrintSubPacket(); case 0x012D:
EventStartPacket eventStart = new EventStartPacket(subpacket.data); subpacket.DebugPrintSubPacket();
EventStartPacket eventStart = new EventStartPacket(subpacket.data);
/*
if (eventStart.error != null) /*
{ if (eventStart.error != null)
player.errorMessage += eventStart.error; {
player.errorMessage += eventStart.error;
if (eventStart.errorIndex == eventStart.errorNum - 1)
Program.Log.Error("\n"+player.errorMessage); if (eventStart.errorIndex == eventStart.errorNum - 1)
Program.Log.Error("\n"+player.errorMessage);
break;
} break;
*/ }
*/
Actor ownerActor = Server.GetStaticActors(eventStart.scriptOwnerActorID);
Actor ownerActor = Server.GetStaticActors(eventStart.scriptOwnerActorID);
session.GetActor().currentEventOwner = eventStart.scriptOwnerActorID;
session.GetActor().currentEventName = eventStart.triggerName; session.GetActor().currentEventOwner = eventStart.scriptOwnerActorID;
session.GetActor().currentEventName = eventStart.triggerName;
if (ownerActor == null)
{ if (ownerActor == null)
//Is it a instance actor? {
ownerActor = Server.GetWorldManager().GetActorInWorld(session.GetActor().currentEventOwner); //Is it a instance actor?
if (ownerActor == null) ownerActor = session.GetActor().zone.FindActorInZone(session.GetActor().currentEventOwner);
{ if (ownerActor == null)
{
//Is it a Director? //Is it a Director?
Director director = session.GetActor().GetDirector(eventStart.scriptOwnerActorID); Director director = session.GetActor().GetDirector(eventStart.scriptOwnerActorID);
if (director != null) if (director != null)
ownerActor = director; ownerActor = director;
else 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)); 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; break;
} }
} }
} }
session.GetActor().StartEvent(ownerActor, eventStart); 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)); 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; break;
//Unknown, happens at npc spawn and cutscene play???? //Unknown, happens at npc spawn and cutscene play????
case 0x00CE: case 0x00CE:
break; subpacket.DebugPrintSubPacket();
//Event Result break;
case 0x012E: //Event Result
subpacket.DebugPrintSubPacket(); case 0x012E:
EventUpdatePacket eventUpdate = new EventUpdatePacket(subpacket.data); subpacket.DebugPrintSubPacket();
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)); 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); //Is it a static actor? If not look in the player's instance
if (updateOwnerActor == null) Actor updateOwnerActor = Server.GetStaticActors(session.GetActor().currentEventOwner);
{ if (updateOwnerActor == null)
updateOwnerActor = Server.GetWorldManager().GetActorInWorld(session.GetActor().currentEventOwner); {
updateOwnerActor = Server.GetWorldManager().GetActorInWorld(session.GetActor().currentEventOwner);
if (session.GetActor().currentDirector != null && session.GetActor().currentEventOwner == session.GetActor().currentDirector.actorId)
updateOwnerActor = session.GetActor().currentDirector; if (session.GetActor().currentDirector != null && session.GetActor().currentEventOwner == session.GetActor().currentDirector.actorId)
updateOwnerActor = session.GetActor().currentDirector;
if (updateOwnerActor == null)
break; if (updateOwnerActor == null)
} break;
*/ }
session.GetActor().UpdateEvent(eventUpdate); */
session.GetActor().UpdateEvent(eventUpdate);
//LuaEngine.DoActorOnEventUpdated(session.GetActor(), updateOwnerActor, eventUpdate);
//LuaEngine.DoActorOnEventUpdated(session.GetActor(), updateOwnerActor, eventUpdate);
break;
case 0x012F: break;
subpacket.DebugPrintSubPacket(); case 0x012F:
ParameterDataRequestPacket paramRequest = new ParameterDataRequestPacket(subpacket.data); subpacket.DebugPrintSubPacket();
if (paramRequest.paramName.Equals("charaWork/exp")) ParameterDataRequestPacket paramRequest = new ParameterDataRequestPacket(subpacket.data);
session.GetActor().SendCharaExpInfo(); if (paramRequest.paramName.Equals("charaWork/exp"))
session.GetActor().SendCharaExpInfo();
break; break;
//Group Created Confirm //Group Created Confirm
case 0x0133: case 0x0133:
GroupCreatedPacket groupCreated = new GroupCreatedPacket(subpacket.data); GroupCreatedPacket groupCreated = new GroupCreatedPacket(subpacket.data);
break; break;
/* RECRUITMENT */ /* RECRUITMENT */
//Start Recruiting //Start Recruiting
case 0x01C3: case 0x01C3:
StartRecruitingRequestPacket recruitRequestPacket = new StartRecruitingRequestPacket(subpacket.data); StartRecruitingRequestPacket recruitRequestPacket = new StartRecruitingRequestPacket(subpacket.data);
client.QueuePacket(BasePacket.CreatePacket(StartRecruitingResponse.BuildPacket(session.id, true), true, false)); client.QueuePacket(BasePacket.CreatePacket(StartRecruitingResponse.BuildPacket(session.id, true), true, false));
break; break;
//End Recruiting //End Recruiting
case 0x01C4: case 0x01C4:
client.QueuePacket(BasePacket.CreatePacket(EndRecruitmentPacket.BuildPacket(session.id), true, false)); client.QueuePacket(BasePacket.CreatePacket(EndRecruitmentPacket.BuildPacket(session.id), true, false));
break; break;
//Party Window Opened, Request State //Party Window Opened, Request State
case 0x01C5: case 0x01C5:
client.QueuePacket(BasePacket.CreatePacket(RecruiterStatePacket.BuildPacket(session.id, false, false, 0), true, false)); client.QueuePacket(BasePacket.CreatePacket(RecruiterStatePacket.BuildPacket(session.id, false, false, 0), true, false));
break; break;
//Search Recruiting //Search Recruiting
case 0x01C7: case 0x01C7:
RecruitmentSearchRequestPacket recruitSearchPacket = new RecruitmentSearchRequestPacket(subpacket.data); RecruitmentSearchRequestPacket recruitSearchPacket = new RecruitmentSearchRequestPacket(subpacket.data);
break; break;
//Get Recruitment Details //Get Recruitment Details
case 0x01C8: case 0x01C8:
RecruitmentDetailsRequestPacket currentRecruitDetailsPacket = new RecruitmentDetailsRequestPacket(subpacket.data); RecruitmentDetailsRequestPacket currentRecruitDetailsPacket = new RecruitmentDetailsRequestPacket(subpacket.data);
RecruitmentDetails details = new RecruitmentDetails(); RecruitmentDetails details = new RecruitmentDetails();
details.recruiterName = "Localhost Character"; details.recruiterName = "Localhost Character";
details.purposeId = 2; details.purposeId = 2;
details.locationId = 1; details.locationId = 1;
details.subTaskId = 1; details.subTaskId = 1;
details.comment = "This is a test details packet sent by the server. No implementation has been Created yet..."; details.comment = "This is a test details packet sent by the server. No implementation has been Created yet...";
details.num[0] = 1; details.num[0] = 1;
client.QueuePacket(BasePacket.CreatePacket(CurrentRecruitmentDetailsPacket.BuildPacket(session.id, details), true, false)); client.QueuePacket(BasePacket.CreatePacket(CurrentRecruitmentDetailsPacket.BuildPacket(session.id, details), true, false));
break; break;
//Accepted Recruiting //Accepted Recruiting
case 0x01C6: case 0x01C6:
subpacket.DebugPrintSubPacket(); subpacket.DebugPrintSubPacket();
break; break;
/* SOCIAL STUFF */ /* SOCIAL STUFF */
case 0x01C9: case 0x01C9:
AddRemoveSocialPacket addBlackList = new AddRemoveSocialPacket(subpacket.data); AddRemoveSocialPacket addBlackList = new AddRemoveSocialPacket(subpacket.data);
client.QueuePacket(BasePacket.CreatePacket(BlacklistAddedPacket.BuildPacket(session.id, true, addBlackList.name), true, false)); client.QueuePacket(BasePacket.CreatePacket(BlacklistAddedPacket.BuildPacket(session.id, true, addBlackList.name), true, false));
break; break;
case 0x01CA: case 0x01CA:
AddRemoveSocialPacket RemoveBlackList = new AddRemoveSocialPacket(subpacket.data); AddRemoveSocialPacket RemoveBlackList = new AddRemoveSocialPacket(subpacket.data);
client.QueuePacket(BasePacket.CreatePacket(BlacklistRemovedPacket.BuildPacket(session.id, true, RemoveBlackList.name), true, false)); client.QueuePacket(BasePacket.CreatePacket(BlacklistRemovedPacket.BuildPacket(session.id, true, RemoveBlackList.name), true, false));
break; break;
case 0x01CB: case 0x01CB:
int offset1 = 0; int offset1 = 0;
client.QueuePacket(BasePacket.CreatePacket(SendBlacklistPacket.BuildPacket(session.id, new String[] { "Test" }, ref offset1), true, false)); client.QueuePacket(BasePacket.CreatePacket(SendBlacklistPacket.BuildPacket(session.id, new String[] { "Test" }, ref offset1), true, false));
break; break;
case 0x01CC: case 0x01CC:
AddRemoveSocialPacket addFriendList = new AddRemoveSocialPacket(subpacket.data); AddRemoveSocialPacket addFriendList = new AddRemoveSocialPacket(subpacket.data);
client.QueuePacket(BasePacket.CreatePacket(FriendlistAddedPacket.BuildPacket(session.id, true, (uint)addFriendList.name.GetHashCode(), true, addFriendList.name), true, false)); client.QueuePacket(BasePacket.CreatePacket(FriendlistAddedPacket.BuildPacket(session.id, true, (uint)addFriendList.name.GetHashCode(), true, addFriendList.name), true, false));
break; break;
case 0x01CD: case 0x01CD:
AddRemoveSocialPacket RemoveFriendList = new AddRemoveSocialPacket(subpacket.data); AddRemoveSocialPacket RemoveFriendList = new AddRemoveSocialPacket(subpacket.data);
client.QueuePacket(BasePacket.CreatePacket(FriendlistRemovedPacket.BuildPacket(session.id, true, RemoveFriendList.name), true, false)); client.QueuePacket(BasePacket.CreatePacket(FriendlistRemovedPacket.BuildPacket(session.id, true, RemoveFriendList.name), true, false));
break; break;
case 0x01CE: case 0x01CE:
int offset2 = 0; int offset2 = 0;
client.QueuePacket(BasePacket.CreatePacket(SendFriendlistPacket.BuildPacket(session.id, new Tuple<long, string>[] { new Tuple<long, string>(01, "Test2") }, ref offset2), true, false)); client.QueuePacket(BasePacket.CreatePacket(SendFriendlistPacket.BuildPacket(session.id, new Tuple<long, string>[] { new Tuple<long, string>(01, "Test2") }, ref offset2), true, false));
break; break;
case 0x01CF: case 0x01CF:
client.QueuePacket(BasePacket.CreatePacket(FriendStatusPacket.BuildPacket(session.id, null), true, false)); client.QueuePacket(BasePacket.CreatePacket(FriendStatusPacket.BuildPacket(session.id, null), true, false));
break; break;
/* SUPPORT DESK STUFF */ /* SUPPORT DESK STUFF */
//Request for FAQ/Info List //Request for FAQ/Info List
case 0x01D0: case 0x01D0:
FaqListRequestPacket faqRequest = new FaqListRequestPacket(subpacket.data); FaqListRequestPacket faqRequest = new FaqListRequestPacket(subpacket.data);
client.QueuePacket(BasePacket.CreatePacket(FaqListResponsePacket.BuildPacket(session.id, new string[] { "Testing FAQ1", "Coded style!" }), true, false)); client.QueuePacket(BasePacket.CreatePacket(FaqListResponsePacket.BuildPacket(session.id, new string[] { "Testing FAQ1", "Coded style!" }), true, false));
break; break;
//Request for body of a faq/info selection //Request for body of a faq/info selection
case 0x01D1: case 0x01D1:
FaqBodyRequestPacket faqBodyRequest = new FaqBodyRequestPacket(subpacket.data); FaqBodyRequestPacket faqBodyRequest = new FaqBodyRequestPacket(subpacket.data);
client.QueuePacket(BasePacket.CreatePacket(FaqBodyResponsePacket.BuildPacket(session.id, "HERE IS A GIANT BODY. Nothing else to say!"), true, false)); client.QueuePacket(BasePacket.CreatePacket(FaqBodyResponsePacket.BuildPacket(session.id, "HERE IS A GIANT BODY. Nothing else to say!"), true, false));
break; break;
//Request issue list //Request issue list
case 0x01D2: case 0x01D2:
GMTicketIssuesRequestPacket issuesRequest = new GMTicketIssuesRequestPacket(subpacket.data); GMTicketIssuesRequestPacket issuesRequest = new GMTicketIssuesRequestPacket(subpacket.data);
client.QueuePacket(BasePacket.CreatePacket(IssueListResponsePacket.BuildPacket(session.id, new string[] { "Test1", "Test2", "Test3", "Test4", "Test5" }), true, false)); client.QueuePacket(BasePacket.CreatePacket(IssueListResponsePacket.BuildPacket(session.id, new string[] { "Test1", "Test2", "Test3", "Test4", "Test5" }), true, false));
break; break;
//Request if GM ticket exists //Request if GM ticket exists
case 0x01D3: case 0x01D3:
client.QueuePacket(BasePacket.CreatePacket(StartGMTicketPacket.BuildPacket(session.id, false), true, false)); client.QueuePacket(BasePacket.CreatePacket(StartGMTicketPacket.BuildPacket(session.id, false), true, false));
break; break;
//Request for GM response message //Request for GM response message
case 0x01D4: case 0x01D4:
client.QueuePacket(BasePacket.CreatePacket(GMTicketPacket.BuildPacket(session.id, "This is a GM Ticket Title", "This is a GM Ticket Body."), true, false)); client.QueuePacket(BasePacket.CreatePacket(GMTicketPacket.BuildPacket(session.id, "This is a GM Ticket Title", "This is a GM Ticket Body."), true, false));
break; break;
//GM Ticket Sent //GM Ticket Sent
case 0x01D5: case 0x01D5:
GMSupportTicketPacket gmTicket = new GMSupportTicketPacket(subpacket.data); GMSupportTicketPacket gmTicket = new GMSupportTicketPacket(subpacket.data);
Program.Log.Info("Got GM Ticket: \n" + gmTicket.ticketTitle + "\n" + gmTicket.ticketBody); Program.Log.Info("Got GM Ticket: \n" + gmTicket.ticketTitle + "\n" + gmTicket.ticketBody);
client.QueuePacket(BasePacket.CreatePacket(GMTicketSentResponsePacket.BuildPacket(session.id, true), true, false)); client.QueuePacket(BasePacket.CreatePacket(GMTicketSentResponsePacket.BuildPacket(session.id, true), true, false));
break; break;
//Request to end ticket //Request to end ticket
case 0x01D6: case 0x01D6:
client.QueuePacket(BasePacket.CreatePacket(EndGMTicketPacket.BuildPacket(session.id), true, false)); client.QueuePacket(BasePacket.CreatePacket(EndGMTicketPacket.BuildPacket(session.id), true, false));
break; break;
default: default:
Program.Log.Debug("Unknown command 0x{0:X} received.", subpacket.gameMessage.opcode); Program.Log.Debug("Unknown command 0x{0:X} received.", subpacket.gameMessage.opcode);
subpacket.DebugPrintSubPacket(); subpacket.DebugPrintSubPacket();
break; break;
} }
} }
} }
} }

View File

@ -111,6 +111,7 @@ namespace FFXIVClassic_Map_Server
id, id,
parentZoneId, parentZoneId,
privateAreaName, privateAreaName,
privateAreaType,
className, className,
dayMusic, dayMusic,
nightMusic, nightMusic,
@ -129,7 +130,7 @@ namespace FFXIVClassic_Map_Server
if (zoneList.ContainsKey(parentZoneId)) if (zoneList.ContainsKey(parentZoneId))
{ {
Zone parent = zoneList[parentZoneId]; Zone parent = zoneList[parentZoneId];
PrivateArea privArea = new PrivateArea(parent, reader.GetUInt32("id"), reader.GetString("className"), reader.GetString("privateAreaName"), 1, reader.GetUInt16("dayMusic"), reader.GetUInt16("nightMusic"), reader.GetUInt16("battleMusic")); PrivateArea privArea = new PrivateArea(parent, reader.GetUInt32("id"), reader.GetString("className"), reader.GetString("privateAreaName"), reader.GetUInt32("privateAreaType"), reader.GetUInt16("dayMusic"), reader.GetUInt16("nightMusic"), reader.GetUInt16("battleMusic"));
parent.AddPrivateArea(privArea); parent.AddPrivateArea(privArea);
} }
else else
@ -184,7 +185,7 @@ namespace FFXIVClassic_Map_Server
if (!reader.IsDBNull(7)) if (!reader.IsDBNull(7))
privArea = reader.GetString(7); privArea = reader.GetString(7);
ZoneEntrance entance = new ZoneEntrance(reader.GetUInt32(1), privArea, reader.GetByte(2), reader.GetFloat(3), reader.GetFloat(4), reader.GetFloat(5), reader.GetFloat(6)); ZoneEntrance entance = new ZoneEntrance(reader.GetUInt32(1), privArea, 1, reader.GetByte(2), reader.GetFloat(3), reader.GetFloat(4), reader.GetFloat(5), reader.GetFloat(6));
zoneEntranceList[id] = entance; zoneEntranceList[id] = entance;
count++; count++;
} }
@ -548,19 +549,19 @@ namespace FFXIVClassic_Map_Server
} }
ZoneEntrance ze = zoneEntranceList[zoneEntrance]; ZoneEntrance ze = zoneEntranceList[zoneEntrance];
DoZoneChange(player, ze.zoneId, ze.privateAreaName, ze.spawnType, ze.spawnX, ze.spawnY, ze.spawnZ, ze.spawnRotation); DoZoneChange(player, ze.zoneId, ze.privateAreaName, ze.privateAreaType, ze.spawnType, ze.spawnX, ze.spawnY, ze.spawnZ, ze.spawnRotation);
} }
//Moves actor to new zone, and sends packets to spawn at the given coords. //Moves actor to new zone, and sends packets to spawn at the given coords.
public void DoZoneChange(Player player, uint destinationZoneId, string destinationPrivateArea, byte spawnType, float spawnX, float spawnY, float spawnZ, float spawnRotation) 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 //Add player to new zone and update
Area newArea; Area newArea;
if (destinationPrivateArea == null) if (destinationPrivateArea == null)
newArea = GetZone(destinationZoneId); newArea = GetZone(destinationZoneId);
else else //Add check for -1 if it is a instance
newArea = GetZone(destinationZoneId).GetPrivateArea(destinationPrivateArea, 0); newArea = GetZone(destinationZoneId).GetPrivateArea(destinationPrivateArea, (uint)destinationPrivateAreaType);
//This server does not contain that zoneId //This server does not contain that zoneId
if (newArea == null) if (newArea == null)
@ -581,6 +582,9 @@ namespace FFXIVClassic_Map_Server
//Update player actor's properties //Update player actor's properties
player.zoneId = newArea.actorId; player.zoneId = newArea.actorId;
player.privateArea = newArea is PrivateArea ? ((PrivateArea)newArea).GetPrivateAreaName() : null;
player.privateAreaType = newArea is PrivateArea ? ((PrivateArea)newArea).GetPrivateAreaType() : 0;
player.zone = newArea; player.zone = newArea;
player.positionX = spawnX; player.positionX = spawnX;
player.positionY = spawnY; player.positionY = spawnY;
@ -589,11 +593,15 @@ namespace FFXIVClassic_Map_Server
//Send packets //Send packets
player.playerSession.QueuePacket(DeleteAllActorsPacket.BuildPacket(player.actorId), true, false); player.playerSession.QueuePacket(DeleteAllActorsPacket.BuildPacket(player.actorId), true, false);
player.playerSession.QueuePacket(_0xE2Packet.BuildPacket(player.actorId, 0x0), true, false); player.playerSession.QueuePacket(_0xE2Packet.BuildPacket(player.actorId, 0x10), true, false);
player.SendZoneInPackets(this, spawnType); player.SendZoneInPackets(this, spawnType);
player.playerSession.ClearInstance(); player.playerSession.ClearInstance();
player.SendInstanceUpdate(); player.SendInstanceUpdate();
//Send "You have entered an instance" if it's a Private Area
if (newArea is PrivateArea)
player.SendGameMessage(GetActor(), 34108, 0x20);
LuaEngine.OnZoneIn(player); LuaEngine.OnZoneIn(player);
} }
@ -630,7 +638,7 @@ namespace FFXIVClassic_Map_Server
player.rotation = spawnRotation; player.rotation = spawnRotation;
//Send packets //Send packets
player.playerSession.QueuePacket(_0xE2Packet.BuildPacket(player.actorId, 0x0), true, false); player.playerSession.QueuePacket(_0xE2Packet.BuildPacket(player.actorId, 0x10), true, false);
player.playerSession.QueuePacket(player.CreateSpawnTeleportPacket(player.actorId, spawnType), true, false); player.playerSession.QueuePacket(player.CreateSpawnTeleportPacket(player.actorId, spawnType), true, false);
player.SendInstanceUpdate(); player.SendInstanceUpdate();
@ -845,6 +853,17 @@ namespace FFXIVClassic_Map_Server
return null; return null;
} }
public Actor GetActorInWorldByUniqueId(string uid)
{
foreach (Zone zone in zoneList.Values)
{
Actor a = zone.FindActorInZoneByUniqueID(uid);
if (a != null)
return a;
}
return null;
}
public Player GetPCInWorld(uint charId) public Player GetPCInWorld(uint charId)
{ {
foreach (Zone zone in zoneList.Values) foreach (Zone zone in zoneList.Values)
@ -863,6 +882,14 @@ namespace FFXIVClassic_Map_Server
return zoneList[zoneId]; return zoneList[zoneId];
} }
public PrivateArea GetPrivateArea(uint zoneId, string privateArea, uint privateAreaType)
{
if (!zoneList.ContainsKey(zoneId))
return null;
return zoneList[zoneId].GetPrivateArea(privateArea, privateAreaType);
}
public WorldMaster GetActor() public WorldMaster GetActor()
{ {
return worldMaster; return worldMaster;
@ -877,16 +904,18 @@ namespace FFXIVClassic_Map_Server
{ {
public uint zoneId; public uint zoneId;
public string privateAreaName; public string privateAreaName;
public int privateAreaType;
public byte spawnType; public byte spawnType;
public float spawnX; public float spawnX;
public float spawnY; public float spawnY;
public float spawnZ; public float spawnZ;
public float spawnRotation; public float spawnRotation;
public ZoneEntrance(uint zoneId, string privateAreaName, byte spawnType, float x, float y, float z, float rot) public ZoneEntrance(uint zoneId, string privateAreaName, int privateAreaType, byte spawnType, float x, float y, float z, float rot)
{ {
this.zoneId = zoneId; this.zoneId = zoneId;
this.privateAreaName = privateAreaName; this.privateAreaName = privateAreaName;
this.privateAreaType = privateAreaType;
this.spawnType = spawnType; this.spawnType = spawnType;
this.spawnX = x; this.spawnX = x;
this.spawnY = y; this.spawnY = y;

View File

@ -28,6 +28,8 @@ namespace FFXIVClassic_Map_Server.Actors
public float[] moveSpeeds = new float[4]; public float[] moveSpeeds = new float[4];
public uint zoneId, zoneId2; public uint zoneId, zoneId2;
public string privateArea;
public uint privateAreaType;
public Area zone = null; public Area zone = null;
public Area zone2 = null; public Area zone2 = null;
public bool isZoning = false; public bool isZoning = false;
@ -351,7 +353,7 @@ namespace FFXIVClassic_Map_Server.Actors
uint zoneId = zone.actorId; uint zoneId = zone.actorId;
uint privLevel = 0; uint privLevel = 0;
if (zone is PrivateArea) if (zone is PrivateArea)
privLevel = ((PrivateArea)zone).GetPrivateAreaLevel(); privLevel = ((PrivateArea)zone).GetPrivateAreaType();
actorName = String.Format("{0}_{1}_{2}@{3:X3}{4:X2}", className, zoneName, classNumber, zoneId, privLevel); actorName = String.Format("{0}_{1}_{2}@{3:X3}{4:X2}", className, zoneName, classNumber, zoneId, privLevel);
} }

View File

@ -298,6 +298,19 @@ namespace FFXIVClassic_Map_Server.Actors
if (!mActorList.ContainsKey(id)) if (!mActorList.ContainsKey(id))
return null; return null;
return mActorList[id]; return mActorList[id];
}
public Actor FindActorInZoneByUniqueID(string uniqueId)
{
foreach (Actor a in mActorList.Values)
{
if (a is Npc)
{
if (((Npc)a).GetUniqueId().ToLower().Equals(uniqueId))
return a;
}
}
return null;
} }
public Player FindPCInZone(string name) public Player FindPCInZone(string name)
@ -360,7 +373,16 @@ namespace FFXIVClassic_Map_Server.Actors
if (actorClass == null) if (actorClass == null)
return; return;
Npc npc = new Npc(mActorList.Count + 1, actorClass, location.uniqueId, actorId, location.x, location.y, location.z, location.rot, location.state, location.animId, null); uint zoneId;
if (this is PrivateArea)
zoneId = ((PrivateArea)this).GetParentZone().actorId;
else
zoneId = actorId;
Npc npc = new Npc(mActorList.Count + 1, actorClass, location.uniqueId, this, location.x, location.y, location.z, location.rot, location.state, location.animId, null);
npc.LoadEventConditions(actorClass.eventConditions); npc.LoadEventConditions(actorClass.eventConditions);
AddActorToZone(npc); AddActorToZone(npc);

View File

@ -15,14 +15,14 @@ namespace FFXIVClassic_Map_Server.actors.area
{ {
private Zone parentZone; private Zone parentZone;
private string privateAreaName; private string privateAreaName;
private uint privateAreaLevel; private uint privateAreaType;
public PrivateArea(Zone parent, uint id, string className, string privateAreaName, uint privateAreaLevel, ushort bgmDay, ushort bgmNight, ushort bgmBattle) public PrivateArea(Zone parent, uint id, string className, string privateAreaName, uint privateAreaType, ushort bgmDay, ushort bgmNight, ushort bgmBattle)
: base(id, parent.zoneName, parent.regionId, className, bgmDay, bgmNight, bgmBattle, parent.isIsolated, parent.isInn, parent.canRideChocobo, parent.canStealth, true) : base(id, parent.zoneName, parent.regionId, className, bgmDay, bgmNight, bgmBattle, parent.isIsolated, parent.isInn, parent.canRideChocobo, parent.canStealth, true)
{ {
this.parentZone = parent; this.parentZone = parent;
this.privateAreaName = privateAreaName; this.privateAreaName = privateAreaName;
this.privateAreaLevel = privateAreaLevel; this.privateAreaType = privateAreaType;
} }
public string GetPrivateAreaName() public string GetPrivateAreaName()
@ -30,9 +30,9 @@ namespace FFXIVClassic_Map_Server.actors.area
return privateAreaName; return privateAreaName;
} }
public uint GetPrivateAreaLevel() public uint GetPrivateAreaType()
{ {
return privateAreaLevel; return privateAreaType;
} }
public Zone GetParentZone() public Zone GetParentZone()
@ -46,12 +46,11 @@ namespace FFXIVClassic_Map_Server.actors.area
string path = className; string path = className;
if (className.ToLower().Contains("content")) string realClassName = className.Substring(className.LastIndexOf("/") + 1);
path = "Content/" + className;
lParams = LuaUtils.CreateLuaParamList("/Area/PrivateArea/" + path, false, true, zoneName, privateAreaName, 0x9E, canRideChocobo ? (byte)1 : (byte)0, canStealth, isInn, false, false, false, false, false, false); lParams = LuaUtils.CreateLuaParamList("/Area/PrivateArea" + path, false, true, zoneName, privateAreaName, privateAreaType, canRideChocobo ? (byte)1 : (byte)0, canStealth, isInn, false, false, false, false, false, false);
ActorInstantiatePacket.BuildPacket(actorId, playerActorId, actorName, className, lParams).DebugPrintSubPacket(); ActorInstantiatePacket.BuildPacket(actorId, playerActorId, actorName, realClassName, lParams).DebugPrintSubPacket();
return ActorInstantiatePacket.BuildPacket(actorId, playerActorId, actorName, className, lParams); return ActorInstantiatePacket.BuildPacket(actorId, playerActorId, actorName, realClassName, lParams);
} }

View File

@ -16,6 +16,7 @@ namespace FFXIVClassic_Map_Server.actors.area
class Zone : Area class Zone : Area
{ {
Dictionary<string, Dictionary<uint, PrivateArea>> privateAreas = new Dictionary<string, Dictionary<uint, PrivateArea>>(); Dictionary<string, Dictionary<uint, PrivateArea>> privateAreas = new Dictionary<string, Dictionary<uint, PrivateArea>>();
Dictionary<string, List<PrivateArea>> instancedPrivateAreas = new Dictionary<string, List<PrivateArea>>();
public Zone(uint id, string zoneName, ushort regionId, string className, ushort bgmDay, ushort bgmNight, ushort bgmBattle, bool isIsolated, bool isInn, bool canRideChocobo, bool canStealth, bool isInstanceRaid) public Zone(uint id, string zoneName, ushort regionId, string className, ushort bgmDay, ushort bgmNight, ushort bgmBattle, bool isIsolated, bool isInn, bool canRideChocobo, bool canStealth, bool isInstanceRaid)
: base(id, zoneName, regionId, className, bgmDay, bgmNight, bgmBattle, isIsolated, isInn, canRideChocobo, canStealth, isInstanceRaid) : base(id, zoneName, regionId, className, bgmDay, bgmNight, bgmBattle, isIsolated, isInn, canRideChocobo, canStealth, isInstanceRaid)
@ -26,11 +27,11 @@ namespace FFXIVClassic_Map_Server.actors.area
public void AddPrivateArea(PrivateArea pa) public void AddPrivateArea(PrivateArea pa)
{ {
if (privateAreas.ContainsKey(pa.GetPrivateAreaName())) if (privateAreas.ContainsKey(pa.GetPrivateAreaName()))
privateAreas[pa.GetPrivateAreaName()][0] = pa; privateAreas[pa.GetPrivateAreaName()][pa.GetPrivateAreaType()] = pa;
else else
{ {
privateAreas[pa.GetPrivateAreaName()] = new Dictionary<uint, PrivateArea>(); privateAreas[pa.GetPrivateAreaName()] = new Dictionary<uint, PrivateArea>();
privateAreas[pa.GetPrivateAreaName()][0] = pa; privateAreas[pa.GetPrivateAreaName()][pa.GetPrivateAreaType()] = pa;
} }
} }

View File

@ -1,10 +1,10 @@
using FFXIVClassic.Common; using FFXIVClassic.Common;
using FFXIVClassic_Map_Server.actors; using FFXIVClassic_Map_Server.actors;
using FFXIVClassic_Map_Server.actors.area;
using FFXIVClassic_Map_Server.actors.chara.npc; using FFXIVClassic_Map_Server.actors.chara.npc;
using FFXIVClassic_Map_Server.Actors.Chara; using FFXIVClassic_Map_Server.Actors.Chara;
using FFXIVClassic_Map_Server.dataobjects; using FFXIVClassic_Map_Server.dataobjects;
using FFXIVClassic_Map_Server.lua; using FFXIVClassic_Map_Server.lua;
using FFXIVClassic_Map_Server.packets.receive.events; using FFXIVClassic_Map_Server.packets.receive.events;
using FFXIVClassic_Map_Server.packets.send.actor; using FFXIVClassic_Map_Server.packets.send.actor;
using FFXIVClassic_Map_Server.utils; using FFXIVClassic_Map_Server.utils;
@ -27,8 +27,8 @@ namespace FFXIVClassic_Map_Server.Actors
public NpcWork npcWork = new NpcWork(); public NpcWork npcWork = new NpcWork();
public Npc(int actorNumber, ActorClass actorClass, string uniqueId, uint zoneId, float posX, float posY, float posZ, float rot, ushort actorState, uint animationId, string customDisplayName) 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 | zoneId << 19 | (uint)actorNumber)) : base((4 << 28 | spawnedArea.actorId << 19 | (uint)actorNumber))
{ {
this.positionX = posX; this.positionX = posX;
this.positionY = posY; this.positionY = posY;
@ -41,8 +41,8 @@ namespace FFXIVClassic_Map_Server.Actors
this.uniqueIdentifier = uniqueId; this.uniqueIdentifier = uniqueId;
this.zoneId = zoneId; this.zoneId = spawnedArea.actorId;
this.zone = Server.GetWorldManager().GetZone(zoneId); this.zone = spawnedArea;
this.actorClassId = actorClass.actorClassId; this.actorClassId = actorClass.actorClassId;
@ -131,8 +131,12 @@ namespace FFXIVClassic_Map_Server.Actors
subpackets.AddRange(GetEventConditionPackets(playerActorId)); subpackets.AddRange(GetEventConditionPackets(playerActorId));
subpackets.Add(CreateSpeedPacket(playerActorId)); subpackets.Add(CreateSpeedPacket(playerActorId));
subpackets.Add(CreateSpawnPositonPacket(playerActorId, 0x0)); subpackets.Add(CreateSpawnPositonPacket(playerActorId, 0x0));
if (uniqueIdentifier.Equals("door2")) if (uniqueIdentifier.Equals("door1"))
{
subpackets.Add(_0xD8Packet.BuildPacket(actorId, playerActorId, 0xB0D, 0x1af));
}
else if (uniqueIdentifier.Equals("door2"))
{ {
subpackets.Add(_0xD8Packet.BuildPacket(actorId, playerActorId, 0xB09, 0x1af)); subpackets.Add(_0xD8Packet.BuildPacket(actorId, playerActorId, 0xB09, 0x1af));
} }
@ -167,16 +171,16 @@ namespace FFXIVClassic_Map_Server.Actors
} }
else if (actorClassId == 5900013) else if (actorClassId == 5900013)
{ {
uint id = 2; uint id = 201;
uint id2 = 5144; uint id2 = 0x1415;
string val = "fdot"; string val = "fdin";
subpackets.Add(_0xD8Packet.BuildPacket(actorId, playerActorId, id, id2)); subpackets.Add(_0xD8Packet.BuildPacket(actorId, playerActorId, id, id2));
subpackets.Add(_0xD9Packet.BuildPacket(actorId, playerActorId, val)); subpackets.Add(_0xD9Packet.BuildPacket(actorId, playerActorId, val));
} }
else if (actorClassId == 5900014) else if (actorClassId == 5900014)
{ {
uint id = 2; uint id = 201;
uint id2 = 5145; uint id2 = 0x1415;
string val = "fdot"; string val = "fdot";
subpackets.Add(_0xD8Packet.BuildPacket(actorId, playerActorId, id, id2)); subpackets.Add(_0xD8Packet.BuildPacket(actorId, playerActorId, id, id2));
subpackets.Add(_0xD9Packet.BuildPacket(actorId, playerActorId, val)); subpackets.Add(_0xD9Packet.BuildPacket(actorId, playerActorId, val));
@ -374,8 +378,17 @@ namespace FFXIVClassic_Map_Server.Actors
if (File.Exists("./scripts/base/" + classPath + ".lua")) if (File.Exists("./scripts/base/" + classPath + ".lua"))
parent = LuaEngine.LoadScript("./scripts/base/" + classPath + ".lua"); parent = LuaEngine.LoadScript("./scripts/base/" + classPath + ".lua");
if (File.Exists(String.Format("./scripts/unique/{0}/{1}/{2}.lua", zone.zoneName, className, uniqueIdentifier)))
child = LuaEngine.LoadScript(String.Format("./scripts/unique/{0}/{1}/{2}.lua", zone.zoneName, className, uniqueIdentifier)); if (zone is PrivateArea)
{
if (File.Exists(String.Format("./scripts/unique/{0}/privatearea/{1}/{2}/{3}.lua", zone.zoneName, ((PrivateArea)zone).GetPrivateAreaName(), className, uniqueIdentifier)))
child = LuaEngine.LoadScript(String.Format("./scripts/unique/{0}/privatearea/{1}/{2}/{3}.lua", zone.zoneName, ((PrivateArea)zone).GetPrivateAreaName(), className, uniqueIdentifier));
}
else
{
if (File.Exists(String.Format("./scripts/unique/{0}/{1}/{2}.lua", zone.zoneName, className, uniqueIdentifier)))
child = LuaEngine.LoadScript(String.Format("./scripts/unique/{0}/{1}/{2}.lua", zone.zoneName, className, uniqueIdentifier));
}
if (parent == null && child == null) if (parent == null && child == null)
{ {
@ -402,8 +415,16 @@ namespace FFXIVClassic_Map_Server.Actors
if (File.Exists("./scripts/base/" + classPath + ".lua")) if (File.Exists("./scripts/base/" + classPath + ".lua"))
parent = LuaEngine.LoadScript("./scripts/base/" + classPath + ".lua"); parent = LuaEngine.LoadScript("./scripts/base/" + classPath + ".lua");
if (File.Exists(String.Format("./scripts/unique/{0}/{1}/{2}.lua", zone.zoneName, className, uniqueIdentifier))) if (zone is PrivateArea)
child = LuaEngine.LoadScript(String.Format("./scripts/unique/{0}/{1}/{2}.lua", zone.zoneName, className, uniqueIdentifier)); {
if (File.Exists(String.Format("./scripts/unique/{0}/privatearea/{1}/{2}/{3}.lua", zone.zoneName, ((PrivateArea)zone).GetPrivateAreaName(), className, uniqueIdentifier)))
child = LuaEngine.LoadScript(String.Format("./scripts/unique/{0}/privatearea/{1}/{2}/{3}.lua", zone.zoneName, ((PrivateArea)zone).GetPrivateAreaName(), className, uniqueIdentifier));
}
else
{
if (File.Exists(String.Format("./scripts/unique/{0}/{1}/{2}.lua", zone.zoneName, className, uniqueIdentifier)))
child = LuaEngine.LoadScript(String.Format("./scripts/unique/{0}/{1}/{2}.lua", zone.zoneName, className, uniqueIdentifier));
}
if (parent == null && child == null) if (parent == null && child == null)
{ {

File diff suppressed because it is too large Load Diff

View File

@ -68,14 +68,42 @@ namespace FFXIVClassic_Map_Server.actors.director
return BasePacket.CreatePacket(initProperties.BuildPacket(playerActorId, actorId), true, false); return BasePacket.CreatePacket(initProperties.BuildPacket(playerActorId, actorId), true, false);
} }
public void OnTalked(Player player, Npc npc) public void OnTalkEvent(Player player, Npc npc)
{ {
LuaEngine.DoDirectorOnTalked(this, player, npc); if (File.Exists("./scripts/directors/" + directorScriptPath + ".lua"))
{
LuaScript script = LuaEngine.LoadScript("./scripts/directors/" + directorScriptPath + ".lua");
if (script == null)
return;
//Run Script
if (!script.Globals.Get("onTalkEvent").IsNil())
script.Call(script.Globals["onTalkEvent"], player, npc);
}
else
{
LuaEngine.SendError(player, String.Format("ERROR: Could not find script for director {0}.", GetName()));
}
} }
public void OnCommand(Player player, Command command) public void OnCommandEvent(Player player, Command command)
{ {
LuaEngine.DoDirectorOnCommand(this, player, command); if (File.Exists("./scripts/directors/" + directorScriptPath + ".lua"))
{
LuaScript script = LuaEngine.LoadScript("./scripts/directors/" + directorScriptPath + ".lua");
if (script == null)
return;
//Run Script
if (!script.Globals.Get("onCommandEvent").IsNil())
script.Call(script.Globals["onCommandEvent"], player, command);
}
else
{
LuaEngine.SendError(player, String.Format("ERROR: Could not find script for director {0}.", GetName()));
}
} }
public void AddChild(Actor actor) public void AddChild(Actor actor)
@ -186,10 +214,15 @@ namespace FFXIVClassic_Map_Server.actors.director
uint zoneId = zone.actorId; uint zoneId = zone.actorId;
uint privLevel = 0; uint privLevel = 0;
if (zone is PrivateArea) if (zone is PrivateArea)
privLevel = ((PrivateArea)zone).GetPrivateAreaLevel(); privLevel = ((PrivateArea)zone).GetPrivateAreaType();
actorName = String.Format("{0}_{1}_{2}@{3:X3}{4:X2}", className, zoneName, classNumber, zoneId, privLevel); actorName = String.Format("{0}_{1}_{2}@{3:X3}{4:X2}", className, zoneName, classNumber, zoneId, privLevel);
} }
public string GetScriptPath()
{
return directorScriptPath;
}
} }
} }

View File

@ -41,6 +41,11 @@ namespace FFXIVClassic_Map_Server.Actors
//Inform update //Inform update
} }
public uint GetQuestId()
{
return actorId & 0xFFFFF;
}
public object GetQuestData(string dataName) public object GetQuestData(string dataName)
{ {
if (questData.ContainsKey(dataName)) if (questData.ContainsKey(dataName))
@ -52,12 +57,7 @@ namespace FFXIVClassic_Map_Server.Actors
public void ClearQuestData() public void ClearQuestData()
{ {
questData.Clear(); questData.Clear();
} }
public uint GetQuestId()
{
return actorId;
}
public void ClearQuestFlags() public void ClearQuestFlags()
{ {
@ -98,9 +98,11 @@ namespace FFXIVClassic_Map_Server.Actors
return currentPhase; return currentPhase;
} }
public void NextPhase() public void NextPhase(int phaseNumber)
{ {
currentPhase++; currentPhase = phaseNumber;
owner.SendGameMessage(Server.GetWorldManager().GetActor(), 25116, 0x20, (object)GetQuestId());
SaveData();
} }
public uint GetQuestFlags() public uint GetQuestFlags()

View File

@ -173,6 +173,23 @@ namespace FFXIVClassic_Map_Server.lua
} }
} }
public static void OnZoneInDone(Player player)
{
string luaPath = String.Format(FILEPATH_ZONE, player.GetZone().zoneName);
if (File.Exists(luaPath))
{
LuaScript script = LoadScript(luaPath);
if (script == null)
return;
//Run Script
if (!script.Globals.Get("onZoneInDone").IsNil())
script.Call(script.Globals["onZoneInDone"], player.GetZone(), player);
}
}
public static void OnBeginLogin(Player player) public static void OnBeginLogin(Player player)
{ {
if (File.Exists(FILEPATH_PLAYER)) if (File.Exists(FILEPATH_PLAYER))
@ -393,48 +410,6 @@ namespace FFXIVClassic_Map_Server.lua
player.SendMessage(SendMessagePacket.MESSAGE_TYPE_SYSTEM_ERROR, "", message); player.SendMessage(SendMessagePacket.MESSAGE_TYPE_SYSTEM_ERROR, "", message);
player.playerSession.QueuePacket(BasePacket.CreatePacket(SendError, true, false)); player.playerSession.QueuePacket(BasePacket.CreatePacket(SendError, true, false));
} }
internal static void DoDirectorOnTalked(Director director, Player player, Npc npc)
{
string luaPath = String.Format(FILEPATH_DIRECTORS, director.GetName());
if (File.Exists(luaPath))
{
LuaScript script = LoadScript(luaPath);
if (script == null)
return;
//Run Script
if (!script.Globals.Get("onTalked").IsNil())
script.Call(script.Globals["onTalked"], player, npc);
}
else
{
SendError(player, String.Format("ERROR: Could not find script for director {0}.", director.GetName()));
}
}
internal static void DoDirectorOnCommand(Director director, Player player, Command command)
{
string luaPath = String.Format(FILEPATH_DIRECTORS, director.GetName());
if (File.Exists(luaPath))
{
LuaScript script = LoadScript(luaPath);
if (script == null)
return;
//Run Script
if (!script.Globals.Get("onCommand").IsNil())
script.Call(script.Globals["onCommand"], player, command);
}
else
{
SendError(player, String.Format("ERROR: Could not find script for director {0}.", director.GetName()));
}
}
} }
} }

View File

@ -3,13 +3,13 @@ using System.IO;
namespace FFXIVClassic_Map_Server.packets.receive namespace FFXIVClassic_Map_Server.packets.receive
{ {
class _0x07Packet class ZoneInCompletePacket
{ {
public bool invalidPacket = false; public bool invalidPacket = false;
public uint timestamp; public uint timestamp;
public uint unknown; public int unknown;
public _0x07Packet(byte[] data) public ZoneInCompletePacket(byte[] data)
{ {
using (MemoryStream mem = new MemoryStream(data)) using (MemoryStream mem = new MemoryStream(data))
{ {
@ -17,7 +17,7 @@ namespace FFXIVClassic_Map_Server.packets.receive
{ {
try{ try{
timestamp = binReader.ReadUInt32(); timestamp = binReader.ReadUInt32();
unknown = binReader.ReadUInt32(); unknown = binReader.ReadInt32();
} }
catch (Exception){ catch (Exception){
invalidPacket = true; invalidPacket = true;

View File

@ -24,7 +24,7 @@ namespace FFXIVClassic_Map_Server.packets.send.events
binWriter.Write((UInt32)playerActorId); binWriter.Write((UInt32)playerActorId);
binWriter.Write((UInt32)targetActorId); binWriter.Write((UInt32)targetActorId);
int test = 0x75dc8705; //This will crash if set to 0 on pushCommand but not for mining which has to be 0???? int test = 0x75dc1705; //This will crash if set to 0 on pushCommand but not for mining which has to be 0????
binWriter.Write((UInt32)test); binWriter.Write((UInt32)test);
binWriter.Write((UInt32)0x30400000); binWriter.Write((UInt32)0x30400000);

View File

@ -0,0 +1,5 @@
require ("global")
function init(npc)
return true, true, 10, 0, 1, true, false, false, false, false, false, false, false, 0;
end

View File

@ -0,0 +1,5 @@
require ("global")
function init(npc)
return true, true, 10, 0, 1, true, false, false, false, false, false, false, false, 0;
end

View File

@ -0,0 +1,5 @@
require ("global")
function init(npc)
return true, true, 10, 0, 1, true, false, false, false, false, false, false, false, 0;
end

View File

@ -0,0 +1,40 @@
--[[
AetheryteChild Script
Functions:
eventAetheryteChildSelect(showTeleport, parentAetheryteID, animaAmount, animaCost(always 1)): Opens menu
eventAetheryteChildDesion(aetheryteId): "Your homepoint is now X"
processGuildleveBoost(favourCost, currentFavour): Ask: "Invoke the aspect of your Guardian deity to gain a temporary boon for the duration of a levequest."
processGuildlevePlaying(??)
processGuildleveJoin() - Ask: "Do you wish to join your party leader's levequest?"
--]]
require ("global")
function init(npc)
return false, false, 0, 0;
end
function onEventStarted(player, npc, triggerName)
menuChoice = callClientFunction(player, "eventAetheryteChildSelect", true, 1280062, 4, 1);
--Teleport
if (menuChoice == 2) then
--Init Levequest
elseif (menuChoice == -1) then
callClientFunction(player, "eventGLSelect", 0);
--Set Homepoint
elseif (menuChoice == -2) then
--View Faction Standing
elseif (menuChoice == -3) then
end
player:EndEvent();
end

View File

@ -21,11 +21,11 @@ end
function onEventStarted(player, npc, triggerName) function onEventStarted(player, npc, triggerName)
--callClientFunction(player, "eventTalkWelcome", player); callClientFunction(player, "eventTalkWelcome", player);
callClientFunction(player, "eventAskMainMenu", player, 20, true, true, true, true, 4); callClientFunction(player, "eventAskMainMenu", player, 20, true, true, true, true, 4);
callClientFunction(player, "eventTalkMyChocobo", player); --callClientFunction(player, "eventTalkMyChocobo", player);
callClientFunction(player, "eventSetChocoboName", false); --callClientFunction(player, "eventSetChocoboName", false);
callClientFunction(player, "eventAfterChocoboName", player); --callClientFunction(player, "eventAfterChocoboName", player);
player:EndEvent(); player:EndEvent();
end end

View File

@ -42,7 +42,7 @@ function onEventStarted(player, npc, triggerName)
createLinkshell(lsName, crestId); createLinkshell(lsName, crestId);
callClientFunction(player, "eventTalkStepMakeupDone"); callClientFunction(player, "eventTalkStepMakeupDone");
--Modify --Modify
elseif (result == 1) then elseif (result == 4) then
modifyLinkshell(lsName, crestId); modifyLinkshell(lsName, crestId);
callClientFunction(player, "eventTalkStepModifyDone"); callClientFunction(player, "eventTalkStepModifyDone");
--Disband --Disband

68
data/scripts/chocobo.lua Normal file
View File

@ -0,0 +1,68 @@
--[[
Globals referenced in all of the lua scripts
--]]
-- ACTOR STATES
ACTORSTATE_PASSIVE = 0;
ACTORSTATE_DEAD1 = 1;
ACTORSTATE_ACTIVE = 2;
ACTORSTATE_DEAD2 = 3;
ACTORSTATE_SITTING_ONOBJ = 11;
ACTORSTATE_SITTING_ONFLOOR = 13;
ACTORSTATE_MOUNTED = 15;
-- MESSAGE
MESSAGE_TYPE_NONE = 0;
MESSAGE_TYPE_SAY = 1;
MESSAGE_TYPE_SHOUT = 2;
MESSAGE_TYPE_TELL = 3;
MESSAGE_TYPE_PARTY = 4;
MESSAGE_TYPE_LINKSHELL1 = 5;
MESSAGE_TYPE_LINKSHELL2 = 6;
MESSAGE_TYPE_LINKSHELL3 = 7;
MESSAGE_TYPE_LINKSHELL4 = 8;
MESSAGE_TYPE_LINKSHELL5 = 9;
MESSAGE_TYPE_LINKSHELL6 = 10;
MESSAGE_TYPE_LINKSHELL7 = 11;
MESSAGE_TYPE_LINKSHELL8 = 12;
MESSAGE_TYPE_SAY_SPAM = 22;
MESSAGE_TYPE_SHOUT_SPAM = 23;
MESSAGE_TYPE_TELL_SPAM = 24;
MESSAGE_TYPE_CUSTOM_EMOTE = 25;
MESSAGE_TYPE_EMOTE_SPAM = 26;
MESSAGE_TYPE_STANDARD_EMOTE = 27;
MESSAGE_TYPE_URGENT_MESSAGE = 28;
MESSAGE_TYPE_GENERAL_INFO = 29;
MESSAGE_TYPE_SYSTEM = 32;
MESSAGE_TYPE_SYSTEM_ERROR = 33;
-- INVENTORY
INVENTORY_NORMAL = 0x0000; --Max 0xC8
INVENTORY_LOOT = 0x0004; --Max 0xA
INVENTORY_MELDREQUEST = 0x0005; --Max 0x04
INVENTORY_BAZAAR = 0x0007; --Max 0x0A
INVENTORY_CURRENCY = 0x0063; --Max 0x140
INVENTORY_KEYITEMS = 0x0064; --Max 0x500
INVENTORY_EQUIPMENT = 0x00FE; --Max 0x23
INVENTORY_EQUIPMENT_OTHERPLAYER = 0x00F9; --Max 0x23
--UTILS
function callClientFunction(player, functionName, ...)
player:RunEventFunction(functionName, ...);
result = coroutine.yield();
return result;
end
function printf(s, ...)
if ... then
print(s:format(...));
else
print(s);
end;
end;

View File

@ -14,12 +14,11 @@ function onEventStarted(player, command, triggerName)
player:ChangeState(0); player:ChangeState(0);
end end
player:endEvent(); --player:endEvent();
--For Opening Tutorial --For Opening Tutorial
if (player:HasQuest("Man0l0") or player:HasQuest("Man0g0") or player:HasQuest("Man0u0")) then if (player:HasQuest("Man0l0") or player:HasQuest("Man0g0") or player:HasQuest("Man0u0")) then
player:GetDirector():OnCommand(command); player:GetDirector("Quest/QuestDirectorMan0l001"):OnCommandEvent(player, command);
end end
end end

View File

@ -0,0 +1,12 @@
--[[
LinkshellKickCommand Script
--]]
function onEventStarted(player, actor, triggerName, linkshellName, kickedName)
GetWorldManager():RequestWorldLinkshellKick(player, linkshellName, kickedName);
player:EndEvent();
end

View File

@ -0,0 +1,35 @@
require("global");
properties = {
permissions = 0,
parameters = "ss",
description =
[[
Passes endEvent() to player or <targetname> to close a script.
!endevent |
!endevent <targetname> |
]],
}
function onTrigger(player, argc, name, lastName)
local sender = "[endevent] ";
if name then
if lastName then
player = GetWorldManager():GetPCInWorld(name.." "..lastName) or nil;
else
player = GetWorldManager():GetPCInWorld(name) or nil;
end;
end;
local messageID = MESSAGE_TYPE_SYSTEM_ERROR;
local message = "Sending endEvent()";
if player then
player:endEvent();
player:SendMessage(messageID, sender, message);
print(message);
else
print(sender.."Sending Event.");
end;
end;

View File

@ -0,0 +1,42 @@
require("global");
properties = {
permissions = 0,
parameters = "sss",
description =
[[
Adds gil <qty> to player or <targetname>.
!givegil <qty> |
!givegil <qty> <targetname> |
]],
}
function onTrigger(player, argc, qty, name, lastName)
local sender = "[givegil] ";
if name then
if lastName then
player = GetWorldManager():GetPCInWorld(name.." "..lastName) or nil;
else
player = GetWorldManager():GetPCInWorld(name) or nil;
end;
end;
if player then
currency = 1000001;
qty = tonumber(qty) or 1;
location = INVENTORY_CURRENCY;
local added = player:GetInventory(location):AddItem(currency, qty, 1);
local messageID = MESSAGE_TYPE_SYSTEM_ERROR;
local message = "unable to add gil";
if currency and added then
message = string.format("added %u gil to %s", qty, player:GetName());
end
player:SendMessage(messageID, sender, message);
print(message);
else
print(sender.."unable to add gil, ensure player name is valid.");
end;
end;

View File

@ -0,0 +1,57 @@
require("global");
properties = {
permissions = 0,
parameters = "ss",
description =
[[
Positions your character forward a set <distance>, defaults to 5 yalms.
!nudge |
!nudge <distance> |
!nudge <distance> <up/down> |
]],
}
function onTrigger(player, argc, distance, vertical)
local pos = player:GetPos();
local x = pos[0];
local y = pos[1];
local z = pos[2];
local rot = pos[3];
local zone = pos[4];
local angle = rot + (math.pi/2);
local messageID = MESSAGE_TYPE_SYSTEM_ERROR;
local sender = "[nudge] ";
if distance == nil then
distance = 5
end;
local px = x - distance * math.cos(angle);
local pz = z + distance * math.sin(angle);
local message = string.format("Positioning forward %u yalms.", distance);
local worldManager = GetWorldManager();
if argc == 1 then
worldManager:DoPlayerMoveInZone(player, px, y, pz, rot, 0x0);
player:SendMessage(messageID, sender, message);
elseif argc == 2 then
if vertical == "up" or vertical == "u" or vertical == "+" then
y = y + distance;
message = string.format("Positioning up %u yalms.", distance);
worldManager:DoPlayerMoveInZone(player, x, y, z, rot, 0x0);
player:SendMessage(messageID, sender, message);
elseif vertical == "down" or vertical == "d" or vertical == "-" then
y = y - distance;
message = string.format("Positioning down %u yalms.", distance);
worldManager:DoPlayerMoveInZone(player, x, y, z, rot, 0x0);
player:SendMessage(messageID, sender, message);
else
player:SendMessage(messageID, sender, "Unknown parameters! Usage: \n"..properties.description);
end;
else
worldManager:DoPlayerMoveInZone(player, px, y, pz, rot, 0x0);
player:SendMessage(messageID, sender, message);
end;
end;

View File

@ -0,0 +1,28 @@
require("global");
properties = {
permissions = 0,
parameters = "ss",
description =
[[
Positions your character forward a set <distance>, defaults to 5 yalms.
!nudge |
!nudge <distance> |
!nudge <distance> <up/down> |
]],
}
function onTrigger(player, argc)
worldMaster = GetWorldMaster();
player:SendGameMessage(player, worldMaster, 34108, 0x20);
player:SendGameMessage(player, worldMaster, 50011, 0x20);
director = player:GetZone():CreateDirector("Quest/QuestDirectorMan0l001");
player:AddDirector(director);
player:SetLoginDirector(director);
player:KickEvent(director, "noticeEvent", true);
GetWorldManager():DoZoneChange(player, 9);
end;

View File

@ -0,0 +1,49 @@
require("global");
properties = {
permissions = 0,
parameters = "ssss",
description =
[[
<actorName> <workName> <uiFunc> <value>
]],
}
function onTrigger(player, argc, target, workName, uiFunc, value)
local messageID = MESSAGE_TYPE_SYSTEM_ERROR;
local sender = "[workvalue] ";
if (argc != 4) then
player:SendMessage(messageID, sender, "Invalid args");
return;
end
if (target == "@t") then
targetActor = GetWorldManager():GetActorInWorld(player.currentTarget) or nil;
else
targetActor = GetWorldManager():GetActorInWorld(target) or nil;
end
if not targetActor then
player:SendMessage(messageID, sender, "Error finding target...");
return
end
if (tonumber(value) ~= nil) then
result = targetActor:SetWorkValue(player, workName, uiFunc, tonumber(value));
elseif (value == "true") then
result = targetActor:SetWorkValue(player, workName, uiFunc, true);
elseif (value == "false") then
result = targetActor:SetWorkValue(player, workName, uiFunc, false);
else
result = targetActor:SetWorkValue(player, workName, uiFunc, value);
end
if (result) then
player:SendMessage(messageID, sender, workName .. " changed to " .. value);
else
player:SendMessage(messageID, sender, "Could not changed workvalue. Is the name and datatype correct?");
end
end

View File

@ -0,0 +1,66 @@
require ("global")
require ("quests/man/man0l0")
require ("quests/man/man0g0")
require ("quests/man/man0u0")
function init()
return "/Director/OpeningDirector";
end
function onEventStarted(player, actor, triggerName)
if (player:HasQuest(110001) == true) then
quest = player:GetQuest("Man0l0");
callClientFunction(player, "delegateEvent", player, quest, "processTtrNomal001withHQ", nil, nil, nil);
elseif (player:HasQuest(110005) == true) then
quest = player:GetQuest("Man0g0");
callClientFunction(player, "delegateEvent", player, quest, "processTtrNomal001withHQ", nil, nil, nil);
elseif (player:HasQuest(110009) == true) then
quest = player:GetQuest("Man0u0");
callClientFunction(player, "delegateEvent", player, quest, "processTtrNomal001withHQ", nil, nil, nil);
end
player:EndEvent();
end
function onUpdate()
end
function onTalkEvent(player, npc)
;
if (player:HasQuest(110001) == true) then
man0l0Quest = player:GetQuest("man0l0");
if (man0l0Quest:GetQuestFlag(MAN0L0_FLAG_MINITUT_DONE1) == true and man0l0Quest:GetQuestFlag(MAN0L0_FLAG_MINITUT_DONE2) == true and man0l0Quest:GetQuestFlag(MAN0L0_FLAG_MINITUT_DONE3) == true) then
doorNpc = GetWorldManager():GetActorInWorldByUniqueId("exit_door");
player:SetEventStatus(doorNpc, "pushDefault", true, 0x2);
doorNpc:SetQuestGraphic(player, 0x3);
end
elseif (player:HasQuest(110005) == true) then
man0g0Quest = player:GetQuest("man0g0");
if (man0g0Quest:GetQuestFlag(MAN0G0_FLAG_MINITUT_DONE1) == true) then
yda = GetWorldManager():GetActorInWorldByUniqueId("yda");
yda:SetQuestGraphic(player, 0x2);
end
elseif (player:HasQuest(110009) == true) then
man0u0Quest = player:GetQuest("man0u0");
if (man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE1) == true and man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE2) == true and man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE3) == true) then
exitTriggerNpc = GetWorldManager():GetActorInWorldByUniqueId("exit_trigger");
player:SetEventStatus(exitTriggerNpc, "pushDefault", true, 0x2);
exitTriggerNpc:SetQuestGraphic(player, 0x3);
end
end
end
function onPushEvent(player, npc)
end
function onCommandEvent(player, command)
end
function onEventUpdate(player, npc)
end
function onCommand(player, command)
end

View File

@ -0,0 +1,66 @@
require ("global")
require ("quests/man/man0g0")
--processTtrBtl001: Active Mode Tutorial
--processTtrBtl002: Targetting Tutorial (After active mode done)
--processTtrBtl003: Auto Attack Done
--processTtrBtl004: Tutorial Complete
--[[
12: TP
13: WeaponSkills
]]--
function init()
return "/Director/Quest/QuestDirectorMan0g001";
end
function onEventStarted(player, actor, triggerName)
quest = GetStaticActor("Man0g0");
callClientFunction(player, "delegateEvent", player, quest, "processTtrBtl001", nil, nil, nil);
callClientFunction(player, "delegateEvent", player, quest, "processTtrBtl002", nil, nil, nil);
--sendDataPacket: Success
--sendDataPacket: CloseWidget
--IF DoW:
--sendDataPacket: OpenWidget (TP)
--IF TP REACHED:
--sendDataPacket: CloseWidget
--sendDataPacket: OpenWidget (WS)
--IF WS USED:
--sendDataPacket: Success
--sendDataPacket: CloseWidget
--ELSE MAGIC:
--sendDataPacket: OpenWidget (DEFEAT ENEMY)
--IF DEAD
--sendDataPacket: Attention
player:EndEvent();
end
function onUpdate()
end
function onTalkEvent(player, npc)
end
function onPushEvent(player, npc)
end
function onCommandEvent(player, command)
quest = GetStaticActor("Man0g0");
callClientFunction(player, "delegateEvent", player, quest, "processTtrBtl002", nil, nil, nil);
end
function onEventUpdate(player, npc)
end
function onCommand(player, command)
end

View File

@ -0,0 +1,66 @@
require ("global")
require ("quests/man/man0l0")
--processTtrBtl001: Active Mode Tutorial
--processTtrBtl002: Targetting Tutorial (After active mode done)
--processTtrBtl003: Auto Attack Done
--processTtrBtl004: Tutorial Complete
--[[
12: TP
13: WeaponSkills
]]--
function init()
return "/Director/Quest/QuestDirectorMan0l001";
end
function onEventStarted(player, actor, triggerName)
quest = GetStaticActor("Man0l0");
callClientFunction(player, "delegateEvent", player, quest, "processTtrBtl001", nil, nil, nil);
callClientFunction(player, "delegateEvent", player, quest, "processTtrBtl002", nil, nil, nil);
--sendDataPacket: Success
--sendDataPacket: CloseWidget
--IF DoW:
--sendDataPacket: OpenWidget (TP)
--IF TP REACHED:
--sendDataPacket: CloseWidget
--sendDataPacket: OpenWidget (WS)
--IF WS USED:
--sendDataPacket: Success
--sendDataPacket: CloseWidget
--ELSE MAGIC:
--sendDataPacket: OpenWidget (DEFEAT ENEMY)
--IF DEAD
--sendDataPacket: Attention
player:EndEvent();
end
function onUpdate()
end
function onTalkEvent(player, npc)
end
function onPushEvent(player, npc)
end
function onCommandEvent(player, command)
quest = GetStaticActor("Man0l0");
callClientFunction(player, "delegateEvent", player, quest, "processTtrBtl002", nil, nil, nil);
end
function onEventUpdate(player, npc)
end
function onCommand(player, command)
end

View File

@ -0,0 +1,66 @@
require ("global")
require ("quests/man/man0u0")
--processTtrBtl001: Active Mode Tutorial
--processTtrBtl002: Targetting Tutorial (After active mode done)
--processTtrBtl003: Auto Attack Done
--processTtrBtl004: Tutorial Complete
--[[
12: TP
13: WeaponSkills
]]--
function init()
return "/Director/Quest/QuestDirectorMan0u001";
end
function onEventStarted(player, actor, triggerName)
quest = GetStaticActor("Man0u0");
callClientFunction(player, "delegateEvent", player, quest, "processTtrBtl001", nil, nil, nil);
callClientFunction(player, "delegateEvent", player, quest, "processTtrBtl002", nil, nil, nil);
--sendDataPacket: Success
--sendDataPacket: CloseWidget
--IF DoW:
--sendDataPacket: OpenWidget (TP)
--IF TP REACHED:
--sendDataPacket: CloseWidget
--sendDataPacket: OpenWidget (WS)
--IF WS USED:
--sendDataPacket: Success
--sendDataPacket: CloseWidget
--ELSE MAGIC:
--sendDataPacket: OpenWidget (DEFEAT ENEMY)
--IF DEAD
--sendDataPacket: Attention
player:EndEvent();
end
function onUpdate()
end
function onTalkEvent(player, npc)
end
function onPushEvent(player, npc)
end
function onCommandEvent(player, command)
quest = GetStaticActor("Man0l0");
callClientFunction(player, "delegateEvent", player, quest, "processTtrBtl002", nil, nil, nil);
end
function onEventUpdate(player, npc)
end
function onCommand(player, command)
end

View File

@ -1,21 +0,0 @@
function onEventStarted(player, actor, triggerName)
man0g0Quest = GetStaticActor("Man0g0");
--player:RunEventFunction("delegateEvent", player, man0g0Quest, "processTtrBtl001");
player:RunEventFunction("delegateEvent", player, man0g0Quest, "processTtrBtl002");
end
function onEventUpdate(player, npc, resultId)
--man0g0Quest = GetStaticActor("Man0g0");
--player:RunEventFunction("delegateEvent", player, man0g0Quest, "processTtrBtl002");
player:EndEvent();
end
function onCommand(player, command)
--Check command if ActivateCommand
player:EndCommand();
player:EndEvent();
player:KickEvent(player:GetDirector(), "noticeEvent", true);
end

View File

@ -1,25 +0,0 @@
function onEventStarted(player, actor, triggerName)
man0u0Quest = GetStaticActor("Man0u0");
man0l0Quest = GetStaticActor("Man0l0");
player:RunEventFunction("delegateEvent", player, man0l0Quest, "processTtrBtl001");
--player:RunEventFunction("delegateEvent", player, man0l0Quest, "processTtrBtlMagic001");
--player:RunEventFunction("delegateEvent", player, man0l0Quest, "processTtrBtl002");
--player:RunEventFunction("delegateEvent", player, man0l0Quest, "processTtrBtl003");
--player:RunEventFunction("delegateEvent", player, man0u0Quest, "processTtrBtl004");
end
function onEventUpdate(player, npc, resultId)
--man0l0Quest = GetStaticActor("Man0l0");
--player:RunEventFunction("delegateEvent", player, man0l0Quest, "processTtrBtl002");
player:EndEvent();
end
function onCommand(player, command)
--Check command if ActivateCommand
--player:KickEvent(player:GetDirector(), "noticeEvent");
--player:EndCommand();
end

View File

@ -12,22 +12,29 @@ function onBeginLogin(player)
player:AddQuest(110005); player:AddQuest(110005);
elseif (initialTown == 3 and player:HasQuest(110009) == false) then elseif (initialTown == 3 and player:HasQuest(110009) == false) then
player:AddQuest(110009); player:AddQuest(110009);
end end
end end
--For Opening. Set Director and reset position incase d/c --For Opening. Set Director and reset position incase d/c
if (player:HasQuest(110001) == true) then if (player:HasQuest(110001) == true) then
--player:SetDirector("openingDirector", false); director = player:GetZone():CreateDirector("OpeningDirector");
player:AddDirector(director);
player:SetLoginDirector(director);
player:KickEvent(director, "noticeEvent", "noticeEvent");
player.positionX = 0.016; player.positionX = 0.016;
player.positionY = 10.35; player.positionY = 10.35;
--player.positionZ = -36.91; player.positionZ = -36.91;
player.positionZ = -20.91;
player.rotation = 0.025; player.rotation = 0.025;
player:GetQuest(110001):ClearQuestData(); player:GetQuest(110001):ClearQuestData();
player:GetQuest(110001):ClearQuestFlags(); player:GetQuest(110001):ClearQuestFlags();
elseif (player:HasQuest(110005) == true) then elseif (player:HasQuest(110005) == true) then
player:SetDirector("openingDirector", false); director = player:GetZone():CreateDirector("OpeningDirector");
player:AddDirector(director);
player:SetLoginDirector(director);
player:KickEvent(director, "noticeEvent", "noticeEvent");
player.positionX = 369.5434; player.positionX = 369.5434;
player.positionY = 4.21; player.positionY = 4.21;
player.positionZ = -706.1074; player.positionZ = -706.1074;
@ -35,15 +42,18 @@ function onBeginLogin(player)
player:GetQuest(110005):ClearQuestData(); player:GetQuest(110005):ClearQuestData();
player:GetQuest(110005):ClearQuestFlags(); player:GetQuest(110005):ClearQuestFlags();
elseif (player:HasQuest(110009) == true) then elseif (player:HasQuest(110009) == true) then
player:SetDirector("openingDirector", false); director = player:GetZone():CreateDirector("OpeningDirector");
player:AddDirector(director);
player:SetLoginDirector(director);
player:KickEvent(director, "noticeEvent", "noticeEvent");
player.positionX = 5.364327; player.positionX = 5.364327;
player.positionY = 196.0; player.positionY = 196.0;
player.positionZ = 133.6561; player.positionZ = 133.6561;
player.rotation = -2.849384; player.rotation = -2.849384;
player:GetQuest(110009):ClearQuestData(); player:GetQuest(110009):ClearQuestData();
player:GetQuest(110009):ClearQuestFlags(); player:GetQuest(110009):ClearQuestFlags();
end end
end end
@ -54,7 +64,9 @@ function onLogin(player)
player:SendMessage(0x1D,"",">PlayTime == 0, new player!"); player:SendMessage(0x1D,"",">PlayTime == 0, new player!");
initClassItems(player); initClassItems(player);
initRaceItems(player); initRaceItems(player);
player:SavePlayTime();
end end
end end

View File

@ -6,8 +6,4 @@ MAN0L0_FLAG_TUTORIAL3_DONE = 2;
MAN0L0_FLAG_MINITUT_DONE1 = 4; MAN0L0_FLAG_MINITUT_DONE1 = 4;
MAN0L0_FLAG_MINITUT_DONE2 = 8; MAN0L0_FLAG_MINITUT_DONE2 = 8;
MAN0L0_FLAG_MINITUT_DONE3 = 16; MAN0L0_FLAG_MINITUT_DONE3 = 16;
--Result Unique Ids
RESULT_Event000_1 = 0x2B9EBC42;
RESULT_TtrNomal001 = 0x8649D125;

View File

@ -1,6 +1,7 @@
--Quest Flags --Quest Flags
MAN0U0_FLAG_TUTORIAL1_DONE = 0; MAN0U0_FLAG_TUTORIAL1_DONE = 0;
MAN0U0_FLAG_TUTORIAL2_DONE = 1; MAN0U0_FLAG_TUTORIAL2_DONE = 1;
MAN0U0_FLAG_TUTORIAL3_DONE = 2;
MAN0U0_FLAG_MINITUT_DONE1 = 4; MAN0U0_FLAG_MINITUT_DONE1 = 4;
MAN0U0_FLAG_MINITUT_DONE2 = 8; MAN0U0_FLAG_MINITUT_DONE2 = 8;

View File

@ -1,33 +0,0 @@
require ("global")
require("/quests/man/man0g0")
function onEventStarted(player, actor, triggerName)
man0g0Quest = GetStaticActor("Man0g0");
callClientFunction(player, "delegateEvent", player, man0g0Quest, "processTtrNomal001withHQ", nil, nil, nil, nil);
player:EndEvent();
end
function onTalked(player, npc)
man0g0Quest = player:GetQuest("Man0g0");
if (man0g0Quest ~= nil) then
yda = GetWorldManager():GetActorInWorld(1000009);
papalymo = GetWorldManager():GetActorInWorld(1000010);
if (man0g0Quest:GetQuestFlag(MAN0G0_FLAG_TUTORIAL1_DONE) == false) then
yda:SetQuestGraphic(player, 0x0);
papalymo:SetQuestGraphic(player, 0x2);
else
if (man0g0Quest:GetQuestFlag(MAN0G0_FLAG_MINITUT_DONE1) == true) then
yda:SetQuestGraphic(player, 0x2);
papalymo:SetQuestGraphic(player, 0x0);
end
end
end
end

View File

@ -6,9 +6,10 @@ function onEventStarted(player, npc, triggerName)
if (triggerName == "talkDefault") then if (triggerName == "talkDefault") then
if (man0g0Quest:GetQuestFlag(MAN0G0_FLAG_MINITUT_DONE1) == false) then if (man0g0Quest:GetQuestFlag(MAN0G0_FLAG_MINITUT_DONE1) == false) then
callClientFunction(player, "delegateEvent", player, man0g0Quest, "processEvent000_2", nil, nil, nil); callClientFunction(player, "delegateEvent", player, man0g0Quest, "processEvent000_3", nil, nil, nil);
man0g0Quest:SetQuestFlag(MAN0G0_FLAG_MINITUT_DONE1, true); man0g0Quest:SetQuestFlag(MAN0G0_FLAG_MINITUT_DONE1, true);
man0g0Quest:SaveData(); man0g0Quest:SaveData();
npc:SetQuestGraphic(player, 0x0);
player:GetDirector():OnTalked(npc); player:GetDirector():OnTalked(npc);
else else
callClientFunction(player, "delegateEvent", player, man0g0Quest, "processEvent000_2", nil, nil, nil); callClientFunction(player, "delegateEvent", player, man0g0Quest, "processEvent000_2", nil, nil, nil);

View File

@ -13,16 +13,27 @@ function onEventStarted(player, npc, triggerName)
if (triggerName == "pushDefault") then if (triggerName == "pushDefault") then
callClientFunction(player, "delegateEvent", player, man0g0Quest, "processTtrNomal002", nil, nil, nil); callClientFunction(player, "delegateEvent", player, man0g0Quest, "processTtrNomal002", nil, nil, nil);
elseif (triggerName == "talkDefault") then elseif (triggerName == "talkDefault") then
--Is doing talk tutorial?
if (man0g0Quest:GetQuestFlag(MAN0G0_FLAG_TUTORIAL1_DONE) == false) then if (man0g0Quest:GetQuestFlag(MAN0G0_FLAG_TUTORIAL1_DONE) == false) then
callClientFunction(player, "delegateEvent", player, man0g0Quest, "processTtrNomal003", nil, nil, nil); callClientFunction(player, "delegateEvent", player, man0g0Quest, "processTtrNomal003", nil, nil, nil);
player:SetEventStatus(npc, "pushDefault", false, 0x2); player:SetEventStatus(npc, "pushDefault", false, 0x2);
npc:SetQuestGraphic(player, 0x2);
player:GetDirector():OnTalked(npc); player:GetDirector():OnTalked(npc);
man0g0Quest:SetQuestFlag(MAN0G0_FLAG_TUTORIAL1_DONE, true); man0g0Quest:SetQuestFlag(MAN0G0_FLAG_TUTORIAL1_DONE, true);
man0g0Quest:SaveData(); man0g0Quest:SaveData();
--Was she talked to after papalymo?
else else
if (man0g0Quest:GetQuestFlag(MAN0G0_FLAG_MINITUT_DONE1) == true) then if (man0g0Quest:GetQuestFlag(MAN0G0_FLAG_MINITUT_DONE1) == true) then
man0g0Quest:SetQuestFlag(MAN0G0_FLAG_TUTORIAL2_DONE, true); player:EndEvent();
callClientFunction(player, "delegateEvent", player, man0g0Quest, "processEvent010_1", nil, nil, nil); player:SetDirector("QuestDirectorMan0g001", true);
worldMaster = GetWorldMaster();
player:SendGameMessage(player, worldMaster, 34108, 0x20);
player:SendGameMessage(player, worldMaster, 50011, 0x20);
GetWorldManager():DoPlayerMoveInZone(player, 10);
player:KickEvent(player:GetDirector(), "noticeEvent", true);
return;
else else
callClientFunction(player, "delegateEvent", player, man0g0Quest, "processEvent000_1", nil, nil, nil); callClientFunction(player, "delegateEvent", player, man0g0Quest, "processEvent000_1", nil, nil, nil);
end end
@ -31,24 +42,4 @@ function onEventStarted(player, npc, triggerName)
end end
player:EndEvent(); player:EndEvent();
end
function onEventUpdate(player, npc)
man0g0Quest = player:GetQuest("Man0g0");
if (man0g0Quest:GetQuestFlag(MAN0G0_FLAG_TUTORIAL2_DONE) == true) then
player:EndEvent();
player:SetDirector("QuestDirectorMan0g001", true);
worldMaster = GetWorldMaster();
player:SendGameMessage(player, worldMaster, 34108, 0x20);
player:SendGameMessage(player, worldMaster, 50011, 0x20);
GetWorldManager():DoPlayerMoveInZone(player, 10);
player:KickEvent(player:GetDirector(), "noticeEvent", true);
else
player:EndEvent();
end
end end

View File

@ -1,20 +0,0 @@
require ("global")
function onZoneInit(zone)
end
function onZoneIn(player)
openingQuest = player:getQuest(110005);
--Opening Quest
if (openingQuest ~= nil) then
if (openingQuest:GetQuestFlag(0) == false) then
player:kickEvent(player:getDirector(), "noticeEvent");
end
end
end
function onZoneOut(zone, player)
end

View File

@ -0,0 +1,7 @@
require ("global")
function onEventStarted(player, npc)
defaultFst = GetStaticActor("DftFst");
callClientFunction(player, "delegateEvent", player, defaultFst, "defaultTalkLouisoix_001", nil, nil, nil);
player:endEvent();
end

View File

@ -0,0 +1,7 @@
require ("global")
function onEventStarted(player, npc)
defaultFst = GetStaticActor("DftFst");
callClientFunction(player, "delegateEvent", player, defaultFst, "defaultTalkWithAnaidjaa_001", nil, nil, nil);
player:endEvent();
end

View File

@ -0,0 +1,7 @@
require ("global")
function onEventStarted(player, npc)
defaultFst = GetStaticActor("DftFst");
callClientFunction(player, "delegateEvent", player, defaultFst, "defaultTalkWithDyrstbrod_001", nil, nil, nil);
player:endEvent();
end

View File

@ -1,26 +0,0 @@
require ("global")
require("/quests/man/man0l0")
function onEventStarted(player, actor, triggerName)
man0l0Quest = GetStaticActor("Man0l0");
callClientFunction(player, "delegateEvent", player, man0l0Quest, "processTtrNomal001withHQ", nil, nil, nil, nil);
player:EndEvent();
end
function onTalked(player, npc)
man0l0Quest = player:GetQuest("Man0l0");
if (man0l0Quest ~= nil) then
if (man0l0Quest ~= nil and man0l0Quest:GetQuestFlag(MAN0L0_FLAG_MINITUT_DONE1) == true and man0l0Quest:GetQuestFlag(MAN0L0_FLAG_MINITUT_DONE2) == true and man0l0Quest:GetQuestFlag(MAN0L0_FLAG_MINITUT_DONE3) == true) then
doorNpc = GetWorldManager():GetActorInWorld(1090025);
player:SetEventStatus(doorNpc, "pushDefault", true, 0x2);
doorNpc:SetQuestGraphic(player, 0x3);
end
end
end

View File

@ -22,7 +22,7 @@ function onEventStarted(player, npc, triggerName)
npc:SetQuestGraphic(player, 0x0); npc:SetQuestGraphic(player, 0x0);
man0l0Quest:SetQuestFlag(MAN0L0_FLAG_MINITUT_DONE3, true); man0l0Quest:SetQuestFlag(MAN0L0_FLAG_MINITUT_DONE3, true);
man0l0Quest:SaveData(); man0l0Quest:SaveData();
player:GetDirector():OnTalked(npc); player:GetDirector("OpeningDirector"):onTalkEvent(player, npc);
else else
callClientFunction(player, "delegateEvent", player, man0l0Quest, "processEvent000_8", nil, nil, nil); callClientFunction(player, "delegateEvent", player, man0l0Quest, "processEvent000_8", nil, nil, nil);
end end

View File

@ -24,14 +24,17 @@ function onEventStarted(player, npc, triggerName)
if (choice == 1) then if (choice == 1) then
callClientFunction(player, "delegateEvent", player, man0l0Quest, "processEvent000_2", nil, nil, nil, nil); callClientFunction(player, "delegateEvent", player, man0l0Quest, "processEvent000_2", nil, nil, nil, nil);
player:EndEvent(); player:EndEvent();
player:SetDirector("QuestDirectorMan0l001", true);
worldMaster = GetWorldMaster(); worldMaster = GetWorldMaster();
player:SendGameMessage(player, worldMaster, 34108, 0x20); player:SendGameMessage(player, worldMaster, 34108, 0x20);
player:SendGameMessage(player, worldMaster, 50011, 0x20); player:SendGameMessage(player, worldMaster, 50011, 0x20);
GetWorldManager():DoPlayerMoveInZone(player, 9); director = player:GetZone():CreateDirector("Quest/QuestDirectorMan0l001");
player:KickEvent(player:GetDirector(), "noticeEvent", true); player:KickEvent(director, "noticeEvent", true);
player:AddDirector(director);
player:SetLoginDirector(director);
GetWorldManager():DoZoneChange(player, 9);
else else
player:EndEvent(); player:EndEvent();
end end

View File

@ -1,3 +0,0 @@
function init(npc)
return "/Chara/Npc/Monster/Fighter/FighterAllyOpeningHealer", false, false, false, false, false, npc:GetActorClassId(), false, false, 10, 1, 4, false, false, false, false, false, false, false, false, 2;
end

View File

@ -1,3 +0,0 @@
function init(npc)
return "/Chara/Npc/Monster/Fighter/FighterAllyOpeningAttacker", false, false, false, false, false, npc:GetActorClassId(), false, false, 10, 1, 4, false, false, false, false, false, false, false, false, 2;
end

View File

@ -31,7 +31,7 @@ function onEventStarted(player, npc, triggerName)
npc:SetQuestGraphic(player, 0x2); npc:SetQuestGraphic(player, 0x2);
man0l0Quest:SaveData(); man0l0Quest:SaveData();
player:GetDirector():OnTalked(npc); player:GetDirector("OpeningDirector"):onTalkEvent(player, npc);
--Was he talked to for the mini tutorial? --Was he talked to for the mini tutorial?
else else
callClientFunction(player, "delegateEvent", player, man0l0Quest, "processTtrMini001", nil, nil, nil); callClientFunction(player, "delegateEvent", player, man0l0Quest, "processTtrMini001", nil, nil, nil);
@ -41,7 +41,7 @@ function onEventStarted(player, npc, triggerName)
man0l0Quest:SetQuestFlag(MAN0L0_FLAG_MINITUT_DONE1, true); man0l0Quest:SetQuestFlag(MAN0L0_FLAG_MINITUT_DONE1, true);
man0l0Quest:SaveData(); man0l0Quest:SaveData();
player:GetDirector():OnTalked(npc); player:GetDirector("OpeningDirector"):onTalkEvent(player, npc);
end end
end end
end end

View File

@ -20,9 +20,8 @@ function onEventStarted(player, npc, triggerName)
callClientFunction(player, "delegateEvent", player, man0l0Quest, "processTtrMini002", nil, nil, nil); callClientFunction(player, "delegateEvent", player, man0l0Quest, "processTtrMini002", nil, nil, nil);
npc:SetQuestGraphic(player, 0x0); npc:SetQuestGraphic(player, 0x0);
man0l0Quest:SetQuestFlag(MAN0L0_FLAG_MINITUT_DONE2, true); man0l0Quest:SetQuestFlag(MAN0L0_FLAG_MINITUT_DONE2, true);
man0l0Quest:SaveData(); man0l0Quest:SaveData();
player:GetDirector("OpeningDirector"):onTalkEvent(player, npc);
player:GetDirector():OnTalked(npc);
else else
callClientFunction(player, "delegateEvent", player, man0l0Quest, "processEvent000_13", nil, nil, nil); callClientFunction(player, "delegateEvent", player, man0l0Quest, "processEvent000_13", nil, nil, nil);
end end

View File

@ -0,0 +1,5 @@
require ("global")
function init(npc)
return false, false, 0, 0, 0x1415, 201;
end

View File

@ -0,0 +1,5 @@
require ("global")
function init(npc)
return false, false, 0, 0, 0x1415, 201;
end

View File

@ -0,0 +1,7 @@
require ("global")
function onEventStarted(player, npc)
defaultSea = GetStaticActor("DftSea");
callClientFunction(player, "delegateEvent", player, defaultSea, "tribeTalk", nil, nil, nil);
player:endEvent();
end

View File

@ -0,0 +1,7 @@
require ("global")
function onEventStarted(player, npc)
defaultSea = GetStaticActor("DftSea");
callClientFunction(player, "delegateEvent", player, defaultSea, "defaultTalkWithSweetnix_001", nil, nil, nil);
player:endEvent();
end

View File

@ -0,0 +1,5 @@
require ("global")
function init(npc)
return false, false, 0, 0, 0xC4, 0x1C8;
end

View File

@ -0,0 +1,5 @@
require ("global")
function init(npc)
return false, false, 0, 0, 0x187, 0x2;
end

View File

@ -0,0 +1,7 @@
require ("global")
function onEventStarted(player, npc)
defaultSea = GetStaticActor("DftSea");
callClientFunction(player, "delegateEvent", player, defaultSea, "defaultTalkWithJoellaut_001", nil, nil, nil);
player:endEvent();
end

View File

@ -1,22 +0,0 @@
require ("global")
require("/quests/man/man0u0")
function onEventStarted(player, actor, triggerName)
man0u0Quest = GetStaticActor("Man0u0");
callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrNomal001withHQ", nil, nil, nil, nil);
player:EndEvent();
end
function onTalked(player, npc)
man0u0Quest = player:GetQuest("Man0u0");
if (man0u0Quest ~= nil) then
end
end

View File

@ -0,0 +1,13 @@
function init(npc)
return false, false, 0, 0;
end
function onEventStarted(player, npc, triggerName)
if (triggerName == "caution") then
worldMaster = GetWorldMaster();
player:SendGameMessage(player, worldMaster, 34109, 0x20);
elseif (triggerName == "exit") then
GetWorldManager():DoPlayerMoveInZone(player, 6);
end
player:EndEvent();
end

View File

@ -0,0 +1,13 @@
function init(npc)
return false, false, 0, 0;
end
function onEventStarted(player, npc, triggerName)
if (triggerName == "caution") then
worldMaster = GetWorldMaster();
player:SendGameMessage(player, worldMaster, 34109, 0x20);
elseif (triggerName == "exit") then
GetWorldManager():DoPlayerMoveInZone(player, 18);
end
player:EndEvent();
end

View File

@ -2,7 +2,7 @@ require ("global")
require ("quests/man/man0u0") require ("quests/man/man0u0")
function onEventStarted(player, npc, triggerName) function onEventStarted(player, npc, triggerName)
man0u0Quest = GetStaticActor("Man0u0"); man0u0Quest = GetStaticActor("Man0u0");
callClientFunction(player, "delegateEvent", player, man0u0Quest, "defaultTalkWithLady001_001", nil, nil, nil); callClientFunction(player, "delegateEvent", player, man0u0Quest, "processEvent000_13", nil, nil, nil);
player:EndEvent(); player:EndEvent();
end end

View File

@ -9,25 +9,40 @@ function onEventStarted(player, npc, triggerName)
man0u0Quest = player:GetQuest("Man0u0"); man0u0Quest = player:GetQuest("Man0u0");
if (man0u0Quest ~= nil) then if (man0u0Quest ~= nil) then
if (triggerName == "pushDefault") then if (man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE1) == false) then
npc:SetQuestGraphic(player, 0x2);
end
if (man0u0Quest:GetQuestFlag(MAN0U0_FLAG_TUTORIAL3_DONE) == true) then
player:SetEventStatus(npc, "pushDefault", false, 0x2);
end
end
if (man0u0Quest ~= nil) then
if (triggerName == "pushDefault") then
callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrNomal002", nil, nil, nil); callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrNomal002", nil, nil, nil);
elseif (triggerName == "talkDefault") then elseif (triggerName == "talkDefault") then
if (man0u0Quest:GetQuestFlag(MAN0U0_FLAG_TUTORIAL1_DONE) == false) then --Is doing talk tutorial?
callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrNomal003", nil, nil, nil); if (man0u0Quest:GetQuestFlag(MAN0U0_FLAG_TUTORIAL3_DONE) == false) then
player:SetEventStatus(npc, "pushDefault", false, 0x2); player:SetEventStatus(npc, "pushDefault", false, 0x2);
player:GetDirector():OnTalked(npc); callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrNomal003", nil, nil, nil);
man0u0Quest:SetQuestFlag(MAN0U0_FLAG_TUTORIAL1_DONE, true); man0u0Quest:SetQuestFlag(MAN0U0_FLAG_TUTORIAL3_DONE, true);
npc:SetQuestGraphic(player, 0x2);
man0u0Quest:SaveData(); man0u0Quest:SaveData();
else
callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrMini001", nil, nil, nil);
player:GetDirector("OpeningDirector"):onTalkEvent(player, npc);
--Was he talked to for the mini tutorial?
else
callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrMini001", nil, nil, nil);
if (man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE1) == false) then if (man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE1) == false) then
npc:SetQuestGraphic(player, 0x0); npc:SetQuestGraphic(player, 0x0);
man0u0Quest:SetQuestFlag(MAN0U0_FLAG_MINITUT_DONE1, true); man0u0Quest:SetQuestFlag(MAN0U0_FLAG_MINITUT_DONE1, true);
man0u0Quest:SaveData(); man0u0Quest:SaveData();
end end
end end
player:GetDirector("OpeningDirector"):onTalkEvent(player, npc);
else else
player:EndEvent(); player:EndEvent();
end end

View File

@ -0,0 +1,48 @@
require ("global")
require ("quests/man/man0u0")
function onSpawn(player, npc)
man0u0Quest = player:GetQuest("Man0u0");
if (man0u0Quest ~= nil) then
player:SetEventStatus(npc, "pushDefault", true, 0x2);
if (man0u0Quest ~= nil and man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE1) == true and man0U0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE2) == true and man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE3) == true) then
npc:SetQuestGraphic(player, 0x3);
else
npc:SetQuestGraphic(player, 0x0);
end
end
end
function onEventStarted(player, npc, triggerName)
man0u0Quest = GetStaticActor("Man0u0");
if (man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE1) ~= true) then
print "AAAA"
end
--if (man0u0Quest ~= nil and man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE1) == true and man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE2) == true and man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE3) == true) then
player:EndEvent();
worldMaster = GetWorldMaster();
player:SendGameMessage(player, worldMaster, 34108, 0x20);
player:SendGameMessage(player, worldMaster, 50011, 0x20);
director = player:GetZone():CreateDirector("Quest/QuestDirectorMan0u001");
player:KickEvent(director, "noticeEvent", true);
player:AddDirector(director);
player:SetLoginDirector(director);
GetWorldManager():DoZoneChange(player, 17);
end
--[[AFTER GOOBBUE
22.81, 196, 87.82
]]
--0x45c00005

View File

@ -1,20 +1,31 @@
require ("global") require ("global")
require ("quests/man/man0u0") require ("quests/man/man0u0")
function onSpawn(player, npc)
man0u0Quest = player:GetQuest("Man0u0");
if (man0u0Quest ~= nil) then
if (man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE1) == false) then
npc:SetQuestGraphic(player, 0x2);
end
end
end
function onEventStarted(player, npc, triggerName) function onEventStarted(player, npc, triggerName)
man0u0Quest = player:GetQuest("Man0u0"); man0u0Quest = player:GetQuest("Man0u0");
if (man0u0Quest != nil) if (man0u0Quest ~= nil) then
if (man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE2) == false) then if (triggerName == "talkDefault") then
callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrMini002_first", nil, nil, nil); if (man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE2) == false) then
npc:SetQuestGraphic(player, 0x0); callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrMini002_first", nil, nil, nil);
man0u0Quest:SetQuestFlag(MAN0U0_FLAG_MINITUT_DONE2, true); npc:SetQuestGraphic(player, 0x0);
man0u0Quest:SaveData(); man0u0Quest:SetQuestFlag(MAN0U0_FLAG_MINITUT_DONE2, true);
player:GetDirector():OnTalked(npc); man0u0Quest:SaveData();
else player:GetDirector("OpeningDirector"):onTalkEvent(player, npc);
callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrMini002", nil, nil, nil); else
callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrMini002", nil, nil, nil);
end
end end
end end
player:EndEvent(); player:EndEvent();
end end

View File

@ -1,21 +1,31 @@
require ("global") require ("global")
require ("quests/man/man0u0") require ("quests/man/man0u0")
function onSpawn(player, npc)
man0u0Quest = player:GetQuest("Man0u0");
if (man0u0Quest ~= nil) then
if (man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE3) == false) then
npc:SetQuestGraphic(player, 0x2);
end
end
end
function onEventStarted(player, npc, triggerName) function onEventStarted(player, npc, triggerName)
man0u0Quest = player:GetQuest("Man0u0"); man0u0Quest = player:GetQuest("Man0u0");
if (man0u0Quest ~= nil) then if (man0u0Quest ~= nil) then
if (triggerName == "talkDefault") then
if (man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE3) == false) then if (man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE3) == false) then
callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrMini003_first", nil, nil, nil); callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrMini003_first", nil, nil, nil);
npc:SetQuestGraphic(player, 0x0); npc:SetQuestGraphic(player, 0x0);
man0u0Quest:SetQuestFlag(MAN0U0_FLAG_MINITUT_DONE3, true); man0u0Quest:SetQuestFlag(MAN0U0_FLAG_MINITUT_DONE3, true);
man0u0Quest:SaveData(); man0u0Quest:SaveData();
player:GetDirector():OnTalked(npc); player:GetDirector("OpeningDirector"):onTalkEvent(player, npc);
else else
callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrMini003", nil, nil, nil); callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrMini003", nil, nil, nil);
end
end end
end end
player:EndEvent(); player:EndEvent();
end end

View File

@ -2,5 +2,7 @@ require ("global")
require ("quests/man/man0u0") require ("quests/man/man0u0")
function onEventStarted(player, npc, triggerName) function onEventStarted(player, npc, triggerName)
man0u0Quest = GetStaticActor("Man0u0");
callClientFunction(player, "delegateEvent", player, man0u0Quest, "processEvent000_3", nil, nil, nil);
player:EndEvent(); player:EndEvent();
end end