From 6225f62412aadc11d2212318916c9999dfd5bb76 Mon Sep 17 00:00:00 2001 From: fgsfds Date: Sun, 24 Dec 2023 16:55:55 +0100 Subject: [PATCH] port: net: partially fix rockets --- port/src/net/netmsg.c | 35 +++++++++++++++++++++++++++++++---- src/game/bondgun.c | 3 +-- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/port/src/net/netmsg.c b/port/src/net/netmsg.c index b8ab0d05e..f9447e55d 100644 --- a/port/src/net/netmsg.c +++ b/port/src/net/netmsg.c @@ -688,6 +688,7 @@ u32 netmsgSvcPropMoveWrite(struct netbuf *dst, struct prop *prop, struct coord * netbufWriteU32(dst, projectile->flags); netbufWriteS8(dst, projectile->bouncecount); netbufWritePropPtr(dst, projectile->ownerprop); + netbufWritePropPtr(dst, projectile->targetprop); if (initrot) { netbufWriteCoord(dst, initrot); } @@ -760,6 +761,7 @@ u32 netmsgSvcPropMoveRead(struct netbuf *src, struct netclient *srccl) projectile->flags = netbufReadU32(src); projectile->bouncecount = netbufReadS8(src); projectile->ownerprop = netbufReadPropPtr(src); + projectile->targetprop = netbufReadPropPtr(src); if (flags & (1 << 2)) { struct coord initrot; netbufReadCoord(src, &initrot); @@ -775,6 +777,8 @@ u32 netmsgSvcPropMoveRead(struct netbuf *src, struct netclient *srccl) projectile->unk0f0 = netbufReadF32(src); } + prop->pos = pos; + return src->error; } @@ -798,6 +802,7 @@ u32 netmsgSvcPropSpawnWrite(struct netbuf *dst, struct prop *prop) // dropped gun or projectile netbufWriteS16(dst, prop->weapon->base.modelnum); netbufWriteU8(dst, prop->weapon->weaponnum); + netbufWriteS8(dst, prop->weapon->dualweaponnum); netbufWriteS8(dst, prop->weapon->unk5d); netbufWriteS8(dst, prop->weapon->unk5e); netbufWriteU8(dst, prop->weapon->gunfunc); @@ -832,12 +837,19 @@ u32 netmsgSvcPropSpawnWrite(struct netbuf *dst, struct prop *prop) } } if ((prop->obj->hidden & OBJHFLAG_PROJECTILE) && prop->obj->projectile) { + netbufWriteCoord(dst, &prop->obj->projectile->nextsteppos); netbufWritePropPtr(dst, prop->obj->projectile->ownerprop); + netbufWritePropPtr(dst, prop->obj->projectile->targetprop); netbufWriteU32(dst, prop->obj->projectile->flags); - netbufWriteS32(dst, prop->obj->projectile->pickuptimer240); netbufWriteF32(dst, prop->obj->projectile->unk08c); + netbufWriteS16(dst, prop->obj->projectile->pickuptimer240); netbufWriteS16(dst, prop->obj->projectile->droptype); netbufWriteMtxf(dst, &prop->obj->projectile->mtx); + if (prop->obj->projectile->flags & PROJECTILEFLAG_POWERED) { + netbufWriteF32(dst, prop->obj->projectile->unk010); + netbufWriteF32(dst, prop->obj->projectile->unk014); + netbufWriteF32(dst, prop->obj->projectile->unk018); + } } } @@ -864,6 +876,7 @@ u32 netmsgSvcPropSpawnRead(struct netbuf *src, struct netclient *srccl) if (type == PROPTYPE_WEAPON) { const s16 modelnum = netbufReadS16(src); const u8 weaponnum = netbufReadU8(src); + const s8 dualweaponnum = netbufReadS8(src); const s8 unk5d = netbufReadS8(src); const s8 unk5e = netbufReadS8(src); const u8 gunfunc = netbufReadU8(src); @@ -932,9 +945,9 @@ u32 netmsgSvcPropSpawnRead(struct netbuf *src, struct netclient *srccl) prop->forcetick = (msgflags & (1 << 2)) != 0; // prop->flags = propflags; roomsCopy(rooms, prop->rooms); - propRegisterRooms(prop); if (msgflags & (1 << 0)) { propActivate(prop); + propRegisterRooms(prop); } else { propPause(prop); } @@ -966,13 +979,24 @@ u32 netmsgSvcPropSpawnRead(struct netbuf *src, struct netclient *srccl) if (prop->obj) { if (hidden & OBJHFLAG_PROJECTILE) { func0f0685e4(prop); + netbufReadCoord(src, &prop->obj->projectile->nextsteppos); prop->obj->projectile->ownerprop = netbufReadPropPtr(src); + prop->obj->projectile->targetprop = netbufReadPropPtr(src); prop->obj->projectile->flags = netbufReadU32(src); - prop->obj->projectile->pickuptimer240 = netbufReadS32(src); prop->obj->projectile->unk08c = netbufReadF32(src); + prop->obj->projectile->pickuptimer240 = netbufReadS16(src); prop->obj->projectile->droptype = netbufReadS16(src); + prop->obj->projectile->flighttime240 = 0; netbufReadMtxf(src, &prop->obj->projectile->mtx); - if (prop->obj->projectile->flags & PROJECTILEFLAG_00000002) { + if (prop->obj->projectile->flags & PROJECTILEFLAG_POWERED) { + // rocket; get acceleration and realrot + prop->obj->projectile->unk010 = netbufReadF32(src); + prop->obj->projectile->unk014 = netbufReadF32(src); + prop->obj->projectile->unk018 = netbufReadF32(src); + prop->obj->projectile->powerlimit240 = TICKS(1200); + prop->obj->projectile->smoketimer240 = TICKS(24); + } + if (type == PROPTYPE_WEAPON && (prop->obj->projectile->flags & PROJECTILEFLAG_00000002)) { // 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); } @@ -993,6 +1017,9 @@ u32 netmsgSvcPropSpawnRead(struct netbuf *src, struct netclient *srccl) } } + // just in case + prop->pos = pos; + return src->error; } diff --git a/src/game/bondgun.c b/src/game/bondgun.c index 5b63db77e..0f1d22e48 100644 --- a/src/game/bondgun.c +++ b/src/game/bondgun.c @@ -5007,9 +5007,8 @@ void bgunCreateFiredProjectile(s32 handnum) weapon->base.prop = NULL; weapon->base.model = NULL; } - #ifndef PLATFORM_N64 - if (!failed && g_NetMode == NETMODE_SERVER) { + else if (g_NetMode == NETMODE_SERVER) { netmsgSvcPropSpawnWrite(&g_NetMsgRel, weapon->base.prop); netmsgSvcPropMoveWrite(&g_NetMsgRel, weapon->base.prop, NULL); }