233 lines
8.1 KiB
Plaintext
233 lines
8.1 KiB
Plaintext
|
-- Loading screen callbacks
|
||
|
AddScriptCallback("on_loading_screen_key_prompt")
|
||
|
AddScriptCallback("on_loading_screen_dismissed")
|
||
|
|
||
|
-- Called from GamePersistent.cpp
|
||
|
-- Callback for when loading screen happens and "Press Any Key to Continue" prompt appears
|
||
|
_G.OnLoadingScreenKeyPrompt = function()
|
||
|
SendScriptCallback("on_loading_screen_key_prompt")
|
||
|
end
|
||
|
|
||
|
-- Callback for when player dismisses loading screen after "Press Any Key to Continue" pressed
|
||
|
_G.OnLoadingScreenDismissed = function()
|
||
|
SendScriptCallback("on_loading_screen_dismissed")
|
||
|
end
|
||
|
|
||
|
-- Generic net spawn/net destroy callbacks
|
||
|
AddScriptCallback("game_object_on_net_spawn")
|
||
|
AddScriptCallback("game_object_on_net_destroy")
|
||
|
_G.CGameObject_NetSpawn = function(obj)
|
||
|
SendScriptCallback("game_object_on_net_spawn", obj)
|
||
|
end
|
||
|
|
||
|
_G.CGameObject_NetDestroy = function(obj)
|
||
|
SendScriptCallback("game_object_on_net_destroy", obj)
|
||
|
end
|
||
|
|
||
|
-- Game objects registry
|
||
|
gameobjects_registry = {}
|
||
|
function game_object_on_net_spawn(obj)
|
||
|
gameobjects_registry[obj:id()] = obj
|
||
|
end
|
||
|
function game_object_on_net_destroy(obj)
|
||
|
gameobjects_registry[obj:id()] = nil
|
||
|
end
|
||
|
|
||
|
-- Game objects iterator
|
||
|
_G.game_objects_iter = function()
|
||
|
local k = nil
|
||
|
local obj = nil
|
||
|
return function()
|
||
|
k, obj = next(gameobjects_registry, k)
|
||
|
return obj
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- Pseudogiant callbacks
|
||
|
AddScriptCallback("pseudogiant_on_start_stomp_animation")
|
||
|
AddScriptCallback("pseudogiant_before_stomp")
|
||
|
AddScriptCallback("pseudogiant_on_stomp")
|
||
|
|
||
|
_G.CPseudoGigant__OnStartStompAnimation = function(victim, who)
|
||
|
SendScriptCallback("pseudogiant_on_start_stomp_animation", victim, who)
|
||
|
-- printf("pseudogiant_on_start_stomp_animation: %s, %s", victim:name(), who:name())
|
||
|
end
|
||
|
|
||
|
_G.CPseudoGigant__BeforeHitCallback = function(victim, who, shit, boneId)
|
||
|
local flags = { ret_value = true }
|
||
|
SendScriptCallback("pseudogiant_before_stomp", victim, who, shit, boneId, flags)
|
||
|
-- printf("pseudogiant_before_stomp: %s, %s, %s, %s", victim:name(), who:name(), shit.power, flags.ret_value)
|
||
|
return flags.ret_value
|
||
|
end
|
||
|
|
||
|
_G.CPseudoGigant__HitCallback = function(victim, who, shit, boneId)
|
||
|
-- printf("pseudogiant_on_stomp: %s, %s, %s", victim:name(), who:name(), shit.power)
|
||
|
SendScriptCallback("pseudogiant_on_stomp", victim, who, shit, boneId)
|
||
|
end
|
||
|
|
||
|
-- Bullet callbacks
|
||
|
AddScriptCallback("bullet_on_init")
|
||
|
AddScriptCallback("bullet_on_update")
|
||
|
AddScriptCallback("bullet_on_impact")
|
||
|
AddScriptCallback("bullet_on_remove")
|
||
|
|
||
|
-- Available fields in bullet object
|
||
|
-- position = position of impact,
|
||
|
-- direction = direction of impact,
|
||
|
-- speed = speed of impact -- Speed will be 0 in bullet_on_remove callback if the bullet hitted the target and stayed inside of it
|
||
|
-- distance - flew distance before impact
|
||
|
-- section - section of bullet
|
||
|
-- bullet_id = unique id of the bullet, its NOT GAME OBJECT ID
|
||
|
-- weapon_id = game object id of weapon that shot bullet
|
||
|
-- parent_id = game object id of actor that has a weapon that shot bullet
|
||
|
-- target_id = game object id of entity the bullet hit (it will be 65535 if bullet hit the terrain or vanished)
|
||
|
-- material = name of material that bullet hit
|
||
|
-- life_time = time of bullet fly
|
||
|
|
||
|
-- Called when bullet is shot from the weapon
|
||
|
_G.CBulletOnInit = function(bullet)
|
||
|
SendScriptCallback("bullet_on_init", bullet)
|
||
|
end
|
||
|
|
||
|
-- Called when bullet is flying
|
||
|
_G.CBulletOnUpdate = function(bullet)
|
||
|
SendScriptCallback("bullet_on_update", bullet)
|
||
|
end
|
||
|
|
||
|
-- Called when bullet hits something (terrain, object, npcs)
|
||
|
_G.CBulletOnImpact = function(bullet)
|
||
|
SendScriptCallback("bullet_on_impact", bullet)
|
||
|
end
|
||
|
|
||
|
-- Called when bullet is destroyed and removed from the world
|
||
|
_G.CBulletOnRemove = function(bullet)
|
||
|
SendScriptCallback("bullet_on_remove", bullet)
|
||
|
end
|
||
|
|
||
|
-- WIP DONT TOUCH
|
||
|
-- AddScriptCallback("rocket_on_update")
|
||
|
-- Called when rocket is flying
|
||
|
-- _G.CRocketOnUpdate = function(rocket)
|
||
|
-- SendScriptCallback("rocket_on_update", rocket)
|
||
|
-- return rocket
|
||
|
-- end
|
||
|
|
||
|
-- function on_game_start()
|
||
|
-- RegisterScriptCallback("rocket_on_update", function(rocket)
|
||
|
-- printf("rocket is flying")
|
||
|
-- local speed = rocket.speed
|
||
|
-- printf("speed %s", speed)
|
||
|
-- -- rocket.engine_active = true
|
||
|
-- if rocket.engine_active then
|
||
|
-- rocket.speed = 15
|
||
|
-- end
|
||
|
-- local targetDist = level.get_target_dist()
|
||
|
-- local targetPos = vector():mad(device().cam_pos, device().cam_dir, targetDist)
|
||
|
-- local pos = vector():set(rocket.position)
|
||
|
-- local targetRocketDir = targetPos:sub(pos):normalize()
|
||
|
-- -- rocket.direction = targetRocketDir
|
||
|
-- rocket.body_direction = targetRocketDir
|
||
|
-- print_r(rocket)
|
||
|
-- end)
|
||
|
-- end
|
||
|
|
||
|
-- Mouse callbacks
|
||
|
-- Scroll wheel callback, sends mouse wheel direction as a number
|
||
|
-- 1 is up, 0 is down
|
||
|
-- set flags.ret_value = false to consume the input and prevent actor wheel binds (zoom, switch weapons, etc)
|
||
|
-- Example:
|
||
|
--[[
|
||
|
RegisterScriptCallback("on_mouse_wheel", function(dir, flags)
|
||
|
printf("mousewheel %s", dir == 1 and "up" or "down")
|
||
|
end)
|
||
|
]]
|
||
|
AddScriptCallback("on_mouse_wheel")
|
||
|
_G.COnMouseWheel = function(dir)
|
||
|
local d = dir > 0 and 1 or 0
|
||
|
local flags = { ret_value = true }
|
||
|
SendScriptCallback("on_mouse_wheel", d, flags)
|
||
|
return flags.ret_value
|
||
|
end
|
||
|
|
||
|
-- Slot change callback
|
||
|
-- new_obj and prev_obj can be nil
|
||
|
AddScriptCallback("actor_on_changed_slot")
|
||
|
_G.CActor_OnChangedSlot = function(new_slot, new_obj, prev_slot, prev_obj)
|
||
|
SendScriptCallback("actor_on_changed_slot", new_slot, new_obj, prev_slot, prev_obj)
|
||
|
end
|
||
|
|
||
|
-- On before hit after calculations callback
|
||
|
-- The hit object contains final values before applying
|
||
|
AddScriptCallback("on_before_hit_after_calcs")
|
||
|
_G.CBeforeHitAfterCalcs = function(shit, target, boneId)
|
||
|
SendScriptCallback("on_before_hit_after_calcs", shit, target, boneId)
|
||
|
end
|
||
|
|
||
|
--[[
|
||
|
|
||
|
On right click on PDA map callback
|
||
|
Params are property_ui and map_table
|
||
|
property_ui is the same as in pda.property_box_add_properties callback
|
||
|
map_table contains:
|
||
|
level_name - name of hovered map
|
||
|
pos - position in the real world under the cursor on the hovered map
|
||
|
global_map_pos - position under the cursor on the global map canvas, not the real world position
|
||
|
object_id - id of object under cursor, 65535 if no object
|
||
|
hint - tooltip string for the object under cursor, nil if no object
|
||
|
lvid - level vertex id by position on the hovered map
|
||
|
gvid - game vertex id by position on the hovered map
|
||
|
|
||
|
--]]
|
||
|
AddScriptCallback("on_map_right_click")
|
||
|
_G.COnRightClickMap = function(property_ui, map_table)
|
||
|
pda.map_spot_property.id = map_table.object_id
|
||
|
pda.map_spot_property.level_name = map_table.level_name
|
||
|
SendScriptCallback("on_map_right_click", property_ui, map_table)
|
||
|
end
|
||
|
|
||
|
-- On receive game news callback
|
||
|
AddScriptCallback("on_news_received")
|
||
|
_G.CUIMessagesWindow__AddIconedPdaMessage = function(UIWindow, UITimeText, UICaptionText, UIMsgText, UIIconStatic)
|
||
|
local tags = {}
|
||
|
SendScriptCallback("on_news_received", UIWindow, UITimeText, UICaptionText, UIMsgText, UIIconStatic, tags)
|
||
|
end
|
||
|
|
||
|
-- Improve NPCs pathfinding by reducing actual anomaly damage radius
|
||
|
-- Works only when npc:get_enable_anomalies_pathfinding() == true or ai_die_in_anomalies cvar is 1
|
||
|
function is_outside_damage_radius(zone, obj)
|
||
|
local se_zone = alife_object(zone:id())
|
||
|
if not se_zone then
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
local data = utils_stpk.get_anom_zone_data(se_zone)
|
||
|
if not (data and data.shapes[1] and data.shapes[1].radius) then
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
local radius = data.shapes[1].radius
|
||
|
local damage_radius = math.max(radius - 1.1, 1)
|
||
|
local damage_radius_sqr = damage_radius * damage_radius
|
||
|
local dist_sqr = zone:position():distance_to_sqr(obj:position())
|
||
|
local res = dist_sqr > damage_radius_sqr
|
||
|
-- printf("obj %s anomaly %s, dist_sqr %s, damage_radius_sqr %s, damaging %s", obj:name(), zone:name(), dist_sqr, damage_radius_sqr, res)
|
||
|
return res
|
||
|
end
|
||
|
|
||
|
function anomaly_on_before_activate(zone, obj, flags)
|
||
|
if obj:id() ~= AC_ID
|
||
|
and (IsStalker(obj) or IsMonster(obj))
|
||
|
and obj:alive()
|
||
|
and is_outside_damage_radius(zone, obj)
|
||
|
then
|
||
|
-- printf("obj %s in anomaly %s and is_outside_damage_radius", obj:name(), zone:name())
|
||
|
flags.ret_value = false
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function on_game_start()
|
||
|
RegisterScriptCallback("anomaly_on_before_activate", anomaly_on_before_activate)
|
||
|
RegisterScriptCallback("game_object_on_net_spawn", game_object_on_net_spawn)
|
||
|
RegisterScriptCallback("game_object_on_net_destroy", game_object_on_net_destroy)
|
||
|
end
|