have notplayer throw ukko rock only if your in water, fix some problems with items not appearing in inventory, fix potion mimic polymorph

This commit is contained in:
bgkillas 2024-11-03 19:00:20 -05:00
parent 4d38d0414c
commit 9a9d60bb5e
3 changed files with 46 additions and 39 deletions

View file

@ -3,7 +3,12 @@ function throw_item()
end end
function item_pickup() function item_pickup()
GlobalsSetValue("ew_picked", tostring(GetUpdatedEntityID())) local ent = GetUpdatedEntityID()
local com = EntityGetFirstComponentIncludingDisabled(ent, "ItemComponent")
if com ~= nil then
ComponentSetValue2(com, "permanently_attached", false)
end
GlobalsSetValue("ew_picked", tostring(ent))
end end
function kick() function kick()

View file

@ -267,14 +267,13 @@ function item_sync.on_world_update()
end end
if GameGetFrameNum() % 5 == 2 then if GameGetFrameNum() % 5 == 2 then
for _, ent in ipairs(EntityGetWithTag("mimic_potion")) do for _, ent in ipairs(EntityGetWithTag("mimic_potion")) do
if ctx.is_host then if EntityHasTag(ent, "polymorphed_player") then
EntityRemoveComponent(ent, EntityGetFirstComponentIncludingDisabled(ent, "ItemComponent"))
elseif ctx.is_host then
if not EntityHasTag(ent, "ew_global_item") then if not EntityHasTag(ent, "ew_global_item") then
item_sync.make_item_global(ent) item_sync.make_item_global(ent)
end end
end end
if EntityHasTag(ent, "polymorphed_player") then
EntityRemoveComponent(ent, EntityGetFirstComponentIncludingDisabled(ent, "ItemComponent"))
end
end end
end end
end end

View file

