Test

创建于 差异永不过期
18 删除
598
3 添加
584
local ss_target_id
local ss_target_id
local tm = task_manager.get_task_manager()
local tm = task_manager.get_task_manager()
local pda_opened = false
local pda_opened = false
local found = false
local found = false
local base_cost = 200
local base_cost = 200
local service_cost = 200
local service_cost = 200
local relation = "unknown"
local relation = "unknown"
local npc_rank = "novice"
local npc_rank = "novice"
local npc_name = "Default"
local npc_name = "Default"
local player_name = "Doofus" --for some reason i can't call db.actor:character_name() right away without it failing to compile
local player_name = "Doofus" --for some reason i can't call db.actor:character_name() right away without it failing to compile
local message_decay = 13000
local message_decay = 13000
local message_sound = "pda_tips"
local message_sound = "pda_tips"
local sender_header = game.translate_string("stalker_search_snitch_header")
local sender_header = game.translate_string("stalker_search_snitch_header")
local sender_icon = "ui_inGame2_Radiopomehi"
local sender_icon = "ui_inGame2_Radiopomehi"
local rank_to_reach = 3
local rank_to_reach = 3
local reached_rank = false
local reached_rank = false
local pda_1_max_rank = 3
local pda_1_max_rank = 3
local pda_2_max_rank = 6
local pda_2_max_rank = 6
local pda_3_max_rank = 8
local pda_3_max_rank = 8
local tracking_task_active = false
local tracking_task_active = false
local containsRussianE = false
local containsRussianE = false


local relation_multipliers = {
local relation_multipliers = {
["friend"] = 1,
["friend"] = 1,
["neutral"] = 2,
["neutral"] = 2,
["enemy"] = 3,
["enemy"] = 3,
["unknown"] = 1,
["unknown"] = 1,
}
}


local rank_multipliers = {
local rank_multipliers = {
["novice"] = 1,
["novice"] = 1,
["trainee"] = 2,
["trainee"] = 2,
["experienced"] = 3,
["experienced"] = 3,
["professional"] = 4,
["professional"] = 4,
["veteran"] = 5,
["veteran"] = 5,
["expert"] = 6,
["expert"] = 6,
["master"] = 8,
["master"] = 8,
["legend"] = 10,
["legend"] = 10,
}
}


local rank_to_index = {
local rank_to_index = {
["novice"] = 1,
["novice"] = 1,
["trainee"] = 2,
["trainee"] = 2,
["experienced"] = 3,
["experienced"] = 3,
["professional"] = 4,
["professional"] = 4,
["veteran"] = 5,
["veteran"] = 5,
["expert"] = 6,
["expert"] = 6,
["master"] = 7,
["master"] = 7,
["legend"] = 8,
["legend"] = 8,
}
}


local message_sounds = {
local message_sounds = {
[0] = "pda_task",
[0] = "pda_task",
[1] = "pda_alarm",
[1] = "pda_alarm",
[2] = "pda_communication_lost",
[2] = "pda_communication_lost",
[3] = "pda_beep_1",
[3] = "pda_beep_1",
[4] = "pda_beep_2",
[4] = "pda_beep_2",
[5] = "pda_welcome",
[5] = "pda_welcome",
[6] = "pda_tips",
[6] = "pda_tips",
[7] = "None",
[7] = "None",
}
}


function loadsettings()
function loadsettings()
if ui_mcm then -- here we test to make sure ui_mcm exists before trying to call it's get function.
if ui_mcm then -- here we test to make sure ui_mcm exists before trying to call it's get function.


