PadWorld-Entertainment / worldofpadman

World of PADMAN game repository
https://worldofpadman.net
Other
38 stars 8 forks source link

CATCH unable to score when collecting the Killerduck while having a Holdable in my Inventory #225

Closed 3aTmE closed 7 months ago

3aTmE commented 8 months ago

The Issue :

When collecting the Killerduck while carrying a different Holdable in CATCH breaks the Item. The Player is unable to score, keeps their weapons, can still collect weapons and ammunition but is unable to collect different holdables while being this state. Bots wont also attack the player.

The Only way to get rid of the Killlerduck is either by gettting fragged or killing themselves via the /kill command.

A note: This issue occurred so far only once for me. I am not able to reproduce it.

How to reproduce it (if you are lucky) :

Tested on :

WOP-Version: The most recent code base from 18.11.2023 at the time of writing this. OS: Manjaro Linux / Kernel : 6.5.11-1-MANJARO CPU: Ryzen 5 3600x GPU: AMD Radeon RX 580 RAM: 16gb DDR4 Window manager: X11

kai-li-wop commented 8 months ago

From time to time I have a similar issue. I can collect the Killerduck but it is treated like a holdable. I am not getting the killderuck carrier status and I am not able to collect points.

mgerhardy commented 7 months ago

just a shot in the blue: this sounds like a timing issue - maybe we are reading the state from different playerstates here (snapshots) and are basing our decisions on e.g. old data in one function and the new - not yet updated data - in some other function.

mgerhardy commented 7 months ago

I've verified my shot into the blue - but I'm 99% sure that this isn't the cause. We are always using the correct playerstate_t.

kai-li-wop commented 7 months ago

The funny thing is, that now I had the opposite case. I dropped the killerduck but still kept the killerduck status, golden aura, collecting points, holding the killerduck in my hands, but I dropped it in front of me. I was able to recollect it.

mgerhardy commented 7 months ago

I've seen that the eflags value is transmitted as 16 bits only - but the killerduck flags are higher than 16 bits (and a few others - reward related, too)

I'm talking about the playerStateFields value for eflags - which is 16 for the bits - it should maybe be 32

#define EF_TEAMVOTED 0x00020000         // already cast a team vote
#define EF_FLOATER 0x00040000           // player uses floater
#define EF_AWARD_SPRAYGOD 0x00080000
#define EF_AWARD_SPRAYKILLER 0x00100000
#define EF_NOLIFESLEFT 0x00200000
#define EF_KILLERDUCK 0x00400000

I wonder how the others ever worked - or I still might miss a thing here.

MSG_WriteBits() is called here with bits being 16 - resulting in a memcpy for 2 bytes.

mgerhardy commented 7 months ago

The EF_FLOATER flag might come by the use event and the execution of Pmove() in cgame. But it could also explain some bugs we had with the floater and out of sync sounds - the truth should come from the game code - which might not be the case here. But I'm still on the track to validate this theory.

mgerhardy commented 7 months ago

entityStateFields should get 23 bits for eFlags because EF_KILLERDUCK is 0x00400000 which is 01000000'00000000'00000000

3aTmE commented 2 months ago

I tried to replicate this multiple times but was unable to.

The issue seems to be fixed now! 👍