I have been running into an issue w/ CEntity when it comes to dealing with engineers' buildables. For some odd reason, when a building is destroyed, the CBaseEntity and edict_t pointers change within CEntity to either another entity (instanced_scripted_scene) or get corrupted (change to 0xDDDDDDDD address). For some reason, this issue seems isolated to dispensers and sentry guns only. Teleporters behave just fine from my testing.
I wrote a simple function to deal damage to buildings only and ran it and here were the results (using Msg() to output).
How data below was outputted: pEntity is a CEntity pointer, BaseEntity is a CBaseEntity pointer, pEdict is an edict_t pointer, [classname] and [entity index]
Code:
Pre-Damage: pEntity @ 0x176BF070 BaseEntity @ 0x2338FF98 pEdict @ 0x112E30BC [obj_sentrygun] [623]
Post-Damage: pEntity @ 0x176BF070 BaseEntity @ 0xDDDDDDDD pEdict @ 0xDDDDDDDD
Pre-Damage: pEntity @ 0x176BEDD0 BaseEntity @ 0x23390A20 pEdict @ 0x112E30E4 [obj_sentrygun] [625]
Post-Damage: pEntity @ 0x176BEDD0 BaseEntity @ 0xDDDDDDDD pEdict @ 0xDDDDDDDD
Pre-Damage: pEntity @ 0x176BE7E8 BaseEntity @ 0x231F1F90 pEdict @ 0x112E3120 [obj_sentrygun] [628]
Post-Damage: pEntity @ 0x176BE7E8 BaseEntity @ 0xDDDDDDDD pEdict @ 0xDDDDDDDD
Pre-Damage: pEntity @ 0x176BE890 BaseEntity @ 0x233AFC40 pEdict @ 0x112E3148 [obj_sentrygun] [630]
Post-Damage: pEntity @ 0x176BE890 BaseEntity @ 0xDDDDDDDD pEdict @ 0xDDDDDDDD
Pre-Damage: pEntity @ 0x176BE938 BaseEntity @ 0x232099D0 pEdict @ 0x112E3198 [obj_sentrygun] [634]
Post-Damage: pEntity @ 0x176BE938 BaseEntity @ 0xDDDDDDDD pEdict @ 0xDDDDDDDD
Pre-Damage: pEntity @ 0x176BEFC8 BaseEntity @ 0x2289A0D8 pEdict @ 0x112E31FC [obj_sentrygun] [639]
Post-Damage: pEntity @ 0x176BEFC8 BaseEntity @ 0xDDDDDDDD pEdict @ 0xDDDDDDDD
Pre-Damage: pEntity @ 0x176BED28 BaseEntity @ 0x232B9388 pEdict @ 0x112E2E8C [obj_sentrygun] [595]
Post-Damage: pEntity @ 0x176BED28 BaseEntity @ 0xDDDDDDDD pEdict @ 0xDDDDDDDD
Pre-Damage: pEntity @ 0x176BE740 BaseEntity @ 0x232BDD40 pEdict @ 0x112E3364 [obj_sentrygun] [657]
Post-Damage: pEntity @ 0x176BE740 BaseEntity @ 0xDDDDDDDD pEdict @ 0xDDDDDDDD
Pre-Damage: pEntity @ 0x176C1F60 BaseEntity @ 0x2289EA90 pEdict @ 0x112E2BE4 [obj_sentrygun] [561]
Post-Damage: pEntity @ 0x176C1F60 BaseEntity @ 0xDDDDDDDD pEdict @ 0xDDDDDDDD
Pre-Damage: pEntity @ 0x176C2DD0 BaseEntity @ 0x232BD2B8 pEdict @ 0x112E2D9C [obj_sentrygun] [583]
Post-Damage: pEntity @ 0x176C2DD0 BaseEntity @ 0xDDDDDDDD pEdict @ 0xDDDDDDDD
Pre-Damage: pEntity @ 0x176C23F8 BaseEntity @ 0x232BFCD8 pEdict @ 0x112E2CD4 [obj_sentrygun] [573]
Post-Damage: pEntity @ 0x176C23F8 BaseEntity @ 0xDDDDDDDD pEdict @ 0xDDDDDDDD
Pre-Damage: pEntity @ 0x176C2D28 BaseEntity @ 0x231F11F0 pEdict @ 0x112E2FF4 [obj_dispenser] [613]
Post-Damage: pEntity @ 0x176C2D28 BaseEntity @ 0xDDDDDDDD pEdict @ 0xDDDDDDDD
Pre-Damage: pEntity @ 0x176C2A88 BaseEntity @ 0x232B7E78 pEdict @ 0x112E2E78 [obj_sentrygun] [594]
Post-Damage: pEntity @ 0x176C2A88 BaseEntity @ 0xDDDDDDDD pEdict @ 0xDDDDDDDD
Pre-Damage: pEntity @ 0x176BEB30 BaseEntity @ 0x22898BC8 pEdict @ 0x112E2CE8 [obj_sentrygun] [574]
Post-Damage: pEntity @ 0x176BEB30 BaseEntity @ 0xDDDDDDDD pEdict @ 0xDDDDDDDD
Pre-Damage: pEntity @ 0x176BF1C0 BaseEntity @ 0x2289F518 pEdict @ 0x112E2E14 [obj_sentrygun] [589]
Post-Damage: pEntity @ 0x176BF1C0 BaseEntity @ 0xDDDDDDDD pEdict @ 0xDDDDDDDD
Pre-Damage: pEntity @ 0x176C3508 BaseEntity @ 0x23402EC0 pEdict @ 0x112E3C4C [obj_dispenser] [771]
Post-Damage: pEntity @ 0x176C3508 BaseEntity @ 0xDDDDDDDD pEdict @ 0xDDDDDDDD
Pre-Damage: pEntity @ 0x176C2200 BaseEntity @ 0x234484E0 pEdict @ 0x112E3210 [obj_dispenser] [640]
Post-Damage: pEntity @ 0x176C2200 BaseEntity @ 0xDDDDDDDD pEdict @ 0xDDDDDDDD
Pre-Damage: pEntity @ 0x176C3658 BaseEntity @ 0x23446B20 pEdict @ 0x112E2F2C [obj_dispenser] [603]
Post-Damage: pEntity @ 0x176C3658 BaseEntity @ 0xDDDDDDDD pEdict @ 0xDDDDDDDD
Pre-Damage: pEntity @ 0x176C2158 BaseEntity @ 0x23575DA8 pEdict @ 0x112E2EB4 [obj_dispenser] [597]
Post-Damage: pEntity @ 0x176C2158 BaseEntity @ 0xDDDDDDDD pEdict @ 0xDDDDDDDD
Pre-Damage: pEntity @ 0x176C1A20 BaseEntity @ 0x2289E008 pEdict @ 0x112E3350 [obj_sentrygun] [656]
Post-Damage: pEntity @ 0x176C1A20 BaseEntity @ 0xDDDDDDDD pEdict @ 0xDDDDDDDD
Pre-Damage: pEntity @ 0x176C2E78 BaseEntity @ 0x231E6178 pEdict @ 0x112E2C70 [obj_dispenser] [568]
Post-Damage: pEntity @ 0x176C2E78 BaseEntity @ 0xDDDDDDDD pEdict @ 0xDDDDDDDD
Pre-Damage: pEntity @ 0x176C33B8 BaseEntity @ 0x23573968 pEdict @ 0x112E333C [obj_dispenser] [655]
Post-Damage: pEntity @ 0x176C33B8 BaseEntity @ 0xDDDDDDDD pEdict @ 0xDDDDDDDD
Pre-Damage: pEntity @ 0x176C2698 BaseEntity @ 0x232B9E10 pEdict @ 0x112E3044 [obj_teleporter] [617]
Post-Damage: pEntity @ 0x176C2698 BaseEntity @ 0x232B9E10 pEdict @ 0x112E3044
Pre-Damage: pEntity @ 0x176C20B0 BaseEntity @ 0x23447550 pEdict @ 0x112E2EA0 [obj_dispenser] [596]
Post-Damage: pEntity @ 0x176C20B0 BaseEntity @ 0x23447550 pEdict @ 0x112E2EA0
This is problematic since CEntity instance is not destroyed (thus pointer to CEntity is still valid but internal pointers are corrupt/wrong). However, if you try to access any entity data w/ that pointer, crash occurs.
I have done testing 2 ways: 1. Just called OnTakeDamage if IsBaseObject returned true (both are virtuals of CBaseEntity) and 2. Destroyed object normally using Sniper class after storing his buildable in a CEntity pointer and outputting pointer information via Msg() function. Both ways yielded same results.
Any idea on what can be done to solve this issue?
Any help is appreciated. Thanks in advance.