rank_to_reach = ui_mcm.get("stalker_tracking/rank_to_reach")
rank_to_reach = ui_mcm.get("stalker_tracking/rank_to_reach")
message_decay = ui_mcm.get("stalker_tracking/message_decay") * 1000
message_decay = ui_mcm.get("stalker_tracking/message_decay") * 1000
message_sound = message_sounds[ui_mcm.get("stalker_tracking/message_sound")]
message_sound = message_sounds[ui_mcm.get("stalker_tracking/message_sound")]
pda_1_max_rank = ui_mcm.get("stalker_tracking/pda_1_max_rank")
pda_1_max_rank = ui_mcm.get("stalker_tracking/pda_1_max_rank")
pda_2_max_rank = ui_mcm.get("stalker_tracking/pda_2_max_rank")
pda_2_max_rank = ui_mcm.get("stalker_tracking/pda_2_max_rank")
pda_3_max_rank = ui_mcm.get("stalker_tracking/pda_3_max_rank")
pda_3_max_rank = ui_mcm.get("stalker_tracking/pda_3_max_rank")
base_cost = ui_mcm.get("stalker_tracking/base_cost")
base_cost = ui_mcm.get("stalker_tracking/base_cost")
relation_multipliers["friend"] = ui_mcm.get("stalker_tracking/friend_multiplier")
relation_multipliers["friend"] = ui_mcm.get("stalker_tracking/friend_multiplier")
relation_multipliers["neutral"] = ui_mcm.get("stalker_tracking/neutral_multiplier")
relation_multipliers["neutral"] = ui_mcm.get("stalker_tracking/neutral_multiplier")
relation_multipliers["enemy"] = ui_mcm.get("stalker_tracking/enemy_multiplier")
relation_multipliers["enemy"] = ui_mcm.get("stalker_tracking/enemy_multiplier")
rank_multipliers["novice"] = ui_mcm.get("stalker_tracking/novice_multiplier")
rank_multipliers["novice"] = ui_mcm.get("stalker_tracking/novice_multiplier")
rank_multipliers["trainee"] = ui_mcm.get("stalker_tracking/trainee_multiplier")
rank_multipliers["trainee"] = ui_mcm.get("stalker_tracking/trainee_multiplier")
rank_multipliers["experienced"] = ui_mcm.get("stalker_tracking/experienced_multiplier")
rank_multipliers["experienced"] = ui_mcm.get("stalker_tracking/experienced_multiplier")
rank_multipliers["professional"] = ui_mcm.get("stalker_tracking/professional_multiplier")
rank_multipliers["professional"] = ui_mcm.get("stalker_tracking/professional_multiplier")
rank_multipliers["veteran"] = ui_mcm.get("stalker_tracking/veteran_multiplier")
rank_multipliers["veteran"] = ui_mcm.get("stalker_tracking/veteran_multiplier")
rank_multipliers["expert"] = ui_mcm.get("stalker_tracking/expert_multiplier")
rank_multipliers["expert"] = ui_mcm.get("stalker_tracking/expert_multiplier")
rank_multipliers["master"] = ui_mcm.get("stalker_tracking/master_multiplier")
rank_multipliers["master"] = ui_mcm.get("stalker_tracking/master_multiplier")
rank_multipliers["legend"] = ui_mcm.get("stalker_tracking/legend_multiplier")
rank_multipliers["legend"] = ui_mcm.get("stalker_tracking/legend_multiplier")


end
end
end
end


--stupid way to prevent players from using the system before they see the messages.
--stupid way to prevent players from using the system before they see the messages.
local rank_message_time
local rank_message_time
local rank_messaging = false
local rank_messaging = false


local function actor_on_update()
local function actor_on_update()
if (rank_messaging and rank_message_time) then
if (rank_messaging and rank_message_time) then
if(time_global() >= rank_message_time) then
if(time_global() >= rank_message_time) then
reached_rank = true
reached_rank = true
rank_messaging = false
rank_messaging = false
end
end
end
end
end
end


local function actor_on_first_update()
local function actor_on_first_update()
if (not reached_rank) then
if (not reached_rank) then
if (rank_to_index[ranks.get_player_rank_name()] >= rank_to_reach) then
if (rank_to_index[ranks.get_player_rank_name()] >= rank_to_reach) then
rank_messaging = true
rank_messaging = true
rank_message_time = time_global() + 115000
rank_message_time = time_global() + 115000
dynamic_news_helper.send_tip(game.translate_string("stalker_search_snitch_meeting_1"), sender_header, 55, 13, sender_icon, "beep_1", "npc")
dynamic_news_helper.send_tip(game.translate_string("stalker_search_snitch_meeting_1"), sender_header, 55, 13, sender_icon, "beep_1", "npc")
dynamic_news_helper.send_tip(game.translate_string("stalker_search_snitch_meeting_2"), sender_header, 68, 12, sender_icon, "beep_1", "npc")
dynamic_news_helper.send_tip(game.translate_string("stalker_search_snitch_meeting_2"), sender_header, 68, 12, sender_icon, "beep_1", "npc")
dynamic_news_helper.send_tip(game.translate_string("stalker_search_snitch_meeting_3"), sender_header, 82, 14, sender_icon, "beep_1", "npc")
dynamic_news_helper.send_tip(game.translate_string("stalker_search_snitch_meeting_3"), sender_header, 82, 14, sender_icon, "beep_1", "npc")
dynamic_news_helper.send_tip(game.translate_string("stalker_search_snitch_meeting_4"), sender_header, 98, 15, sender_icon, "beep_1", "npc")
dynamic_news_helper.send_tip(game.translate_string("stalker_search_snitch_meeting_4"), sender_header, 98, 15, sender_icon, "beep_1", "npc")
dynamic_news_helper.send_tip(game.translate_string("stalker_search_snitch_meeting_5"), sender_header, 115, 15, sender_icon, "beep_1", "npc")
dynamic_news_helper.send_tip(game.translate_string("stalker_search_snitch_meeting_5"), sender_header, 115, 15, sender_icon, "beep_1", "npc")
end
end
end
end
end
end






--rating = novice, 1999, trainee, 3999, experienced, 6999, professional, 9999, veteran, 14999, expert, 20999, master, 27999, legend
--rating = novice, 1999, trainee, 3999, experienced, 6999, professional, 9999, veteran, 14999, expert, 20999, master, 27999, legend
--ranks.get_player_rank_name()
--ranks.get_player_rank_name()
--ranks.get_se_obj_rank_name(se_obj)
--ranks.get_se_obj_rank_name(se_obj)


function CheckRelation(npc)
function CheckRelation(npc)
if (xr_conditions.actor_enemy(db.actor,npc)) then
if (xr_conditions.actor_enemy(db.actor,npc)) then
return "enemy"
return "enemy"
elseif (xr_conditions.actor_neutral(db.actor,npc)) then
elseif (xr_conditions.actor_neutral(db.actor,npc)) then
return "neutral"
return "neutral"
elseif (xr_conditions.actor_friend(db.actor,npc)) then
elseif (xr_conditions.actor_friend(db.actor,npc)) then
return "friend"
return "friend"
else
else
actor_menu.set_msg(1,"Error: npc's relation to actor doesn't match friend, neutral or enemy",4)
actor_menu.set_msg(1,"Error: npc's relation to actor doesn't match friend, neutral or enemy",4)
return "unknown"
return "unknown"
end
end
end
end
function CheckFactionRelation(npc)
function CheckFactionRelation(npc)
if (game_relations.is_factions_enemies(get_actor_true_community(), npc:community())) then
if (game_relations.is_factions_enemies(get_actor_true_community(), npc:community())) then
return "enemy"
return "enemy"
elseif (game_relations.is_factions_neutrals(get_actor_true_community(), npc:community())) then
elseif (game_relations.is_factions_neutrals(get_actor_true_community(), npc:community())) then
return "neutral"
return "neutral"
elseif (game_relations.is_factions_friends(get_actor_true_community(), npc:community())) then
elseif (game_relations.is_factions_friends(get_actor_true_community(), npc:community())) then
return "friend"
return "friend"
else
else
actor_menu.set_msg(1,"Error: npc's relation to actor doesn't match friend, neutral or enemy",10)
actor_menu.set_msg(1,"Error: npc's relation to actor doesn't match friend, neutral or enemy",10)
return "unknown"
return "unknown"
end
end
end
end
function SnitchMessage(string_to_translate,relation_to_actor,npc_rank,type,count,decay)
function SnitchMessage(string_to_translate,relation_to_actor,npc_rank,type,count,decay)
if(message_decay ~= 0) then
if(message_decay ~= 0) then
local msg
local msg
if (type == "random_npc_found") then
if (type == "random_npc_found") then
msg = game.translate_string(string_to_translate .. "_" .. relation_to_actor .. "_" .. npc_rank .. "_" .. tostring(math.random(count)))
msg = game.translate_string(string_to_translate .. "_" .. relation_to_actor .. "_" .. npc_rank .. "_" .. tostring(math.random(count)))
elseif (type == "random_default") then
elseif (type == "random_default") then
msg = game.translate_string(string_to_translate .. "_" .. tostring(math.random(count)))
msg = game.translate_string(string_to_translate .. "_" .. tostring(math.random(count)))
else
else
msg = game.translate_string(string_to_translate)
msg = game.translate_string(string_to_translate)
end
end
db.actor:give_game_news(sender_header, msg, sender_icon, 0, decay)
db.actor:give_game_news(sender_header, msg, sender_icon, 0, decay)
end
end
if (message_sound ~= "None") then
if (message_sound ~= "None") then
xr_sound.set_sound_play(AC_ID, message_sound)
xr_sound.set_sound_play(AC_ID, message_sound)
end
end
end
end
local function process_pda_info(npc,info_id)
local function process_pda_info(npc,info_id)
if info_id == "ui_pda" then
if info_id == "ui_pda" then
pda_opened = true
pda_opened = true
elseif info_id == "ui_pda_hide" then
elseif info_id == "ui_pda_hide" then
pda_opened = false
pda_opened = false
end
end
end
end


function onkey_release(key)
function onkey_release(key)
local bind = dik_to_bind(key)
local bind = dik_to_bind(key)
if ((bind == key_bindings.kWPN_FIREMODE_NEXT) and pda_opened) then
if ((bind == key_bindings.kWPN_FIREMODE_NEXT) and pda_opened) then
if (reached_rank) then
if (reached_rank) then
func_stalkersearch(db.actor)
func_stalkersearch(db.actor)
else
else
if (rank_to_index[ranks.get_player_rank_name()] >= rank_to_reach and not rank_messaging) then
if (rank_to_index[ranks.get_player_rank_name()] >= rank_to_reach and not rank_messaging) then
reached_rank = true
reached_rank = true
dynamic_news_helper.send_tip(game.translate_string("stalker_search_snitch_meeting_pre"), sender_header, 1, 30, sender_icon, "beep_1", "npc")
dynamic_news_helper.send_tip(game.translate_string("stalker_search_snitch_meeting_pre"), sender_header, 1, 30, sender_icon, "beep_1", "npc")
else
else
actor_menu.set_msg(1,game.translate_string("stalker_search_low_rank"),4)
actor_menu.set_msg(1,game.translate_string("stalker_search_low_rank"),4)
xr_sound.set_sound_play(AC_ID, "pda_beep_2")
xr_sound.set_sound_play(AC_ID, "pda_beep_2")
end
end
end
end
end
end
end
end


----------------------------------------------------------------------
----------------------------------------------------------------------
-- UI Item Property
-- UI Item Property
----------------------------------------------------------------------
----------------------------------------------------------------------


function func_stalkersearch(obj)
function func_stalkersearch(obj)
start(obj)
start(obj)
end
end




-------------------------------------------------------------------
-------------------------------------------------------------------
GUI = nil -- instance, don't touch
GUI = nil -- instance, don't touch
function start(obj)
function start(obj)


if (not obj) then
if (not obj) then
return
return
end
end
hide_hud_inventory()
hide_hud_inventory()
if (tracking_task_active) then
if (tracking_task_active) then
tm:set_task_cancelled("tracking_stalker_task") --cancel task
tm:set_task_cancelled("tracking_stalker_task") --cancel task
tracking_task_active = false
tracking_task_active = false
found = false
found = false
SnitchMessage("stalker_search_snitch_target_signal_cancel",nil,nil,"random_default",3,message_decay)
SnitchMessage("stalker_search_snitch_target_signal_cancel",nil,nil,"random_default",3,message_decay)
end
end
if (not GUI) then
if (not GUI) then
GUI = UIFindActivePDA()
GUI = UIFindActivePDA()
end
end
if (GUI) and (not GUI:IsShown()) then
if (GUI) and (not GUI:IsShown()) then
GUI:ShowDialog(true)
GUI:ShowDialog(true)
GUI:Reset(obj)
GUI:Reset(obj)
Register_UI("UIFindActivePDA","item_backpack")
Register_UI("UIFindActivePDA","item_backpack")
end
end


end
end


class "UIFindActivePDA" (CUIScriptWnd)
class "UIFindActivePDA" (CUIScriptWnd)


function UIFindActivePDA:__init() super()
function UIFindActivePDA:__init() super()
self:InitControls()
self:InitControls()
self:InitCallBacks()
self:InitCallBacks()
end
end


function UIFindActivePDA:__finalize()
function UIFindActivePDA:__finalize()
end
end


function UIFindActivePDA:InitControls()
function UIFindActivePDA:InitControls()
self:SetWndRect(Frect():set(0,0,1024,768))
self:SetWndRect(Frect():set(0,0,1024,768))
self:SetAutoDelete(true)
self:SetAutoDelete(true)
--self:Enable(true)
--self:Enable(true)


local xml = CScriptXmlInit()
local xml = CScriptXmlInit()
xml:ParseFile ("ui_items_backpack.xml")
xml:ParseFile ("ui_items_backpack.xml")


self.dialog = xml:InitStatic("backpack", self)
self.dialog = xml:InitStatic("backpack", self)
xml:InitStatic("backpack:background", self.dialog)
xml:InitStatic("backpack:background", self.dialog)


self.input = xml:InitEditBox("backpack:input",self.dialog)
self.input = xml:InitEditBox("backpack:input",self.dialog)
self:Register(self.input,"fld_input")
self:Register(self.input,"fld_input")


local btn = xml:Init3tButton("backpack:btn_cancel", self.dialog)
local btn = xml:Init3tButton("backpack:btn_cancel", self.dialog)
self:Register(btn,"btn_cancel")
self:Register(btn,"btn_cancel")


btn = xml:Init3tButton("backpack:btn_ok", self.dialog)
btn = xml:Init3tButton("backpack:btn_ok", self.dialog)
self:Register(btn,"btn_ok")
self:Register(btn,"btn_ok")
end
end


function UIFindActivePDA:InitCallBacks()
function UIFindActivePDA:InitCallBacks()
self:AddCallback("btn_ok", ui_events.BUTTON_CLICKED, self.OnAccept, self)
self:AddCallback("btn_ok", ui_events.BUTTON_CLICKED, self.OnAccept, self)
self:AddCallback("btn_cancel", ui_events.BUTTON_CLICKED, self.Close, self)
self:AddCallback("btn_cancel", ui_events.BUTTON_CLICKED, self.Close, self)
end
end


function UIFindActivePDA:Reset(obj)
function UIFindActivePDA:Reset(obj)
self.id = obj:id()
self.id = obj:id()
self.section = obj:section()
self.section = obj:section()
self.input:SetText("")
self.input:SetText("")
self.input:Enable(true)
self.input:Enable(true)
end
end


function UIFindActivePDA:Update()
function UIFindActivePDA:Update()
CUIScriptWnd.Update(self)
CUIScriptWnd.Update(self)
end
end


function UIFindActivePDA:OnAccept()
function UIFindActivePDA:OnAccept()


--Probably should've separated all this wall of code into different functions to make it actually readable, but now it's a bit too late and i'm too lazy to change it. Perhaps next time.
--Probably should've separated all this wall of code into different functions to make it actually readable, but now it's a bit too late and i'm too lazy to change it. Perhaps next time.


local txt = self.input:GetText()
local txt = self.input:GetText()
if (txt == "" or txt == " ") then
if (txt == "" or txt == " ") then
actor_menu.set_msg(1,game.translate_string("stalker_search_empty_string"),4)
actor_menu.set_msg(1,game.translate_string("stalker_search_empty_string"),4)
self.input:SetText("")
self.input:SetText("")
else
else
if (found == false) then
if (found == false) then
--A fucking stupid workaround for being able to type a single specific russian letter. This small thing took me over 8 hours to figure out. Fuck encoding differences.
--A fucking stupid workaround for being able to type a single specific russian letter. This small thing took me over 8 hours to figure out. Fuck encoding differences.
if txt:find(string.char(197)) or txt:find(string.char(229)) then
if txt:find(string.char(197)) or txt:find(string.char(229)) then
containsRussianE = true
containsRussianE = true
else
else
containsRussianE = false
containsRussianE = false
end
end
player_name = db.actor:character_name()
player_name = db.actor:character_name()
if (containsRussianE) then
if (containsRussianE) then
player_name = player_name:gsub(string.char(168),string.char(197))
player_name = player_name:gsub(string.char(168),string.char(197))
player_name = player_name:gsub(string.char(184),string.char(229))
player_name = player_name:gsub(string.char(184),string.char(229))
end
end
if (txt == player_name) then
if (txt == player_name) then
SnitchMessage("stalker_search_snitch_found_player",nil,nil,"random_default",5,message_decay)
SnitchMessage("stalker_search_snitch_found_player",nil,nil,"random_default",5,message_decay)
found = false
found = false
self:Close()
self:Close()
return
return
end
end
for i=1,65535 do
for i=1,65535 do
local se_obj = alife_object(i)
local se_obj = alife_object(i)
local npc_r = level.object_by_id(i) -- no clue what the difference is between an alife_object and object_by_id, but for some reason relation checks only accept this one
local npc_r = level.object_by_id(i) -- no clue what the difference is between an alife_object and object_by_id, but for some reason relation checks only accept this one


if se_obj and IsStalker(nil,se_obj:clsid()) then
if se_obj and IsStalker(nil,se_obj:clsid()) then
npc_name = se_obj:character_name()
npc_name = se_obj:character_name()
if (containsRussianE) then
if (containsRussianE) then
npc_name = npc_name:gsub(string.char(168),string.char(197))
npc_name = npc_name:gsub(string.char(168),string.char(197))
npc_name = npc_name:gsub(string.char(184),string.char(229))
npc_name = npc_name:gsub(string.char(184),string.char(229))
end
end
if (npc_name == txt) then
if (npc_name == txt) then
if (se_obj:alive()) then

actor_menu.set_msg(1,se_obj:character_name() .. " " .. game.translate_string("stalker_search_signal_found") .. " " .. i,4)
actor_menu.set_msg(1,se_obj:character_name() .. " " .. game.translate_string("stalker_search_signal_found") .. " " .. i,4)
found = true
found = true
ss_target_id = i
ss_target_id = i
self.input:Enable(false)
self.input:Enable(false)
if npc_r then
if npc_r then
relation = CheckRelation(npc_r)
relation = CheckRelation(npc_r)
else
else
relation = CheckFactionRelation(se_obj)
relation = CheckFactionRelation(se_obj)
end
end
npc_rank = ranks.get_se_obj_rank_name(se_obj)
npc_rank = ranks.get_se_obj_rank_name(se_obj)
local pdalvlitem = db.actor:item_in_slot(8)
local pdalvlitem = db.actor:item_in_slot(8)
local pdalvlsection = tostring(pdalvlitem:section())
local pdalvlsection = tostring(pdalvlitem:section())
if ((pdalvlsection == "device_pda_1") and (rank_to_index[npc_rank] > pda_1_max_rank))
if ((pdalvlsection == "device_pda_1") and (rank_to_index[npc_rank] > pda_1_max_rank))
or ((pdalvlsection == "device_pda_2") and (rank_to_index[npc_rank] > pda_2_max_rank))
or ((pdalvlsection == "device_pda_2") and (rank_to_index[npc_rank] > pda_2_max_rank))
or ((pdalvlsection == "device_pda_3") and (rank_to_index[npc_rank] > pda_3_max_rank))
or ((pdalvlsection == "device_pda_3") and (rank_to_index[npc_rank] > pda_3_max_rank))
then
then
SnitchMessage("stalker_search_snitch_low_pda",nil,nil,nil,nil,message_decay)
SnitchMessage("stalker_search_snitch_low_pda",nil,nil,nil,nil,message_decay)
found = false
found = false
self:Close()
self:Close()
break
break
end
end
service_cost = base_cost * relation_multipliers[relation] * rank_multipliers[npc_rank]
service_cost = base_cost * relation_multipliers[relation] * rank_multipliers[npc_rank]
self.input:SetText(strformat(game.translate_string("stalker_search_payment_query"),service_cost))
self.input:SetText(strformat(game.translate_string("stalker_search_payment_query"),service_cost))
if(se_obj:community() ~= "zombied") then
if(se_obj:community() ~= "zombied") then
SnitchMessage("stalker_search_snitch_found",relation,npc_rank,"random_npc_found",3,message_decay)
SnitchMessage("stalker_search_snitch_found",relation,npc_rank,"random_npc_found",3,message_decay)
else
else
SnitchMessage("stalker_search_snitch_found_zombie",nil,nil,"random_default",3,message_decay)
SnitchMessage("stalker_search_snitch_found_zombie",nil,nil,"random_default",3,message_decay)
end
end
if (db.actor:money()<service_cost) then
if (db.actor:money()<service_cost) then
self.input:SetText(strformat(game.translate_string("stalker_search_payment_not_enough"),service_cost - db.actor:money(),service_cost))
self.input:SetText(strformat(game.translate_string("stalker_search_payment_not_enough"),service_cost - db.actor:money(),service_cost))
SnitchMessage("stalker_search_snitch_low_money",nil,nil,nil,nil,message_decay)
SnitchMessage("stalker_search_snitch_low_money",nil,nil,nil,nil,message_decay)
end
end
break
break
else

