fix notplayer with friendly fire probably, make fish and worm sync nicer

This commit is contained in:
bgkillas 2024-10-16 06:45:23 -04:00
parent edda7cd5f9
commit 495481e0d3
8 changed files with 96 additions and 34 deletions

16
noita-proxy/Cargo.lock generated
View file

@ -295,9 +295,9 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
[[package]] [[package]]
name = "bytemuck" name = "bytemuck"
version = "1.18.0" version = "1.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94bbb0ad554ad961ddc5da507a12a29b14e4ae5bda06b19f575a3e6079d2e2ae" checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d"
dependencies = [ dependencies = [
"bytemuck_derive", "bytemuck_derive",
] ]
@ -380,9 +380,9 @@ dependencies = [
[[package]] [[package]]
name = "cc" name = "cc"
version = "1.1.29" version = "1.1.30"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "58e804ac3194a48bb129643eb1d62fcc20d18c6b8c181704489353d13120bcd1" checksum = "b16803a61b81d9eabb7eae2588776c4c1e584b738ede45fdbb4c972cec1e9945"
dependencies = [ dependencies = [
"jobserver", "jobserver",
"libc", "libc",
@ -1469,9 +1469,9 @@ checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946"
[[package]] [[package]]
name = "hyper" name = "hyper"
version = "1.4.1" version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a"
dependencies = [ dependencies = [
"bytes", "bytes",
"futures-channel", "futures-channel",
@ -2863,9 +2863,9 @@ dependencies = [
[[package]] [[package]]
name = "rustls-pki-types" name = "rustls-pki-types"
version = "1.9.0" version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0e696e35370c65c9c541198af4543ccd580cf17fc25d8e05c5a242b202488c55" checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b"
[[package]] [[package]]
name = "rustls-platform-verifier" name = "rustls-platform-verifier"

View file

@ -1022,7 +1022,7 @@ impl eframe::App for App {
ui.checkbox(&mut self.app_saved_state.show_extra_debug_stuff, tr("Show-debug-info")); ui.checkbox(&mut self.app_saved_state.show_extra_debug_stuff, tr("Show-debug-info"));
ui.add_space(15.0); ui.add_space(15.0);
if self.app_saved_state.game_settings.friendly_fire { if self.app_saved_state.game_settings.friendly_fire || netman.settings.lock().map(|a| a.friendly_fire).unwrap_or(false) {
let last = self.app_saved_state.game_settings.friendly_fire_team; let last = self.app_saved_state.game_settings.friendly_fire_team;
ui.add(Slider::new(&mut self.app_saved_state.game_settings.friendly_fire_team, -1..=16)); ui.add(Slider::new(&mut self.app_saved_state.game_settings.friendly_fire_team, -1..=16));
if last != self.app_saved_state.game_settings.friendly_fire_team { if last != self.app_saved_state.game_settings.friendly_fire_team {

View file

@ -453,10 +453,16 @@ impl NetManager {
} else { } else {
info!("No nickname chosen"); info!("No nickname chosen");
} }
state.try_ws_write_option( if let Ok(mut set) = self.settings.lock() {
"friendly_fire_team", state.try_ws_write_option(
(settings.friendly_fire_team + 1) as u32, "friendly_fire_team",
); (set.friendly_fire_team + 1) as u32,
);
if settings.friendly_fire {
set.friendly_fire = true
}
}
state.try_ws_write_option("friendly_fire", settings.friendly_fire);
state.try_ws_write_option("debug", settings.debug_mode); state.try_ws_write_option("debug", settings.debug_mode);
state.try_ws_write_option("world_sync_version", settings.world_sync_version); state.try_ws_write_option("world_sync_version", settings.world_sync_version);
state.try_ws_write_option("player_tether", settings.player_tether); state.try_ws_write_option("player_tether", settings.player_tether);
@ -466,7 +472,6 @@ impl NetManager {
state.try_ws_write_option("enemy_hp_scale", settings.enemy_hp_mult); state.try_ws_write_option("enemy_hp_scale", settings.enemy_hp_mult);
state.try_ws_write_option("world_sync_interval", settings.world_sync_interval); state.try_ws_write_option("world_sync_interval", settings.world_sync_interval);
state.try_ws_write_option("game_mode", settings.game_mode); state.try_ws_write_option("game_mode", settings.game_mode);
state.try_ws_write_option("friendly_fire", settings.friendly_fire);
state.try_ws_write_option("chunk_target", settings.chunk_target); state.try_ws_write_option("chunk_target", settings.chunk_target);
state.try_ws_write_option("health_per_player", settings.health_per_player); state.try_ws_write_option("health_per_player", settings.health_per_player);
state.try_ws_write_option("enemy_sync_interval", settings.enemy_sync_interval); state.try_ws_write_option("enemy_sync_interval", settings.enemy_sync_interval);
@ -636,4 +641,4 @@ impl Drop for NetManager {
info!("Skip saving run info: not a host"); info!("Skip saving run info: not a host");
} }
} }
} }

View file

@ -266,6 +266,14 @@ function util.make_type(typedata)
inner = inner .. "unsigned int "..var..";\n" inner = inner .. "unsigned int "..var..";\n"
end end
for _, var in ipairs(typedata.bool or {}) do
inner = inner .. "bool "..var..";\n"
end
for _, var in ipairs(typedata.string or {}) do
inner = inner .. "const char* "..var..";\n"
end
ffi.cdef([[ ffi.cdef([[
#pragma pack(push, 1) #pragma pack(push, 1)
typedef struct ]] .. name .. [[{ typedef struct ]] .. name .. [[{

View file

@ -11,20 +11,42 @@ local rpc = net.new_rpc_namespace()
local EnemyData = util.make_type({ local EnemyData = util.make_type({
u32 = {"enemy_id"}, u32 = {"enemy_id"},
f32 = {"x", "y", "vx", "vy", "rot"}, f32 = {"x", "y", "vx", "vy"},
}) })
-- Variant of EnemyData for when we don't have any motion (or no VelocityComponent). -- Variant of EnemyData for when we don't have any motion (or no VelocityComponent).
local EnemyDataNoMotion = util.make_type({ local EnemyDataNoMotion = util.make_type({
u32 = {"enemy_id"}, u32 = {"enemy_id"},
f32 = {"x", "y", "rot"} f32 = {"x", "y"}
}) })
local EnemyDataWorm = util.make_type({
u32 = {"enemy_id"},
f32 = {"x", "y", "vx", "vy", "tx", "ty"},
})
local EnemyDataFish = util.make_type({
u32 = {"enemy_id"},
f32 = {"x", "y", "vx", "vy"},
u8 = {"r"}
})
--local EnemyDataSniper = util.make_type({
-- u32 = {"enemy_id"},
-- f32 = {"x", "y", "vx", "vy"},
-- bool = {"aiming"},
--})
local HpData = util.make_type({ local HpData = util.make_type({
u32 = {"enemy_id"}, u32 = {"enemy_id"},
f32 = {"hp", "max_hp"} f32 = {"hp", "max_hp"}
}) })
--local HpDataMom = util.make_type({
-- u32 = {"enemy_id"},
-- f32 = {"hp", "max_hp", "hp1", "hp2", "hp3", "hp4"}
--})
local FULL_TURN = math.pi * 2 local FULL_TURN = math.pi * 2
local PhysData = util.make_type({ local PhysData = util.make_type({
@ -236,21 +258,40 @@ function enemy_sync.host_upload_entities()
-- end -- end
local en_data local en_data
if math.abs(vx) < 0.01 and math.abs(vy) < 0.01 then local worm = EntityGetFirstComponentIncludingDisabled(enemy_id, "WormAIComponent")
en_data= EnemyDataNoMotion { if worm ~= nil then
enemy_id = enemy_id, local tx, ty = ComponentGetValue2(worm, "mRandomTarget")
x = x, en_data = EnemyDataWorm {
y = y, enemy_id = enemy_id,
rot = rot, x = x,
} y = y,
else vx = vx,
en_data= EnemyData { vy = vy,
tx = tx,
ty = ty,
}
elseif math.abs(vx) < 0.01 and math.abs(vy) < 0.01 then
en_data = EnemyDataNoMotion {
enemy_id = enemy_id,
x = x,
y = y,
}
elseif EntityGetFirstComponentIncludingDisabled(enemy_id, "AdvancedFishAIComponent") ~= nil then
en_data = EnemyDataFish {
enemy_id = enemy_id,
x = x,
y = y,
vx = vx,
vy = vy,
r = math.floor((rot % FULL_TURN) / FULL_TURN * 255),
}
else
en_data = EnemyData {
enemy_id = enemy_id, enemy_id = enemy_id,
x = x, x = x,
y = y, y = y,
vx = vx, vx = vx,
vy = vy, vy = vy,
rot = rot,
} }
end end
@ -383,7 +424,6 @@ local function sync_enemy(enemy_info_raw, force_no_cull)
local dont_cull = enemy_info_raw[9] local dont_cull = enemy_info_raw[9]
local remote_enemy_id = en_data.enemy_id local remote_enemy_id = en_data.enemy_id
local x, y = en_data.x, en_data.y local x, y = en_data.x, en_data.y
local rot = en_data.rot
if not force_no_cull and not dont_cull then if not force_no_cull and not dont_cull then
local my_x, my_y = EntityGetTransform(ctx.my_player.entity) local my_x, my_y = EntityGetTransform(ctx.my_player.entity)
if my_x == nil then if my_x == nil then
@ -407,7 +447,7 @@ local function sync_enemy(enemy_info_raw, force_no_cull)
end end
local vx = 0 local vx = 0
local vy = 0 local vy = 0
if ffi.typeof(en_data) == EnemyData then if ffi.typeof(en_data) ~= EnemyDataNoMotion then
vx, vy = en_data.vx, en_data.vy vx, vy = en_data.vx, en_data.vy
end end
local not_ephemerial = enemy_info_raw[3] local not_ephemerial = enemy_info_raw[3]
@ -527,7 +567,16 @@ local function sync_enemy(enemy_info_raw, force_no_cull)
if velocity_data ~= nil then if velocity_data ~= nil then
ComponentSetValue2(velocity_data, "mVelocity", vx, vy) ComponentSetValue2(velocity_data, "mVelocity", vx, vy)
end end
EntitySetTransform(enemy_id, x, y, rot) if ffi.typeof(en_data) == EnemyDataFish then
EntitySetTransform(enemy_id, x, y, en_data.r / 255 * FULL_TURN)
else
EntitySetTransform(enemy_id, x, y)
end
local worm = EntityGetFirstComponentIncludingDisabled(enemy_id, "WormAIComponent")
if worm ~= nil and ffi.typeof(en_data) == EnemyDataWorm then
local tx, ty = en_data.tx, en_data.ty
ComponentSetValue2(worm, "mRandomTarget", tx, ty)
end
end end
local inv = EntityGetFirstComponentIncludingDisabled(enemy_id, "Inventory2Component") local inv = EntityGetFirstComponentIncludingDisabled(enemy_id, "Inventory2Component")

View file

@ -42,6 +42,7 @@ end
content = add_new_genome("notplayer", 1000, 1000, 1000, { content = add_new_genome("notplayer", 1000, 1000, 1000, {
player = -1000, player = -1000,
player_pvp = -1000,
}) })
content = add_new_genome("player_pvp", 0, 0, 0, { content = add_new_genome("player_pvp", 0, 0, 0, {

View file

@ -6,8 +6,7 @@ function HasFlagPersistent(flag)
end end
if CrossCall ~= nil then if CrossCall ~= nil then
return CrossCall("ew_has_flag", flag) return CrossCall("ew_has_flag", flag)
else
print("the flag, " .. flag .. " is not being called in a synced way")
return old(flag)
end end
print("the flag, " .. flag .. " is not being called in a synced way")
return old(flag)
end end

View file

@ -14,7 +14,7 @@ function rpc.player_update(input_data, pos_data, current_slot, team)
end end
local player_data = player_fns.peer_get_player_data(peer_id) local player_data = player_fns.peer_get_player_data(peer_id)
if team ~= nil and not GameHasFlagRun("ending_game_completed") then if team ~= nil and not GameHasFlagRun("ending_game_completed") and not EntityHasTag(player_data.entity, "ew_notplayer") then
local my_team = ctx.proxy_opt.friendly_fire_team - 1 local my_team = ctx.proxy_opt.friendly_fire_team - 1
if my_team ~= -1 and team ~= -1 and (team == 0 or my_team == 0 or team ~= my_team) then if my_team ~= -1 and team ~= -1 and (team == 0 or my_team == 0 or team ~= my_team) then
GenomeSetHerdId(player_data.entity, "player_pvp") GenomeSetHerdId(player_data.entity, "player_pvp")