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,
destinationZoneId = @destZone,
destinationSpawnType = @destSpawn,
currentZoneId = @zoneId
currentZoneId = @zoneId,
currentPrivateArea = @privateArea,
currentPrivateAreaType = @privateAreaType
WHERE id = @charaId
";
@ -248,6 +250,8 @@ namespace FFXIVClassic_Map_Server
cmd.Parameters.AddWithValue("@z", player.positionZ);
cmd.Parameters.AddWithValue("@rot", player.rotation);
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("@destSpawn", player.destinationSpawnType);
@ -327,7 +331,7 @@ namespace FFXIVClassic_Map_Server
VALUES
(@charaId, @slot, @questId, @questData, @questFlags)
ON DUPLICATE KEY UPDATE
questData = @questData, questFlags = @questFlags
questId = @questId, questData = @questData, questFlags = @questFlags
";
cmd = new MySqlCommand(query, conn);
@ -385,7 +389,9 @@ namespace FFXIVClassic_Map_Server
achievementPoints,
playTime,
destinationZoneId,
destinationSpawnType
destinationSpawnType,
currentPrivateArea,
currentPrivateAreaType
FROM characters WHERE id = @charId";
cmd = new MySqlCommand(query, conn);
@ -419,10 +425,17 @@ namespace FFXIVClassic_Map_Server
player.destinationZone = reader.GetUInt32("destinationZoneId");
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)
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\GMTicketIssuesRequestPacket.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\ActorInstantiatePacket.cs" />
<Compile Include="packets\send\actor\ActorSpecialGraphicPacket.cs" />

View File

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

View File

@ -111,6 +111,7 @@ namespace FFXIVClassic_Map_Server
id,
parentZoneId,
privateAreaName,
privateAreaType,
className,
dayMusic,
nightMusic,
@ -129,7 +130,7 @@ namespace FFXIVClassic_Map_Server
if (zoneList.ContainsKey(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);
}
else
@ -184,7 +185,7 @@ namespace FFXIVClassic_Map_Server
if (!reader.IsDBNull(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;
count++;
}
@ -548,19 +549,19 @@ namespace FFXIVClassic_Map_Server
}
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.
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
Area newArea;
if (destinationPrivateArea == null)
newArea = GetZone(destinationZoneId);
else
newArea = GetZone(destinationZoneId).GetPrivateArea(destinationPrivateArea, 0);
else //Add check for -1 if it is a instance
newArea = GetZone(destinationZoneId).GetPrivateArea(destinationPrivateArea, (uint)destinationPrivateAreaType);
//This server does not contain that zoneId
if (newArea == null)
@ -581,6 +582,9 @@ namespace FFXIVClassic_Map_Server
//Update player actor's properties
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.positionX = spawnX;
player.positionY = spawnY;
@ -589,11 +593,15 @@ namespace FFXIVClassic_Map_Server
//Send packets
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.playerSession.ClearInstance();
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);
}
@ -630,7 +638,7 @@ namespace FFXIVClassic_Map_Server
player.rotation = spawnRotation;
//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.SendInstanceUpdate();
@ -845,6 +853,17 @@ namespace FFXIVClassic_Map_Server
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)
{
foreach (Zone zone in zoneList.Values)
@ -863,6 +882,14 @@ namespace FFXIVClassic_Map_Server
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()
{
return worldMaster;
@ -877,16 +904,18 @@ namespace FFXIVClassic_Map_Server
{
public uint zoneId;
public string privateAreaName;
public int privateAreaType;
public byte spawnType;
public float spawnX;
public float spawnY;
public float spawnZ;
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.privateAreaName = privateAreaName;
this.privateAreaType = privateAreaType;
this.spawnType = spawnType;
this.spawnX = x;
this.spawnY = y;

View File

@ -28,6 +28,8 @@ namespace FFXIVClassic_Map_Server.Actors
public float[] moveSpeeds = new float[4];
public uint zoneId, zoneId2;
public string privateArea;
public uint privateAreaType;
public Area zone = null;
public Area zone2 = null;
public bool isZoning = false;
@ -351,7 +353,7 @@ namespace FFXIVClassic_Map_Server.Actors
uint zoneId = zone.actorId;
uint privLevel = 0;
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);
}

View File

@ -298,6 +298,19 @@ namespace FFXIVClassic_Map_Server.Actors
if (!mActorList.ContainsKey(id))
return null;
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)
@ -360,7 +373,16 @@ namespace FFXIVClassic_Map_Server.Actors
if (actorClass == null)
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);
AddActorToZone(npc);