SnitchMessage("stalker_search_snitch_dead_target",nil,nil,"random_default",5,message_decay)
found = false
self:Close()
break
end
end
end
end
end
end
end
if (found == false) then
if (found == false) then
actor_menu.set_msg(1,game.translate_string("stalker_search_cant_find_pda"),4)
actor_menu.set_msg(1,game.translate_string("stalker_search_cant_find_pda"),4)
end
end
else
else
if (db.actor:money()>=service_cost) then
if (db.actor:money()>=service_cost) then
local se_obj = alife_object(ss_target_id)
local se_obj = alife_object(ss_target_id)
if se_obj and IsStalker(nil,se_obj:clsid()) and se_obj:alive() then
if se_obj and IsStalker(nil,se_obj:clsid()) then
if(se_obj:community() ~= "zombied") then
if(se_obj:community() ~= "zombied") then
SnitchMessage("stalker_search_snitch_accept",relation,npc_rank,"random_npc_found",3,message_decay)
SnitchMessage("stalker_search_snitch_accept",relation,npc_rank,"random_npc_found",3,message_decay)
else
else
SnitchMessage("stalker_search_snitch_accept_zombie",nil,nil,"random_default",3,message_decay)
SnitchMessage("stalker_search_snitch_accept_zombie",nil,nil,"random_default",3,message_decay)
end
end
task_manager.get_task_manager():give_task("tracking_stalker_task")
task_manager.get_task_manager():give_task("tracking_stalker_task")
tracking_task_active = true
tracking_task_active = true
actor_menu.set_msg(1,strformat(game.translate_string("stalker_search_transferring"),service_cost),4)
actor_menu.set_msg(1,strformat(game.translate_string("stalker_search_transferring"),service_cost),4)
db.actor:give_money(-service_cost)
db.actor:give_money(-service_cost)
found = false
found = false
self:Close()
self:Close()
else
actor_menu.set_msg(1,game.translate_string("stalker_search_target_lost_before_accepted"),4)
found = false
self:Close()
end
end
else
else
actor_menu.set_msg(1,strformat(game.translate_string("stalker_search_payment_not_enough"),service_cost-db.actor:money(),service_cost),4)
actor_menu.set_msg(1,strformat(game.translate_string("stalker_search_payment_not_enough"),service_cost-db.actor:money(),service_cost),4)
found = false
found = false
SnitchMessage("stalker_search_snitch_low_money",nil,nil,nil,nil,message_decay)
SnitchMessage("stalker_search_snitch_low_money",nil,nil,nil,nil,message_decay)
self:Close()
self:Close()
end
end
end
end
end
end
end
end






function UIFindActivePDA:OnKeyboard(dik, keyboard_action)
function UIFindActivePDA:OnKeyboard(dik, keyboard_action)
local res = CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)
local res = CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)
if (res == false) then
if (res == false) then
local bind = dik_to_bind(dik)
local bind = dik_to_bind(dik)
if keyboard_action == ui_events.WINDOW_KEY_PRESSED then
if keyboard_action == ui_events.WINDOW_KEY_PRESSED then
if dik == DIK_keys.DIK_ESCAPE then
if dik == DIK_keys.DIK_ESCAPE then
self:Close()
self:Close()
end
end
end
end
end
end
return res
return res
end
end


function UIFindActivePDA:Close()
function UIFindActivePDA:Close()
found = false
found = false


self:HideDialog()
self:HideDialog()
Unregister_UI("UIFindActivePDA")
Unregister_UI("UIFindActivePDA")
end
end




--------------------------------------------------------
--------------------------------------------------------


