forked from Ports/perfect_dark
port: net: fix laptop gun altfire on clients; better autogun sync
This commit is contained in:
1 parent
75d1886da1
commit
f3ce20fb6e
3 files changed
+31
-10
No files matched your search
+2
-2
@@ -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
@@ -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];
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user