View File

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

View File

@ -16,6 +16,7 @@ namespace FFXIVClassic_Map_Server.actors.area
class Zone : Area
{
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)
: 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)
{
if (privateAreas.ContainsKey(pa.GetPrivateAreaName()))
privateAreas[pa.GetPrivateAreaName()][0] = pa;
privateAreas[pa.GetPrivateAreaName()][pa.GetPrivateAreaType()] = pa;
else
{
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_Map_Server.actors;
using FFXIVClassic_Map_Server.actors.area;
using FFXIVClassic_Map_Server.actors.chara.npc;
using FFXIVClassic_Map_Server.Actors.Chara;
using FFXIVClassic_Map_Server.dataobjects;
using FFXIVClassic_Map_Server.lua;
using FFXIVClassic_Map_Server.packets.receive.events;
using FFXIVClassic_Map_Server.packets.send.actor;
using FFXIVClassic_Map_Server.utils;
@ -27,8 +27,8 @@ namespace FFXIVClassic_Map_Server.Actors
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)
: base((4 << 28 | zoneId << 19 | (uint)actorNumber))
public Npc(int actorNumber, ActorClass actorClass, string uniqueId, Area spawnedArea, float posX, float posY, float posZ, float rot, ushort actorState, uint animationId, string customDisplayName)
: base((4 << 28 | spawnedArea.actorId << 19 | (uint)actorNumber))
{
this.positionX = posX;
this.positionY = posY;
@ -41,8 +41,8 @@ namespace FFXIVClassic_Map_Server.Actors
this.uniqueIdentifier = uniqueId;
this.zoneId = zoneId;
this.zone = Server.GetWorldManager().GetZone(zoneId);
this.zoneId = spawnedArea.actorId;
this.zone = spawnedArea;
this.actorClassId = actorClass.actorClassId;
@ -131,8 +131,12 @@ namespace FFXIVClassic_Map_Server.Actors
subpackets.AddRange(GetEventConditionPackets(playerActorId));
subpackets.Add(CreateSpeedPacket(playerActorId));
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));
}
@ -167,16 +171,16 @@ namespace FFXIVClassic_Map_Server.Actors
}
else if (actorClassId == 5900013)
{
uint id = 2;
uint id2 = 5144;
string val = "fdot";
uint id = 201;
uint id2 = 0x1415;
string val = "fdin";
subpackets.Add(_0xD8Packet.BuildPacket(actorId, playerActorId, id, id2));
subpackets.Add(_0xD9Packet.BuildPacket(actorId, playerActorId, val));
}
else if (actorClassId == 5900014)
{
uint id = 2;
uint id2 = 5145;
uint id = 201;
uint id2 = 0x1415;
string val = "fdot";
subpackets.Add(_0xD8Packet.BuildPacket(actorId, playerActorId, id, id2));
subpackets.Add(_0xD9Packet.BuildPacket(actorId, playerActorId, val));
@ -374,8 +378,17 @@ namespace FFXIVClassic_Map_Server.Actors
if (File.Exists("./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)
{
@ -402,8 +415,16 @@ namespace FFXIVClassic_Map_Server.Actors
if (File.Exists("./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)
{

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);
}
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)
@ -186,10 +214,15 @@ namespace FFXIVClassic_Map_Server.actors.director
uint zoneId = zone.actorId;
uint privLevel = 0;
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);
}
public string GetScriptPath()
{
return directorScriptPath;
}
}
}

View File