local function is_smart_valid(squad_id)
local function is_smart_valid(squad_id)
local squad = alife_object(squad_id)
local squad = alife_object(squad_id)
if squad then
if squad then
local smart_id = squad.assigned_ss_target_id
local smart_id = squad.assigned_ss_target_id
if smart_id then
if smart_id then
local smrt = SIMBOARD.smarts[smart_id]
local smrt = SIMBOARD.smarts[smart_id]
local smart = smrt and smrt.smrt
local smart = smrt and smrt.smrt
if smart and (simulation_objects.base_smarts[smart:name()] == true) then
if smart and (simulation_objects.base_smarts[smart:name()] == true) then
--printf("setup_tracking_stalker_task | squad (%s) is targeting a base smart [%s]", squad_id, smart:name())
--printf("setup_tracking_stalker_task | squad (%s) is targeting a base smart [%s]", squad_id, smart:name())
return false
return false
end
end
end
end
end
end
return true
return true
end
end
---------------------------< Effects >---------------------------
---------------------------< Effects >---------------------------
xr_effects.setup_tracking_stalker_task = function(actor,npc,p)
xr_effects.setup_tracking_stalker_task = function(actor,npc,p)
-- p[1]: task_id
-- p[1]: task_id
-- p[2]: true = scan all factions except for p[4], false = scan listed factions (p[4]+)
-- p[2]: true = scan all factions except for p[4], false = scan listed factions (p[4]+)
-- p[3]: true = scan npcs in current and connected levels only, false = scan all
-- p[3]: true = scan npcs in current and connected levels only, false = scan all
-- p[4]+: factions that can be targetted; can be list
-- p[4]+: factions that can be targetted; can be list


local sim = alife()
local sim = alife()


if (ss_target_id == nil or ss_target_id == AC_ID) then
if (ss_target_id == nil or ss_target_id == AC_ID) then
printf("! %s - no target found for task",p[1])
printf("! %s - no target found for task",p[1])
return
return
end
end
local se_target = alife_object(ss_target_id)
local se_target = alife_object(ss_target_id)
if not (se_target) then
if not (se_target) then
printe("! %s - no server object could be retrieved for (%s)",p[1],ss_target_id)
printe("! %s - no server object could be retrieved for (%s)",p[1],ss_target_id)
return
return
end
end
local target_squad = se_target and se_target.group_id and se_target.group_id ~= 65535 and alife_object(se_target.group_id)
local target_squad = se_target and se_target.group_id and se_target.group_id ~= 65535 and alife_object(se_target.group_id)
if target_squad then
if target_squad then
sim_offline_combat.task_squads[target_squad.id] = true
sim_offline_combat.task_squads[target_squad.id] = true
end
end
-- Save var
-- Save var
local target_comm = alife_character_community(se_target)
local target_comm = alife_character_community(se_target)
local level_target = sim:level_name(game_graph():vertex(se_target.m_game_vertex_id):level_id())
local level_target = sim:level_name(game_graph():vertex(se_target.m_game_vertex_id):level_id())
local level_task = level.name()
local level_task = level.name()
local tbl = {
local tbl = {
lvl_task = level_task,
lvl_task = level_task,
lvl_target = level_target,
lvl_target = level_target,
ss_target_id = ss_target_id,
ss_target_id = ss_target_id,
target_comm = target_comm,
target_comm = target_comm,
}
}
--save_var(db.actor, p[1], tbl)
--save_var(db.actor, p[1], tbl)
printdbg("- %s | setup_tracking_stalker_task | ss_target_id: %s - target_comm: %s - lvl_task: %s - lvl_target: %s", p[1], ss_target_id, target_comm, level_task, level_target)
printdbg("- %s | setup_tracking_stalker_task | ss_target_id: %s - target_comm: %s - lvl_task: %s - lvl_target: %s", p[1], ss_target_id, target_comm, level_task, level_target)


local function postpone_for_next_frame(ss_target_id)
local function postpone_for_next_frame(ss_target_id)
local news_caption = game.translate_string(task_manager.task_ini:r_string_ex(p[1], "title")) or "error"
local news_caption = game.translate_string(task_manager.task_ini:r_string_ex(p[1], "title")) or "error"
local news_text = game.translate_string("st_mm_new_game_name") .. " " .. se_target:character_name() .. "\\n " .. game.translate_string("st_mm_new_game_faction_2") .. " " .. game.translate_string(se_target:community()) .. "\\n " .. game.translate_string("st_location") .. " " .. game.translate_string(level_target)
local news_text = game.translate_string("st_mm_new_game_name") .. " " .. se_target:character_name() .. "\\n " .. game.translate_string("st_mm_new_game_faction_2") .. " " .. game.translate_string(se_target:community()) .. "\\n " .. game.translate_string("st_location") .. " " .. game.translate_string(level_target)
db.actor:give_talk_message2(news_caption, news_text, se_target:character_icon(), "iconed_answer_item")
db.actor:give_talk_message2(news_caption, news_text, se_target:character_icon(), "iconed_answer_item")
return true
return true
end
end
CreateTimeEvent(0,"setup_tracking_stalker_task",0,postpone_for_next_frame,ss_target_id)
CreateTimeEvent(0,"setup_tracking_stalker_task",0,postpone_for_next_frame,ss_target_id)
end
end




