mirror of
https://bitbucket.org/Ioncannon/project-meteor-server.git
synced 2025-06-09 05:54:50 +02:00
DftFst.lua - about as documented as I can get it for now. Will finalize some NPC argument checks next time.
quest.lua - Script refactored. Moved as much as possible out of the main function to tidy it up. Folded in a complete-quest function from another script. Only works with quest id numbers for now. String support (eg. Man0u0) to come in another commit. ObjectInnDoor.lua - Fixed it to handle events again with the current system.
This commit is contained in:
parent
08557f41fb
commit
01ec313ffb
3 changed files with 343 additions and 276 deletions
|
@ -5,166 +5,207 @@ properties = {
|
|||
parameters = "ssss",
|
||||
description =
|
||||
[[
|
||||
Add/Remove Quests, modify <phase> and <flag 0-32>.
|
||||
!quest add/remove <quest> |
|
||||
!quest phase <quest> <phase> |
|
||||
!quest flag <quest> <flag> true/false |
|
||||
Add/Remove/Complete Quests, modify <sequence> and <flag 0-32>.
|
||||
!quest <quest> <add/remove> <#> |
|
||||
!quest <quest> <sequence> <#> |
|
||||
!quest <quest> <flag> <#> true/false |
|
||||
]],
|
||||
}
|
||||
|
||||
function onTrigger(player, argc, command, var1, var2, var3)
|
||||
function onTrigger(player, argc, quest, command, var1, var2)
|
||||
|
||||
local messageID = MESSAGE_TYPE_SYSTEM_ERROR;
|
||||
local sender = "[quest] ";
|
||||
local message = "Error";
|
||||
local questId = tonumber(quest);
|
||||
|
||||
print(tostring(argc));
|
||||
if player then
|
||||
if argc == 2 then
|
||||
if command == "add" or command == "give" or command == "+" then
|
||||
if tonumber(var1) then
|
||||
if player:HasQuest(tonumber(var1)) == false then
|
||||
player:AddQuest(tonumber(var1));
|
||||
message = ("adding quest "..var1);
|
||||
else
|
||||
message = ("already have quest "..var1);
|
||||
end
|
||||
else
|
||||
if player:HasQuest(var1) == false then
|
||||
player:AddQuest(var1);
|
||||
message = ("adding quest "..var1);
|
||||
else
|
||||
message = ("already have quest "..var1);
|
||||
end
|
||||
end
|
||||
|
||||
elseif command == "remove" or command == "delete" or command == "-" then
|
||||
if tonumber(var1) and player:HasQuest(tonumber(var1)) == true then
|
||||
player:RemoveQuest(tonumber(var1));
|
||||
message = ("removing quest "..var1);
|
||||
else
|
||||
if player:HasQuest(var1) == true then
|
||||
q2 = GetStaticActor(var1);
|
||||
|
||||
if q2 ~= nil then
|
||||
q3 = q2.Id;
|
||||
message = ("removing quest "..var1);
|
||||
printf(q3);
|
||||
q4 = bit32.band(q3, 0xA0F00000);
|
||||
printf(q4);
|
||||
|
||||
player:RemoveQuest(quest.Name);
|
||||
end
|
||||
else
|
||||
message = ("remove error: either incorrect ID or quest "..var1.." isn't active on character");
|
||||
end
|
||||
end
|
||||
elseif command == "info" then
|
||||
if tonumber(var1) then
|
||||
if player:HasQuest(tonumber(var1)) then
|
||||
quest = player:GetQuest(tonumber(var1));
|
||||
|
||||
local flagStr = "";
|
||||
for i=0,31,1 do
|
||||
if (quest:GetData():GetFlag(i)) then
|
||||
flagStr = flagStr .. "O";
|
||||
else
|
||||
flagStr = flagStr .. "X";
|
||||
end
|
||||
if (i == 15) then
|
||||
flagStr = flagStr .. "\n";
|
||||
end
|
||||
end
|
||||
|
||||
local data = quest:GetData();
|
||||
|
||||
message = string.format("\nInfo for quest %s [%d]\n", quest.Name, quest:GetQuestId());
|
||||
message = message .. string.format("Current Sequence: %d\n", quest:getSequence());
|
||||
message = message .. string.format("Flags: \n%s\n", flagStr)
|
||||
message = message .. string.format("Counters: %d,%d,%d,%d", data:getCounter(0), data:getCounter(1), data:getCounter(2), data:getCounter(3));
|
||||
else
|
||||
message = ("Quest not active: "..var1);
|
||||
end
|
||||
else
|
||||
message = ("error: invalid parameters used");
|
||||
end
|
||||
if (type(questId) == "number") then
|
||||
if (questId < 110001 or questId > 110001 + 2048) and player then
|
||||
player:SendMessage(messageID, sender, "Invalid questId entered");
|
||||
player:SendMessage(messageID, sender, argc);
|
||||
return;
|
||||
else
|
||||
if (command == "add" or command == "give" or command == "+") then
|
||||
message = addQuest(player, questId);
|
||||
elseif (command == "remove" or command == "delete" or command == "-") then
|
||||
message = removeQuest(player, questId);
|
||||
elseif (command == "complete" or command == "completed" or command == "finish") then
|
||||
message = setQuestCompletion(player, argc, questId, var1);
|
||||
elseif (command == "info") then
|
||||
message = getQuestInfo(player, questId);
|
||||
elseif (command == "seq" or command == "sequence") then
|
||||
message = setQuestSequence(player, questId, tonumber(var1));
|
||||
elseif (command == "flag") then
|
||||
message = setQuestFlag(player, questId, var1, var2);
|
||||
elseif (command == "counter" or command == "count") then
|
||||
message = setQuestCounter(player, questId, var1, var2);
|
||||
else
|
||||
message = ("error: command "..command.." not recognized");
|
||||
end
|
||||
elseif argc == 3 then
|
||||
if command == "seq" or command == "sequence" then
|
||||
if (tonumber(var1) and tonumber(var2)) ~= nil then
|
||||
if player:HasQuest(tonumber(var1)) == true then
|
||||
player:GetQuest(tonumber(var1)):StartSequence(tonumber(var2));
|
||||
message = ("changing sequence of quest "..var1.." to "..var2);
|
||||
else
|
||||
message = ("sequence error: either incorrect ID or quest "..var1.." isn't active on character");
|
||||
end
|
||||
else
|
||||
message = ("error: invalid parameters used");
|
||||
end
|
||||
else
|
||||
message = ("error: command "..command.." not recognized");
|
||||
end;
|
||||
|
||||
elseif argc == 4 then
|
||||
if command == "flag" then
|
||||
if tonumber(var1) and (tonumber(var2) >= 0 and tonumber(var2) <= 32) then
|
||||
questvar = tonumber(var1);
|
||||
flagvar = (tonumber(var2));
|
||||
boolvar = 0;
|
||||
|
||||
if var3 == "true" or var3 == "1" or var3 == "on" or var3 == "O" then
|
||||
boolvar = true;
|
||||
elseif var3 == "false" or var3 == "0" or var3 == "off" or var3 == "X" then
|
||||
boolvar = false;
|
||||
elseif var3 == "flip" or var3 == "toggle" then
|
||||
if player:HasQuest(questvar) == true then
|
||||
boolvar = not player:GetQuest(questvar):GetData():GetFlag(flagvar);
|
||||
end
|
||||
else
|
||||
message = ("error: flag: boolean not recognized");
|
||||
print(sender..message);
|
||||
return;
|
||||
end
|
||||
|
||||
var4 = player:GetQuest(questvar):GetData():GetFlag(flagvar);
|
||||
|
||||
if var4 ~= boolvar then
|
||||
if (boolvar == true) then
|
||||
player:GetQuest(questvar):GetData():SetFlag(flagvar);
|
||||
else
|
||||
player:GetQuest(questvar):GetData():ClearFlag(flagvar);
|
||||
end
|
||||
player:GetQuest(questvar):UpdateENPCs();
|
||||
player:GetQuest(questvar):GetData():Save();
|
||||
if boolvar == true then
|
||||
message = ("changing flag "..tonumber(var2).." to true on quest "..questvar);
|
||||
else
|
||||
message = ("changing flag "..tonumber(var2).." to false on quest "..questvar);
|
||||
end
|
||||
else
|
||||
message = ("error: flag "..flagvar.." is already set to that state on quest "..questvar);
|
||||
end
|
||||
else
|
||||
message = ("error: command "..command.." not recognized");
|
||||
end
|
||||
elseif command == "counter" then
|
||||
if tonumber(var1) and (tonumber(var2) >= 0 and tonumber(var2) <= 4) then
|
||||
questvar = tonumber(var1);
|
||||
index = (tonumber(var2));
|
||||
|
||||
player:GetQuest(questvar):GetData():SetCounter(index, tonumber(var3));
|
||||
player:GetQuest(questvar):UpdateENPCs();
|
||||
player:GetQuest(questvar):GetData():Save();
|
||||
message = ("changing counter "..tonumber(var2).." to "..var3);
|
||||
else
|
||||
message = ("error: command "..command.." not recognized");
|
||||
end
|
||||
end
|
||||
message = ("Error: Command "..command.." not recognized");
|
||||
end
|
||||
end
|
||||
else
|
||||
message = ("Error: Quest id must be a valid number.")
|
||||
end
|
||||
|
||||
player:SendMessage(messageID, sender, message);
|
||||
print(sender..message);
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
function addQuest(player, questId)
|
||||
if (not (player:HasQuest(questId))) then
|
||||
player:AddQuest(questId);
|
||||
return string.format("Adding quest "..player:GetQuest(questId).name.." ["..questId.."]");
|
||||
else
|
||||
return string.format("Already have quest "..player:GetQuest(questId).name.." ["..questId.."]");
|
||||
end
|
||||
end
|
||||
|
||||
function removeQuest(player, questId)
|
||||
if (player:HasQuest(questId)) then
|
||||
local questName = player:GetQuest(questId).name;
|
||||
player:RemoveQuest(questId);
|
||||
return string.format("Removing quest "..questName.." ["..questId.."]");
|
||||
else
|
||||
return string.format("Error: Either incorrect ID or quest "..questId.." isn't active on character.");
|
||||
end
|
||||
end
|
||||
|
||||
function setQuestCompletion(player, argc, questId, flag)
|
||||
|
||||
if (argc == 2) then -- No flag entered -> Return state of the quest's completion.
|
||||
return string.format("Quest %d completion is set to: %s", questId, tostring(player:IsQuestCompleted(questId)));
|
||||
else
|
||||
local boolFlag = false;
|
||||
|
||||
if (flag == "true" or flag == "1" or flag == "on" or flag == "O") then
|
||||
boolFlag = true;
|
||||
elseif (flag == "false" or flag == "0" or flag == "off" or flag == "X") then
|
||||
boolFlag = false;
|
||||
elseif flag == "flip" or flag == "toggle" then
|
||||
boolFlag = not player:IsQuestCompleted(questId);
|
||||
else -- A catch for bad inputs
|
||||
return string.format("Error: Invalid flag entered");
|
||||
end
|
||||
|
||||
player:SetQuestComplete(questId, boolFlag);
|
||||
return string.format("Quest %d completion set to: %s", questId, tostring(player:IsQuestCompleted(questId)));
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
function setQuestSequence(player, questId, sequence)
|
||||
if (type(sequence) == "number") then
|
||||
if (player:HasQuest(questId)) then
|
||||
local seq = math.floor(tonumber(sequence));
|
||||
if (seq >= 0 and seq <= 65535) then
|
||||
player:GetQuest(questId):StartSequence(seq);
|
||||
return string.format("Changing sequence of quest "..player:GetQuest(questId).name.." ["..questId.."] to "..seq);
|
||||
else
|
||||
return string.format("Error: Sequence value must be within 0-65535.");
|
||||
end
|
||||
else
|
||||
return string.format("Sequence error: either incorrect ID or quest "..questId.." isn't active on character");
|
||||
end
|
||||
else
|
||||
return string.format("Error: Sequence value must be a valid number.");
|
||||
end
|
||||
end
|
||||
|
||||
function setQuestFlag(player, questId, flagNum, flagCmd)
|
||||
local questvar = questId;
|
||||
local flagvar = tonumber(flagNum);
|
||||
local boolvar = 0;
|
||||
|
||||
if (player:HasQuest(questvar)) then
|
||||
if (flagvar >= 0 and flagvar <= 31) then
|
||||
|
||||
if flagCmd == "true" or flagCmd == "1" or flagCmd == "on" or flagCmd == "O" then
|
||||
boolvar = true;
|
||||
elseif flagCmd == "false" or flagCmd == "0" or flagCmd == "off" or flagCmd == "X" then
|
||||
boolvar = false;
|
||||
elseif flagCmd == "flip" or flagCmd == "toggle" then
|
||||
boolvar = not player:GetQuest(questvar):GetData():GetFlag(flagvar);
|
||||
else
|
||||
return "Error: Flag: Boolean not recognized."
|
||||
end
|
||||
|
||||
currentFlagState = player:GetQuest(questvar):GetData():GetFlag(flagvar);
|
||||
|
||||
if (currentFlagState ~= boolvar) then
|
||||
|
||||
if (boolvar == true) then
|
||||
player:GetQuest(questvar):GetData():SetFlag(flagvar);
|
||||
else
|
||||
player:GetQuest(questvar):GetData():ClearFlag(flagvar);
|
||||
end
|
||||
player:GetQuest(questvar):UpdateENPCs();
|
||||
player:GetQuest(questvar):GetData():Save();
|
||||
if boolvar == true then
|
||||
return string.format("Changing flag "..tonumber(flagNum).." to true on quest "..questvar);
|
||||
else
|
||||
return string.format("Changing flag "..tonumber(flagNum).." to false on quest "..questvar);
|
||||
end
|
||||
else
|
||||
return string.format("Error: Flag "..flagvar.." is already set to that state on quest "..questvar);
|
||||
end
|
||||
else
|
||||
return string.format("Error: Flag "..flagNum.." is not within the valid range of 0-31.");
|
||||
end
|
||||
else
|
||||
return string.format("Error: Either incorrect ID or quest "..tostring(questId).." isn't active on character.");
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
function setQuestCounter(player, questId, counterSlot, counterValue)
|
||||
local cSlot = tonumber(counterSlot) or nil;
|
||||
local cVal = tonumber(counterValue) or nil;
|
||||
|
||||
if (cSlot ~= nil and cSlot >= 0 and cSlot <= 3) then
|
||||
if (cVal ~= nil and cVal >= 0 and cVal <= 255) then
|
||||
player:GetQuest(questId):GetData():SetCounter(cSlot, cVal);
|
||||
player:GetQuest(questId):UpdateENPCs();
|
||||
player:GetQuest(questId):GetData():Save();
|
||||
|
||||
return string.format("Changing counter "..cSlot.." to "..cVal);
|
||||
else
|
||||
return string.format("Error: Invalid counter value. Must be between 0-255.");
|
||||
end
|
||||
else
|
||||
return string.format("Error: Invalid counter index. Must be between 0-3.");
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
function getQuestInfo(player, questId)
|
||||
if player:HasQuest(questId) then
|
||||
quest = player:GetQuest(questId);
|
||||
|
||||
local msg = "";
|
||||
local flagStr = "";
|
||||
|
||||
for i=0,31,1 do
|
||||
if (quest:GetData():GetFlag(i)) then
|
||||
flagStr = flagStr .. "O";
|
||||
else
|
||||
flagStr = flagStr .. "X";
|
||||
end
|
||||
if (i == 15) then
|
||||
flagStr = flagStr .. "\n";
|
||||
end
|
||||
end
|
||||
|
||||
local data = quest:GetData();
|
||||
|
||||
msg = string.format("Info for quest %s [%d]\n", quest.Name, quest:GetQuestId());
|
||||
msg = msg .. string.format("Flags \\\\ Current Sequence: %d\n", quest:getSequence());
|
||||
msg = msg .. string.format("%s\n", flagStr)
|
||||
msg = msg .. string.format("Counters: %d,%d,%d,%d", data:getCounter(0), data:getCounter(1), data:getCounter(2), data:getCounter(3));
|
||||
return msg;
|
||||
else
|
||||
return string.format("Quest not active: "..questId);
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue