port: net: fix laptop gun altfire on clients; better autogun sync

This commit is contained in:
fgsfds committed 2025-04-27 19:52:28 +02:00
1 parent 75d1886da1
commit f3ce20fb6e
3 files changed
+31 -10

No files matched your search

+2 -2
View File
@@ -221,14 +221,14 @@ static inline void netClientRecordMove(struct netclient *cl, const struct player
move->ucmd |= UCMD_SQUAT;
}
if (pl->gunctrl.switchtoweaponnum >= 0) {
if (pl->gunctrl.switchtoweaponnum >= 0 && !pl->gunctrl.throwing) {
move->ucmd |= UCMD_SELECT;
move->weaponnum = pl->gunctrl.switchtoweaponnum;
} else {
move->weaponnum = -1;
}
if (pl->gunctrl.dualwielding) {
if (pl->gunctrl.dualwielding && !pl->gunctrl.throwing) {
move->ucmd |= UCMD_SELECT_DUAL;
if ((move->ucmd ^ cl->outmove[1].ucmd) & UCMD_SELECT_DUAL) {
move->ucmd |= UCMD_SELECT;
+23 -8
View File
@@ -31,6 +31,20 @@
/* utils */
static inline u32 netbufReadHidden(struct netbuf *buf)
{
u32 hidden = netbufReadU32(buf);
// swap owner player numbers to match server
const u8 ownerclid = (hidden & 0xf0000000) >> 28;
if (ownerclid < NET_MAX_CLIENTS) {
const u8 ownerplayernum = g_NetClients[ownerclid].playernum;
hidden = (hidden & 0x0fffffff) | (ownerplayernum << 28);
}
return hidden;
}
static inline u32 netbufWriteRooms(struct netbuf *buf, const s16 *rooms, const s32 num)
{
for (s32 i = 0; i < num; ++i) {
@@ -930,6 +944,7 @@ u32 netmsgSvcPropSpawnWrite(struct netbuf *dst, struct prop *prop)
const u8 ownerplayernum = (prop->obj->hidden & 0xf0000000) >> 28;
netbufWriteU8(dst, autogun->ammoquantity);
netbufWriteU8(dst, autogun->firecount);
netbufWriteU8(dst, autogun->targetteam);
netbufWriteU8(dst, g_Vars.players[ownerplayernum]->client->id);
}
break;
@@ -1049,9 +1064,13 @@ u32 netmsgSvcPropSpawnRead(struct netbuf *src, struct netclient *srccl)
// thrown laptop?
const u8 ammocount = netbufReadU8(src);
const u8 firecount = netbufReadU8(src);
const u8 targetteam = netbufReadU8(src);
const u8 clid = netbufReadU8(src);
struct chrdata *ownerchr = g_NetClients[clid].player->prop->chr;
struct autogunobj *obj = laptopDeploy(modelnum, NULL, ownerchr);
obj->ammoquantity = ammocount;
obj->firecount = firecount;
obj->targetteam = targetteam;
prop = obj->base.prop;
}
}
@@ -1086,7 +1105,7 @@ u32 netmsgSvcPropSpawnRead(struct netbuf *src, struct netclient *srccl)
const u32 flags = netbufReadU32(src);
const u32 flags2 = netbufReadU32(src);
const u32 flags3 = netbufReadU32(src);
u32 hidden = netbufReadU32(src);
const u32 hidden = netbufReadHidden(src);
const u8 hidden2 = netbufReadU8(src);
const u16 extrascale = netbufReadU16(src);
const s16 pad = netbufReadS16(src);
@@ -1115,15 +1134,11 @@ u32 netmsgSvcPropSpawnRead(struct netbuf *src, struct netclient *srccl)
prop->obj->projectile->powerlimit240 = TICKS(1200);
prop->obj->projectile->smoketimer240 = TICKS(24);
}
if (type == PROPTYPE_WEAPON && (prop->obj->projectile->flags & PROJECTILEFLAG_00000002)) {
if ((type == PROPTYPE_WEAPON && (prop->obj->projectile->flags & PROJECTILEFLAG_00000002)) || objtype == OBJTYPE_AUTOGUN) {
// this is a thrown projectile, play throw sound
psCreate(NULL, prop, SFX_THROW, -1, -1, 0, 0, PSTYPE_NONE, NULL, -1, NULL, -1, -1, -1, -1);
}
}
// swap owner player numbers to match server
u8 ownerplayernum = (hidden & 0xf0000000) >> 28;
ownerplayernum = g_NetClients[ownerplayernum].playernum;
hidden = (hidden & 0x0fffffff) | (ownerplayernum << 28);
prop->obj->flags = flags;
prop->obj->flags2 = flags2;
prop->obj->flags3 = flags3;
@@ -1167,7 +1182,7 @@ u32 netmsgSvcPropDamageRead(struct netbuf *src, struct netclient *srccl)
const f32 damage = netbufReadF32(src);
const s8 weaponnum = netbufReadS8(src);
const s8 playernum = netbufReadS8(src);
const u32 hidden = netbufReadU32(src);
const u32 hidden = netbufReadHidden(src);
if (srccl->state < CLSTATE_GAME) {
return src->error;
}
@@ -1284,7 +1299,7 @@ u32 netmsgSvcPropDoorRead(struct netbuf *src, struct netclient *srccl)
const u8 clid = netbufReadU8(src);
const s8 doormode = netbufReadS8(src);
const u32 flags = netbufReadU32(src);
const u32 hidden = netbufReadU32(src);
const u32 hidden = netbufReadHidden(src);
struct netclient *actcl = (clid == NET_NULL_CLIENT) ? NULL : &g_NetClients[clid];
+6
View File
@@ -6688,6 +6688,12 @@ s32 projectileTick(struct defaultobj *obj, bool *embedded)
}
if (projectile->speed.f[0] == 0.0f && projectile->speed.f[2] == 0.0f && projectile->unk0dc == 0.0f) {
#ifndef PLATFORM_N64
if (g_NetMode == NETMODE_SERVER) {
// sliding object has stopped, sync the final position just in case
netmsgSvcPropMoveWrite(&g_NetMsgRel, prop, NULL);
}
#endif
objFreeProjectile(obj);
}