Code:
quest bio_system begin
state start begin
function get_id()
return pc.getf("bio_system", "quest_id") + 1
end
function change_id()
pc.setf("bio_system", "quest_id", bio_system.get_id())
end
function get_state()
return pc.getf("bio_system", "quest_state")
end
function change_state()
local cur_state = bio_system.get_state()
local new_state = 0
if cur_state == 0 then new_state = 1 end
pc.setf("bio_system", "quest_state", new_state)
end
function quest_exists()
return bio_system.get_id() <= table.getn(locale.BIOSYSTEM_QUEST_LIST)
end
function OnTimerExecute(is_loop)
local given = pc.getqf("items_given")
local checking = pc.getqf("items_checking") - 1
pc.setqf("items_checking", checking)
local fail = pc.getqf("items_checking_fail")
local succ = pc.getqf("items_checking_succ")
local currentQuestID = bio_system.get_id()
local data = locale.BIOSYSTEM_QUEST_LIST[currentQuestID]
if data["fail_chance"] >= number(1, 100) then
fail = fail + 1
pc.setqf("items_checking_fail", fail)
else
succ = succ + 1
pc.setqf("items_checking_succ", succ)
if given + succ >= data["item_count_need"] then
pc.delqf("next_check_time")
pc.setqf("items_given", given + succ)
cmdchat("bio done,"..succ..","..data["item_count_need"]..","..checking)
if is_loop then
cleartimer("check_next_item_loop")
end
return
end
end
if checking == 0 then
pc.delqf("items_checking_fail")
pc.delqf("items_checking_succ")
pc.setqf("items_given", given + succ)
pc.delqf("next_check_time")
cmdchat("bio finish,"..fail..","..succ)
if is_loop then
cleartimer("check_next_item_loop")
end
else
pc.setqf("next_check_time", data["check_item_time"] + os.time())
if not is_loop then
loop_timer("check_next_item_loop", data["check_item_time"])
end
end
end
when login with bio_system.quest_exists() begin
local currentQuestID = bio_system.get_id()
local data = locale.BIOSYSTEM_QUEST_LIST[currentQuestID]
if data["min_level"] <= pc.get_level() then
local qstate = bio_system.get_state()
if qstate == 0 then
local v = find_npc_by_vnum(20084)
if v != 0 then
target.vid("__TARGET__", v)
end
elseif qstate == 1 then
cmdchat("bio init,"..currentQuestID)
local given = pc.getqf("items_given")
if given < data["item_count_need"] then
local checking_count = pc.getqf("items_checking")
if checking_count > 0 then
local next_check_time = pc.getqf("next_check_time")
if os.time() >= next_check_time then
local checked = math.floor((os.time() - next_check_time) / data["check_item_time"]) + 1
if checked > checking_count then checked = checking_count end
local fail = pc.getqf("items_checking_fail")
local succ = pc.getqf("items_checking_succ")
for i = 1, checked do
if data["fail_chance"] >= number(1, 100) then
fail = fail + 1
else
succ = succ + 1
if given + succ >= data["item_count_need"] then
pc.delqf("next_check_time")
pc.setqf("items_given", given + succ)
pc.setqf("items_checking", checking_count - i)
cmdchat("bio done,"..succ..","..data["item_count_need"]..","..(checking_count - i))
return
end
end
end
pc.setqf("items_checking", checking_count - checked)
if checked == checking_count then
pc.delqf("next_check_time")
pc.delqf("items_checking_fail")
pc.delqf("items_checking_succ")
pc.setqf("items_given", given + succ)
cmdchat("bio finish,"..fail..","..succ)
else
pc.setqf("next_check_time", next_check_time + checked * data["check_item_time"])
pc.setqf("items_checking_fail", fail)
pc.setqf("items_checking_succ", succ)
timer("check_next_item", (next_check_time + checked * data["check_item_time"]) - os.time())
end
else
timer("check_next_item", next_check_time - os.time())
end
end
end
end
end
end
-- levelup new quest check
when levelup with bio_system.quest_exists() and bio_system.get_state() == 0 begin
local currentQuestID = bio_system.get_id()
local data = locale.BIOSYSTEM_QUEST_LIST[currentQuestID]
if data["min_level"] == pc.get_level() then
local v = find_npc_by_vnum(20084)
if v != 0 then
target.vid("__TARGET__", v)
end
end
end
-- dialog with bio
when __TARGET__.target.click with bio_system.quest_exists() and bio_system.get_state() == 0 begin
target.delete("__TARGET__")
cmdchat("bio new,"..bio_system.get_id())
bio_system.change_state()
end
when 20084.chat."Die Forschung von Zephir" with bio_system.quest_exists() and bio_system.get_state() == 1 begin
setskin(NOWINDOW)
local currentQuestID = bio_system.get_id()
local data = locale.BIOSYSTEM_QUEST_LIST[currentQuestID]
local given = pc.getqf("items_given")
if given >= data["item_count_need"] then
local items_left = pc.getqf("items_checking")
if items_left > 0 then
pc.give_item2(data["item_vnum_need"], items_left)
end
local items = data["reward"]["item"]
for i = 1, table.getn(items) do
pc.give_item2(items[i][1], items[i][2])
end
local attrs = data["reward"]["attr"]
for i = 1, table.getn(attrs) do
affect.add_collect(attrs[i][1], attrs[i][2], 60*60*24*365*60)
end
if data["reward"]["gold"] > 0 then
pc.change_money(data["reward"]["gold"])
end
if data["reward"]["exp"] > 0 then
pc.give_exp2(data["reward"]["exp"])
end
bio_system.change_state()
bio_system.change_id()
pc.delqf("items_given")
pc.delqf("items_checking")
pc.delqf("items_checking_fail")
pc.delqf("items_checking_succ")
cmdchat("bio reward,"..items_left)
currentQuestID = bio_system.get_id()
data = locale.BIOSYSTEM_QUEST_LIST[currentQuestID]
if data["min_level"] <= pc.get_level() then
local v = find_npc_by_vnum(20084)
if v != 0 then
target.vid("__TARGET__", v)
end
end
else
local items_checking = pc.getqf("items_checking")
local timeLeft = 0
if items_checking > 0 then
timeLeft = pc.getqf("next_check_time") - os.time() + (items_checking - 1) * data["check_item_time"]
end
cmdchat("bio current,"..q.getcurrentquestindex()..","..data["item_vnum_need"]..","..data["item_count_need"]..","..pc.getqf("items_given")..","..pc.getqf("items_checking")..","..timeLeft)
end
end
-- client command to leave items
when button with bio_system.quest_exists() and bio_system.get_state() == 1 begin
setskin(NOWINDOW)
local slot = tonumber(input()) or -1
if slot < 0 or slot >= 90 then
return
end
if not item.select_cell(slot) then
return
end
local currentQuestID = bio_system.get_id()
local data = locale.BIOSYSTEM_QUEST_LIST[currentQuestID]
if item.get_vnum() != data["item_vnum_need"] then
return
end
if pc.getqf("items_given") >= data["item_count_need"] then
notice("Du hast bereits genügend Forschungsmaterial abgegeben.")
return
end
local cur = pc.getqf("items_checking")
pc.setqf("items_checking", cur + item.get_count())
if cur == 0 then
pc.setqf("next_check_time", data["check_item_time"] + os.time())
timer("check_next_item", data["check_item_time"])
end
item.remove_stack()
end
-- check an item [loop_timer]
when check_next_item.timer begin
bio_system.OnTimerExecute(false)
end
when check_next_item_loop.timer begin
bio_system.OnTimerExecute(true)
end
end
end