---------------------------< Task functor >---------------------------
---------------------------< Task functor >---------------------------
task_functor.tracking_stalker_task_target_functor = function(task_id,field,p,tsk)
task_functor.tracking_stalker_task_target_functor = function(task_id,field,p,tsk)
if (field == "target") then
if (field == "target") then
if (tsk) then
if (tsk) then
return ss_target_id
return ss_target_id
end
end
end
end
end
end




---------------------------< Task Status functor >---------------------------
---------------------------< Task Status functor >---------------------------
task_status_functor.tracking_stalker_task_status_functor = function(tsk,task_id)
task_status_functor.tracking_stalker_task_status_functor = function(tsk,task_id)


if (tsk.stage == 0) then
if (tsk.stage == 0) then
local id = ss_target_id
local id = ss_target_id
if not (id) then
if not (id) then
actor_menu.set_msg(1,"ERROR: id not found",4)
actor_menu.set_msg(1,"ERROR: id not found",4)
printdbg("ERROR: id not found")
printdbg("ERROR: id not found")
tracking_task_active = false
tracking_task_active = false
return "fail"
return "fail"
end
end
local se_obj = id and alife_object(id)
local se_obj = id and alife_object(id)
if not (se_obj) then
if not (se_obj) then
actor_menu.set_msg(1,"ERROR: id is not alife_object",4)
actor_menu.set_msg(1,"ERROR: id is not alife_object",4)
printdbg("ERROR: id is not alife_object")
printdbg("ERROR: id is not alife_object")
tracking_task_active = false
tracking_task_active = false
return "fail"
return "fail"
end
end
if not (IsStalker(nil,se_obj:clsid())) then
if not (IsStalker(nil,se_obj:clsid())) then
actor_menu.set_msg(1,"ERROR: id is not a stalker?!",4)
actor_menu.set_msg(1,"ERROR: id is not a stalker?!",4)
printdbg("ERROR: id is not a stalker?")
printdbg("ERROR: id is not a stalker?")
tracking_task_active = false
tracking_task_active = false
return "fail"
return "fail"
end
end
if not (se_obj:alive()) then

actor_menu.set_msg(1,game.translate_string("stalker_search_signal_lost"),4)
tracking_task_active = false
tm:set_task_cancelled("tracking_stalker_task") --cancel task
SnitchMessage("stalker_search_snitch_target_signal_lost",nil,nil,"random_default",3,message_decay)
end
elseif (tsk.stage == 254) then
elseif (tsk.stage == 254) then
actor_menu.set_msg(1,"ERROR: the hell's 254??",4)
actor_menu.set_msg(1,"ERROR: the hell's 254??",4)
printdbg("ERROR: the hell's 254??")
printdbg("ERROR: the hell's 254??")
tracking_task_active = false
tracking_task_active = false
return "fail"
return "fail"
end
end
end
end




local function save_state(m_data)
local function save_state(m_data)
m_data.ss_target_id = ss_target_id
m_data.ss_target_id = ss_target_id
m_data.reached_rank = reached_rank
m_data.reached_rank = reached_rank
m_data.tracking_task_active = tracking_task_active
m_data.tracking_task_active = tracking_task_active
end
end


local function load_state(m_data)
local function load_state(m_data)
if (m_data.ss_target_id) then
if (m_data.ss_target_id) then
ss_target_id = m_data.ss_target_id
ss_target_id = m_data.ss_target_id
end
end
if (m_data.reached_rank) then
if (m_data.reached_rank) then
reached_rank = m_data.reached_rank
reached_rank = m_data.reached_rank
end
end
if (m_data.tracking_task_active ~= nil) then
if (m_data.tracking_task_active ~= nil) then
tracking_task_active = m_data.tracking_task_active
tracking_task_active = m_data.tracking_task_active
end
end
end
end


function on_game_start()
function on_game_start()
RegisterScriptCallback("on_key_release",onkey_release)
RegisterScriptCallback("on_key_release",onkey_release)
--RegisterScriptCallback("on_key_press", onKeyPress)
--RegisterScriptCallback("on_key_press", onKeyPress)
RegisterScriptCallback("actor_on_info_callback",process_pda_info)
RegisterScriptCallback("actor_on_info_callback",process_pda_info)
RegisterScriptCallback("save_state",save_state)
RegisterScriptCallback("save_state",save_state)
RegisterScriptCallback("load_state",load_state)
RegisterScriptCallback("load_state",load_state)
RegisterScriptCallback("actor_on_first_update", actor_on_first_update)
RegisterScriptCallback("actor_on_first_update", actor_on_first_update)
RegisterScriptCallback("on_option_change", loadsettings) --MCM sends the same callback as ui_options
RegisterScriptCallback("on_option_change", loadsettings) --MCM sends the same callback as ui_options
RegisterScriptCallback("actor_on_update",actor_on_update)
RegisterScriptCallback("actor_on_update",actor_on_update)
loadsettings()
loadsettings()
end
end