@ -309,11 +309,6 @@ local function is_frozen(entity)
return frozen return frozen
end end
local dont_throw = true
local stop_potion = false
local bathe = false
local function arc_potion(world_x, world_y) local function arc_potion(world_x, world_y)
local arm = EntityGetAllChildren(ctx.my_player.entity, "player_arm_r")[1] local arm = EntityGetAllChildren(ctx.my_player.entity, "player_arm_r")[1]
local ch_x, ch_y = EntityGetHotspot(arm, "hand", true) local ch_x, ch_y = EntityGetHotspot(arm, "hand", true)
@ -330,9 +325,9 @@ local function arc_potion(world_x, world_y)
local lhs = v*v/(g*dx) local lhs = v*v/(g*dx)
local interior = v*v*v*v - g*g*dx*dx - 2*g*dy*v*v local interior = v*v*v*v - g*g*dx*dx - 2*g*dy*v*v
if interior < 0 then if interior < 0 then
dont_throw = true state.dont_throw = true
state.bad_potion = nil state.bad_potion = nil
stop_potion = true state.stop_potion = true
return return
end end
local rhs = math.sqrt(interior)/(g*dx) local rhs = math.sqrt(interior)/(g*dx)
@ -432,7 +427,7 @@ local function fire_wand(enable)
if state.bad_potion ~= nil or state.good_potion ~= nil or throw_water then if state.bad_potion ~= nil or state.good_potion ~= nil or throw_water then
ComponentSetValue2(state.control_component, "mButtonDownFire", false) ComponentSetValue2(state.control_component, "mButtonDownFire", false)
ComponentSetValue2(state.control_component, "mButtonDownFire2", false) ComponentSetValue2(state.control_component, "mButtonDownFire2", false)
if dont_throw then if state.dont_throw then
return return
end end
ComponentSetValue2(state.control_component, "mButtonDownRightClick", true) ComponentSetValue2(state.control_component, "mButtonDownRightClick", true)
@ -520,6 +515,10 @@ local function init_state()
is_electric_immune = has_electric, is_electric_immune = has_electric,
expected_held = nil, expected_held = nil,
dont_throw = true,
stop_potion = false,
bathe = false,
bad_potions = get_potions_of_type(bad_mats), bad_potions = get_potions_of_type(bad_mats),
good_potions = get_potions_of_type(good_mats), good_potions = get_potions_of_type(good_mats),
water_potions = get_potions_of_type(water_mats), water_potions = get_potions_of_type(water_mats),
@ -595,7 +594,7 @@ local function choose_wand_actions()
elseif state.aim_down then elseif state.aim_down then
t_y = t_y + 7 t_y = t_y + 7
end end
dont_throw = false state.dont_throw = false
aim_at(t_x, t_y) aim_at(t_x, t_y)
fire_wand(not state.last_did_hit and state.init_timer > no_shoot_time and not changed_held)-- or has_water_potion) fire_wand(not state.last_did_hit and state.init_timer > no_shoot_time and not changed_held)-- or has_water_potion)
if changed_held then if changed_held then
@ -764,7 +763,7 @@ local function choose_movement()
if rest or stop_y then if rest or stop_y then
state.control_w = false state.control_w = false
end end
if bathe then if state.bathe then
state.control_a = false state.control_a = false
state.control_d = false state.control_d = false
end end
@ -1007,21 +1006,18 @@ local function hold_something()
local holding = ComponentGetValue2(inventory, "mActualActiveItem") local holding = ComponentGetValue2(inventory, "mActualActiveItem")
local i = 1 local i = 1
local tablet = false local tablet = false
if state.target ~= nil and EntityHasTag(state.target, "polymorphed") then if state.target ~= nil then
local polied = EntityHasTag(state.target, "polymorphed")
local damage = EntityGetFirstComponentIncludingDisabled(state.target, "DamageModelComponent")
local in_water = ComponentGetValue2(damage, "mLiquidCount") > 20
for j, item in ipairs(state.bad_potions) do for j, item in ipairs(state.bad_potions) do
if EntityHasTag(item, "normal_tablet") then if polied and EntityHasTag(item, "normal_tablet") then
i = j i = j
tablet = true tablet = true
break break
end elseif in_water and EntityHasTag(item, "thunderstone") then
end
end
local can_not_tablet=false
if not tablet then
for j, item in ipairs(state.bad_potions) do
if not EntityHasTag(item, "normal_tablet") then
i = j i = j
can_not_tablet = true tablet = true
break break
end end
end end
@ -1029,14 +1025,14 @@ local function hold_something()
if state.bad_potion ~= nil and (holding == nil or holding ~= state.bad_potion) then if state.bad_potion ~= nil and (holding == nil or holding ~= state.bad_potion) then
table.remove(state.bad_potions, i) table.remove(state.bad_potions, i)
state.bad_potion = nil state.bad_potion = nil
stop_potion = true state.stop_potion = true
changed_held = true changed_held = true
end end
if state.good_potion ~= nil and (holding == nil or holding ~= state.good_potion) then if state.good_potion ~= nil and (holding == nil or holding ~= state.good_potion) then
table.remove(state.good_potions, 1) table.remove(state.good_potions, 1)
state.good_potion = nil state.good_potion = nil
stop_potion = true state.stop_potion = true
bathe = true state.bathe = true
changed_held = true changed_held = true
end end
local douse = needs_douse(ctx.my_player.entity) local douse = needs_douse(ctx.my_player.entity)
@ -1046,23 +1042,23 @@ local function hold_something()
if state.water_potion ~= nil then if state.water_potion ~= nil then
state.water_potion = nil state.water_potion = nil
throw_water = false throw_water = false
bathe = false state.bathe = false
changed_held = true changed_held = true
end end
end end
if state.water_potion ~= nil and (((state.init_timer >= no_shoot_time and not state.last_did_hit) or not douse) or (holding == nil or holding ~= state.water_potion) or (throw_water and not target_is_ambrosia)) then if state.water_potion ~= nil and (((state.init_timer >= no_shoot_time and not state.last_did_hit) or not douse) or (holding == nil or holding ~= state.water_potion) or (throw_water and not target_is_ambrosia)) then
state.water_potion = nil state.water_potion = nil
throw_water = false throw_water = false
bathe = false state.bathe = false
changed_held = true changed_held = true
end end
if GameGetFrameNum() % 120 == 40 then if GameGetFrameNum() % 120 == 40 then
bathe = false state.bathe = false
end end
if GameGetFrameNum() % 120 == 60 then if GameGetFrameNum() % 120 == 60 then
stop_potion = false state.stop_potion = false
end end
local ground_below, _, _ = RaytracePlatforms(ch_x, ch_y, ch_x, ch_y + 40) local ground_below, _, _ = RaytracePlatforms(ch_x, ch_y, ch_x, ch_y + 40)
local is_ambrosia = has_ambrosia(ctx.my_player.entity) local is_ambrosia = has_ambrosia(ctx.my_player.entity)
@ -1073,10 +1069,18 @@ local function hold_something()
can_hold_potion = false can_hold_potion = false
end end
local has_potions = false
for _, ent in ipairs(state.bad_potions) do
if EntityHasTag(ent, "potion") then
has_potions = true
end
end
local has_water_potion = can_hold_potion and (not is_ambrosia or target_is_ambrosia) and #state.water_potions ~= 0 and (douse or target_is_ambrosia) and (state.init_timer < no_shoot_time or state.last_did_hit or target_is_ambrosia) local has_water_potion = can_hold_potion and (not is_ambrosia or target_is_ambrosia) and #state.water_potions ~= 0 and (douse or target_is_ambrosia) and (state.init_timer < no_shoot_time or state.last_did_hit or target_is_ambrosia)
local has_bad_potion = can_hold_potion and not has_water_potion and not is_ambrosia and #state.bad_potions ~= 0 and not state.last_did_hit and ((GameGetFrameNum() % 120 > 100 and state.init_timer > 120 and not stop_potion) or tablet) local has_bad_potion = can_hold_potion and not has_water_potion and not is_ambrosia and (has_potions or tablet) and not state.last_did_hit and ((GameGetFrameNum() % 120 > 100 and state.init_timer > 120 and not state.stop_potion) or tablet)
local has_good_potion = can_hold_potion and not has_water_potion and not is_ambrosia and #state.good_potions ~= 0 and not state.last_did_hit and GameGetFrameNum() % 120 < 20 and state.init_timer > 120 and not stop_potion and ground_below local has_good_potion = can_hold_potion and not has_water_potion and not is_ambrosia and #state.good_potions ~= 0 and not state.last_did_hit and GameGetFrameNum() % 120 < 20 and state.init_timer > 120 and not state.stop_potion and ground_below
if GameGetFrameNum() % 10 == 0 and state.had_potion and #state.bad_potions == 0 and #state.good_potions == 0 then
if GameGetFrameNum() % 10 == 0 and state.had_potion and not has_potions and #state.good_potions == 0 then
local has_a_potion = false local has_a_potion = false
for _, item in ipairs(EntityGetAllChildren(state.items)) do for _, item in ipairs(EntityGetAllChildren(state.items)) do
if EntityHasTag(item, "potion") then if EntityHasTag(item, "potion") then
@ -1093,8 +1097,7 @@ local function hold_something()
end end
end end
local held = ComponentGetValue2(state.inv2_component, "mActiveItem") if state.expected_held ~= nil and state.expected_held ~= holding then
if state.expected_held ~= nil and state.expected_held ~= held then
spectate.nofun = true spectate.nofun = true
spectate.disable_throwing(true, ctx.my_player.entity) spectate.disable_throwing(true, ctx.my_player.entity)
end end
@ -1110,8 +1113,8 @@ local function hold_something()
if throw_water then if throw_water then
state.had_potion = true state.had_potion = true
end end
bathe = not target_is_ambrosia state.bathe = not target_is_ambrosia
elseif (has_bad_potion or state.bad_potion ~= nil) and (can_not_tablet or tablet) then elseif (has_bad_potion or state.bad_potion ~= nil) and tablet then
state.expected_held = state.bad_potions[i] state.expected_held = state.bad_potions[i]
if EntityHasTag(state.bad_potions[i], "potion") then if EntityHasTag(state.bad_potions[i], "potion") then
state.had_potion = true state.had_potion = true