@ -41,6 +41,11 @@ namespace FFXIVClassic_Map_Server.Actors
//Inform update
}
public uint GetQuestId()
{
return actorId & 0xFFFFF;
}
public object GetQuestData(string dataName)
{
if (questData.ContainsKey(dataName))
@ -52,12 +57,7 @@ namespace FFXIVClassic_Map_Server.Actors
public void ClearQuestData()
{
questData.Clear();
}
public uint GetQuestId()
{
return actorId;
}
}
public void ClearQuestFlags()
{
@ -98,9 +98,11 @@ namespace FFXIVClassic_Map_Server.Actors
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()

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)
{
if (File.Exists(FILEPATH_PLAYER))
@ -393,48 +410,6 @@ namespace FFXIVClassic_Map_Server.lua
player.SendMessage(SendMessagePacket.MESSAGE_TYPE_SYSTEM_ERROR, "", message);
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
{
class _0x07Packet
class ZoneInCompletePacket
{
public bool invalidPacket = false;
public uint timestamp;
public uint unknown;
public int unknown;
public _0x07Packet(byte[] data)
public ZoneInCompletePacket(byte[] data)
{
using (MemoryStream mem = new MemoryStream(data))
{
@ -17,7 +17,7 @@ namespace FFXIVClassic_Map_Server.packets.receive
{
try{
timestamp = binReader.ReadUInt32();
unknown = binReader.ReadUInt32();
unknown = binReader.ReadInt32();
}
catch (Exception){
invalidPacket = true;

View File

@ -24,7 +24,7 @@ namespace FFXIVClassic_Map_Server.packets.send.events
binWriter.Write((UInt32)playerActorId);
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)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)
--callClientFunction(player, "eventTalkWelcome", player);
callClientFunction(player, "eventTalkWelcome", player);
callClientFunction(player, "eventAskMainMenu", player, 20, true, true, true, true, 4);
callClientFunction(player, "eventTalkMyChocobo", player);
callClientFunction(player, "eventSetChocoboName", false);
callClientFunction(player, "eventAfterChocoboName", player);
--callClientFunction(player, "eventTalkMyChocobo", player);
--callClientFunction(player, "eventSetChocoboName", false);
--callClientFunction(player, "eventAfterChocoboName", player);
player:EndEvent();
end

View File

@ -42,7 +42,7 @@ function onEventStarted(player, npc, triggerName)
createLinkshell(lsName, crestId);
callClientFunction(player, "eventTalkStepMakeupDone");
--Modify
elseif (result == 1) then
elseif (result == 4) then
modifyLinkshell(lsName, crestId);
callClientFunction(player, "eventTalkStepModifyDone");
--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);
end
player:endEvent();
--player:endEvent();
--For Opening Tutorial
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

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);
elseif (initialTown == 3 and player:HasQuest(110009) == false) then
player:AddQuest(110009);
end
end
end
--For Opening. Set Director and reset position incase d/c
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.positionY = 10.35;
--player.positionZ = -36.91;
player.positionZ = -20.91;
player.positionZ = -36.91;
player.rotation = 0.025;
player:GetQuest(110001):ClearQuestData();
player:GetQuest(110001):ClearQuestFlags();
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.positionY = 4.21;
player.positionZ = -706.1074;
@ -35,15 +42,18 @@ function onBeginLogin(player)
player:GetQuest(110005):ClearQuestData();
player:GetQuest(110005):ClearQuestFlags();
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.positionY = 196.0;
player.positionZ = 133.6561;
player.rotation = -2.849384;
player:GetQuest(110009):ClearQuestData();
player:GetQuest(110009):ClearQuestFlags();
end
end
end
@ -54,7 +64,9 @@ function onLogin(player)
player:SendMessage(0x1D,"",">PlayTime == 0, new player!");
initClassItems(player);
initRaceItems(player);
initRaceItems(player);
player:SavePlayTime();
end
end

View File

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

View File

@ -1,6 +1,7 @@
--Quest Flags
MAN0U0_FLAG_TUTORIAL1_DONE = 0;
MAN0U0_FLAG_TUTORIAL2_DONE = 1;
MAN0U0_FLAG_TUTORIAL3_DONE = 2;
MAN0U0_FLAG_MINITUT_DONE1 = 4;
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 (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:SaveData();
npc:SetQuestGraphic(player, 0x0);
player:GetDirector():OnTalked(npc);
else
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
callClientFunction(player, "delegateEvent", player, man0g0Quest, "processTtrNomal002", nil, nil, nil);
elseif (triggerName == "talkDefault") then
--Is doing talk tutorial?
if (man0g0Quest:GetQuestFlag(MAN0G0_FLAG_TUTORIAL1_DONE) == false) then
callClientFunction(player, "delegateEvent", player, man0g0Quest, "processTtrNomal003", nil, nil, nil);
player:SetEventStatus(npc, "pushDefault", false, 0x2);
npc:SetQuestGraphic(player, 0x2);
player:GetDirector():OnTalked(npc);
man0g0Quest:SetQuestFlag(MAN0G0_FLAG_TUTORIAL1_DONE, true);
man0g0Quest:SaveData();
--Was she talked to after papalymo?
else
if (man0g0Quest:GetQuestFlag(MAN0G0_FLAG_MINITUT_DONE1) == true) then
man0g0Quest:SetQuestFlag(MAN0G0_FLAG_TUTORIAL2_DONE, true);
callClientFunction(player, "delegateEvent", player, man0g0Quest, "processEvent010_1", nil, nil, nil);
if (man0g0Quest:GetQuestFlag(MAN0G0_FLAG_MINITUT_DONE1) == 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);
return;
else
callClientFunction(player, "delegateEvent", player, man0g0Quest, "processEvent000_1", nil, nil, nil);
end
@ -31,24 +42,4 @@ function onEventStarted(player, npc, triggerName)
end
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

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);
man0l0Quest:SetQuestFlag(MAN0L0_FLAG_MINITUT_DONE3, true);
man0l0Quest:SaveData();
player:GetDirector():OnTalked(npc);
player:GetDirector("OpeningDirector"):onTalkEvent(player, npc);
else
callClientFunction(player, "delegateEvent", player, man0l0Quest, "processEvent000_8", nil, nil, nil);
end

View File

@ -24,14 +24,17 @@ function onEventStarted(player, npc, triggerName)
if (choice == 1) then
callClientFunction(player, "delegateEvent", player, man0l0Quest, "processEvent000_2", nil, nil, nil, nil);
player:EndEvent();
player:SetDirector("QuestDirectorMan0l001", true);
worldMaster = GetWorldMaster();
player:SendGameMessage(player, worldMaster, 34108, 0x20);
player:SendGameMessage(player, worldMaster, 50011, 0x20);
GetWorldManager():DoPlayerMoveInZone(player, 9);
player:KickEvent(player:GetDirector(), "noticeEvent", true);
director = player:GetZone():CreateDirector("Quest/QuestDirectorMan0l001");
player:KickEvent(director, "noticeEvent", true);
player:AddDirector(director);
player:SetLoginDirector(director);
GetWorldManager():DoZoneChange(player, 9);
else
player:EndEvent();
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);
man0l0Quest:SaveData();
player:GetDirector():OnTalked(npc);
player:GetDirector("OpeningDirector"):onTalkEvent(player, npc);
--Was he talked to for the mini tutorial?
else
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:SaveData();
player:GetDirector():OnTalked(npc);
player:GetDirector("OpeningDirector"):onTalkEvent(player, npc);
end
end
end

View File

@ -20,9 +20,8 @@ function onEventStarted(player, npc, triggerName)
callClientFunction(player, "delegateEvent", player, man0l0Quest, "processTtrMini002", nil, nil, nil);
npc:SetQuestGraphic(player, 0x0);
man0l0Quest:SetQuestFlag(MAN0L0_FLAG_MINITUT_DONE2, true);
man0l0Quest:SaveData();
player:GetDirector():OnTalked(npc);
man0l0Quest:SaveData();
player:GetDirector("OpeningDirector"):onTalkEvent(player, npc);
else
callClientFunction(player, "delegateEvent", player, man0l0Quest, "processEvent000_13", nil, nil, nil);
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")
function onEventStarted(player, npc, triggerName)
man0u0Quest = GetStaticActor("Man0u0");
callClientFunction(player, "delegateEvent", player, man0u0Quest, "defaultTalkWithLady001_001", nil, nil, nil);
man0u0Quest = GetStaticActor("Man0u0");
callClientFunction(player, "delegateEvent", player, man0u0Quest, "processEvent000_13", nil, nil, nil);
player:EndEvent();
end

View File

@ -9,25 +9,40 @@ function onEventStarted(player, npc, triggerName)
man0u0Quest = player:GetQuest("Man0u0");
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);
elseif (triggerName == "talkDefault") then
if (man0u0Quest:GetQuestFlag(MAN0U0_FLAG_TUTORIAL1_DONE) == false) then
callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrNomal003", nil, nil, nil);
--Is doing talk tutorial?
if (man0u0Quest:GetQuestFlag(MAN0U0_FLAG_TUTORIAL3_DONE) == false) then
player:SetEventStatus(npc, "pushDefault", false, 0x2);
player:GetDirector():OnTalked(npc);
man0u0Quest:SetQuestFlag(MAN0U0_FLAG_TUTORIAL1_DONE, true);
callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrNomal003", nil, nil, nil);
man0u0Quest:SetQuestFlag(MAN0U0_FLAG_TUTORIAL3_DONE, true);
npc:SetQuestGraphic(player, 0x2);
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
npc:SetQuestGraphic(player, 0x0);
man0u0Quest:SetQuestFlag(MAN0U0_FLAG_MINITUT_DONE1, true);
man0u0Quest:SaveData();
man0u0Quest:SaveData();
end
end
player:GetDirector("OpeningDirector"):onTalkEvent(player, npc);
else
player:EndEvent();
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 ("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)
man0u0Quest = player:GetQuest("Man0u0");
if (man0u0Quest != nil)
if (man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE2) == false) then
callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrMini002_first", nil, nil, nil);
npc:SetQuestGraphic(player, 0x0);
man0u0Quest:SetQuestFlag(MAN0U0_FLAG_MINITUT_DONE2, true);
man0u0Quest:SaveData();
player:GetDirector():OnTalked(npc);
else
callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrMini002", nil, nil, nil);
if (man0u0Quest ~= nil) then
if (triggerName == "talkDefault") then
if (man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE2) == false) then
callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrMini002_first", nil, nil, nil);
npc:SetQuestGraphic(player, 0x0);
man0u0Quest:SetQuestFlag(MAN0U0_FLAG_MINITUT_DONE2, true);
man0u0Quest:SaveData();
player:GetDirector("OpeningDirector"):onTalkEvent(player, npc);
else
callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrMini002", nil, nil, nil);
end
end
end
player:EndEvent();
end

View File

@ -1,21 +1,31 @@
require ("global")
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)
man0u0Quest = player:GetQuest("Man0u0");
if (man0u0Quest ~= nil) then
if (man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE3) == false) then
callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrMini003_first", nil, nil, nil);
npc:SetQuestGraphic(player, 0x0);
man0u0Quest:SetQuestFlag(MAN0U0_FLAG_MINITUT_DONE3, true);
man0u0Quest:SaveData();
player:GetDirector():OnTalked(npc);
else
callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrMini003", nil, nil, nil);
if (triggerName == "talkDefault") then
if (man0u0Quest:GetQuestFlag(MAN0U0_FLAG_MINITUT_DONE3) == false) then
callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrMini003_first", nil, nil, nil);
npc:SetQuestGraphic(player, 0x0);
man0u0Quest:SetQuestFlag(MAN0U0_FLAG_MINITUT_DONE3, true);
man0u0Quest:SaveData();
player:GetDirector("OpeningDirector"):onTalkEvent(player, npc);
else
callClientFunction(player, "delegateEvent", player, man0u0Quest, "processTtrMini003", nil, nil, nil);
end
end
end
player:EndEvent();
end

View File

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