1#![allow(non_camel_case_types, non_snake_case)]
2use std::ffi::{c_char, c_void};
3
4use super::{
5 cplayer::{CPlayer, EHandle},
6 cweaponx::CWeaponX,
7};
8use crate::{
9 bindings::{class_types::cplayerdecoy::CPlayerDecoy, cvar::convar::Color, DynamicCast},
10 impl_vmethods,
11 prelude::Vector3,
12 size_assert,
13};
14
15#[repr(C)]
16pub struct IServerNetworkable {
17 vftable: *const c_void,
18}
19
20type edict_t = u16;
21
22#[repr(C)]
23pub struct CServerNetworkProperty {
24 pub base: IServerNetworkable,
25 pub m_pOuter: *mut CBaseEntity,
26 pub m_pServerClass: *mut c_void,
27 pub m_edict: edict_t,
28 pub m_hParent: EHandle,
29 pub unk: c_char,
30}
31size_assert!(SIZE_NET_PROP where CServerNetworkProperty == 40);
32
33#[repr(C)]
34pub struct CCollisionProperty {
35 pub vftable: *const c_void,
36 pub m_pOuter: *mut CBaseEntity, pub m_vecMins: Vector3, pub m_vecMaxs: Vector3, pub m_usSolidFlags: i32, pub m_nSolidType: c_char, pub m_triggerBloat: c_char, pub gap_2e: [c_char; 2],
43 pub m_flRadius: f32, pub m_PartitionHandle: i16, pub m_nSurroundType: c_char, pub m_bRemovedFromPartition: bool, pub m_spatialPartitionFlags: i32, pub m_vecSpecifiedSurroundingMins: Vector3, pub m_vecSpecifiedSurroundingMaxs: Vector3, pub m_vecSurroundingMins: Vector3, pub m_vecSurroundingMaxs: Vector3, pub m_hitboxTestRadius: f32, }
54size_assert!(SIZE_COLLISON_PROP where CCollisionProperty == 112);
55
56#[repr(C)]
57pub struct CBaseEntity {
58 pub vftable: *const c_void,
59 pub m_RefEHandle: EHandle, pub gap_c: [c_char; 4],
61 pub m_collideable: *mut c_void, pub m_networkable: *mut c_void, pub genericKeyValueCount: i32, pub gap_24: [c_char; 4],
65 pub genericKeyValues: *mut c_void, pub m_pfnMoveDone: *mut c_void, pub m_pfnThink: *mut c_void, pub m_Network: CServerNetworkProperty, pub m_entIndex: i32, pub gap_6c: [c_char; 4],
71 pub m_iClassname: i64, pub m_flAnimTime: f32, pub m_flSimulationTime: f32, pub m_creationTick: i32, pub m_nLastThinkTick: i32, pub m_PredictableID: i32, pub touchStamp: i32, pub m_aThinkFunctions: [c_char; 32], pub m_entitySpawnTime: f32, pub m_spawner: EHandle, pub m_scriptClass: i32, pub m_wantsDamageCallbacks: bool, pub m_wantsDeathCallbacks: bool, pub gap_be: [c_char; 2],
85 pub m_nNextThinkTick: i32, pub m_fEffects: i32, pub m_ModelName: i64, pub m_target: i64, pub m_networkedFlags: i32, pub m_nRenderFX: c_char, pub m_nRenderMode: c_char, pub m_nModelIndex: i16, pub m_clrRender: Color, pub m_desiredHibernationType: i32, pub m_scriptMinHibernationType: i32, pub m_minSelfAndDescendantHibernationType: i32, pub m_actualHibernationType: i32, pub m_hibernationQueueIndex: i32, pub m_bRenderWithViewModels: bool, pub gap_f9: [c_char; 3],
101 pub m_nameVisibilityFlags: i32, pub m_cloakEndTime: f32, pub m_cloakFadeInEndTime: f32, pub m_cloakFadeOutStartTime: f32, pub m_cloakFadeInDuration: f32, pub m_cloakFlickerAmount: f32, pub m_cloakFlickerEndTime: f32, pub m_cloakFadeOutDuration: f32, pub m_highlightIsNetworked: bool, pub gap_11d: [c_char; 3],
111 pub m_highlightParams: [Vector3; 16], pub m_highlightFunctionBits: [i32; 8], pub m_highlightPlayerVisibilityBits: [i32; 8], pub m_highlightServerFadeBases: [f32; 2], pub m_highlightServerFadeStartTimes: [f32; 2], pub m_highlightServerFadeEndTimes: [f32; 2], pub m_highlightServerContextID: i32, pub m_highlightTeamBits: i32, pub m_nextGrenadeTargetTime: f32, pub m_grenadeTargetDebounce: f32, pub m_nSimulationTick: i32, pub m_fDataObjectTypes: i32, pub m_nextVelocitySample: f32, pub m_velocitySamples: [Vector3; 5], pub m_iEFlags: i64, pub m_fFlags: i32, pub gap_29c: [c_char; 4],
128 pub m_iName: i64, pub m_scriptNameIndex: i32, pub m_instanceNameIndex: i32, pub m_scriptName: [c_char; 64], pub m_instanceName: [c_char; 64], pub m_holdUsePrompt: i64, pub m_pressUsePrompt: i64, pub m_attachmentLerpStartTime: f32, pub m_attachmentLerpEndTime: f32, pub m_attachmentLerpStartOrigin: Vector3, pub m_attachmentLerpStartAngles: Vector3, pub m_parentAttachmentType: i32, pub m_parentAttachmentIndex: i32, pub m_parentAttachmentHitbox: i32, pub m_parentAttachmentModel: i32, pub m_MoveType: c_char, pub m_MoveCollide: c_char, pub gap_372: [c_char; 2],
146 pub m_RestoreMoveTypeOnDetach: i32, pub m_hMoveParent: EHandle, pub m_hMoveChild: EHandle, pub m_hMovePeer: EHandle, pub m_bIsActiveChild: bool, pub m_bPrevAbsOriginValid: bool, pub gap_386: [c_char; 2],
153 pub m_Collision: CCollisionProperty, pub m_hOwnerEntity: EHandle, pub m_CollisionGroup: i32, pub m_contents: i32, pub m_baseSolidType: i32, pub m_pPhysicsObject: *mut c_void, pub m_flNavIgnoreUntilTime: f32, pub m_hGroundEntity: EHandle, pub m_flGroundChangeTime: f32, pub m_vecBaseVelocity: Vector3, pub m_vecAbsVelocity: Vector3, pub m_vecAngVelocity: Vector3, pub m_rgflCoordinateFrame: [f32; 12], pub m_flFriction: f32, pub m_flLocalTime: f32, pub m_flVPhysicsUpdateLocalTime: f32, pub m_flMoveDoneTime: f32, pub m_nPushEnumCount: i32, pub m_vecPrevAbsOrigin: Vector3, pub m_vecAbsOrigin: Vector3, pub m_angAbsRotation: Vector3, pub m_vecVelocity: Vector3, pub m_pBlocker: EHandle, pub m_iGlobalname: i64, pub m_iParent: i64, pub m_iHammerID: i32, pub m_flSpeed: f32, pub m_iMaxHealth: i32, pub m_iHealth: i32, pub m_pfnTouch: *mut c_void, pub m_pfnUse: *mut c_void, pub m_pfnBlocked: *mut c_void, pub m_bClientSideRagdoll: bool, pub m_lifeState: c_char, pub m_forceVisibleInPhaseShift: bool, pub m_baseTakeDamage: c_char, pub m_invulnerableToDamageCount: i32, pub m_passDamageToParent: c_char, pub gap_4f9: [c_char; 3],
192 pub m_deathVelocity: Vector3, pub m_lastTitanFootstepDamageTime: f32, pub m_flMaxspeed: f32, pub m_visibilityFlags: i32, pub m_scriptVisible: bool, pub gap_515: [c_char; 3],
198 pub m_OnUser1: [c_char; 40], pub m_OnDeath: [c_char; 40], pub m_OnDestroy: [c_char; 40], pub m_cellwidth: i32, pub m_cellbits: i32, pub m_cellX: i32, pub m_cellY: i32, pub m_cellZ: i32, pub m_localOrigin: Vector3, pub m_localAngles: Vector3, pub m_vecViewOffset: Vector3, pub m_ListByClass: i32, pub gap_5cc: [c_char; 4],
211 pub m_pPrevByClass: *mut c_void, pub m_pNextByClass: *mut c_void, pub m_iInitialTeamNum: i32, pub m_iTeamNum: i32, pub m_passThroughFlags: i32, pub m_passThroughThickness: i32, pub m_passThroughDirection: f32, pub m_spawnflags: i32, pub m_AIAddOn: i64, pub m_flGravity: f32, pub m_entityFadeDist: f32, pub m_dissolveEffectEntityHandle: EHandle, pub m_fadeDist: f32, pub m_iSignifierName: i64, pub m_collectedInvalidateFlags: i32, pub m_collectingInvalidateFlags: bool, pub gap_61d: [c_char; 3],
228 pub m_lagCompensationCounter: i32, pub m_bLagCompensate: bool, pub m_bNetworkQuantizeOriginAndAngles: bool, pub m_bForcePurgeFixedupStrings: bool, pub gap_627: [c_char; 1],
233 pub m_pEvent: *mut c_void, pub m_debugOverlays: i32, pub gap_634: [c_char; 4],
236 pub m_pTimedOverlay: *mut c_void, pub m_ScriptScope: [c_char; 32], pub m_hScriptInstance: i64, pub m_iszScriptId: i64, pub m_bossPlayer: EHandle, pub m_usableType: i32, pub m_usablePriority: i32, pub m_usableRadius: f32, pub m_usableFOV: f32, pub m_usePromptSize: f32, pub m_hasDispatchedSpawn: bool, pub m_bDoDestroyCallback: bool, pub m_bDoPreSpawnCallback: bool, pub m_bDoOnSpawnedCallback: bool, pub m_spottedBeginTimes: [f32; 31], pub m_spottedLatestTimes: [f32; 31], pub m_spottedByTeams: i32, pub m_minimapData: [c_char; 40], pub m_shieldHealth: i32, pub m_shieldHealthMax: i32, pub m_areEntityLinksNetworked: bool, pub gap_7b9: [c_char; 3],
258 pub m_entitiesLinkedFromMeCount: i32, pub m_entitiesLinkedToMeCount: i32, pub m_entitiesLinkedFromMe: [EHandle; 64], pub m_entitiesLinkedToMe: [EHandle; 64], pub m_pusherWithChildrenRadius: f32, pub m_childPusherMoveHandlerCount: i32, pub gap_9cc: [c_char; 4],
265 pub m_statusEffectPlugin: *mut CBaseEntity, pub gap_9d8: [c_char; 1],
267 pub m_physDummyMotionEnabled: bool, }
269size_assert!(SIZE_BASE where CBaseEntity == 0x9E0);
270
271impl_vmethods! {
273 impl CBaseEntity {
274 pub fn some_get_origin_varient_02(vector: *mut Vector3) -> *mut Vector3 where offset(133);
275 pub fn some_get_origin_varient_01(vector: *mut Vector3) -> *mut Vector3 where offset(134);
276 pub fn eye_angles(vector: *mut Vector3) -> *mut Vector3 where offset(135);
277 pub fn get_angles(vector: *mut Vector3) -> *mut Vector3 where offset(136);
278 pub fn get_eye_position(vector: *mut Vector3) -> *mut Vector3 where offset(137);
279 pub fn get_center_position(vector: *mut Vector3) -> *mut Vector3 where offset(138);
280 pub fn get_origin(vector: *mut Vector3) -> *mut Vector3 where offset(139);
281 pub fn get_forward_vector(vector: *mut Vector3, unk1: *const c_void, unk2: *const c_void) -> () where offset(140);
282 }
283}
284
285impl DynamicCast<CPlayer> for CBaseEntity {
286 fn dynamic_cast(&self) -> Option<&CPlayer> {
287 crate::mid::server::ENTITY_CLASS_VTABLE
288 .get()
289 .filter(|vtable| std::ptr::addr_eq(vtable.cplayer, self.vftable))
290 .and_then(|_| unsafe { std::ptr::from_ref(self).cast::<CPlayer>().as_ref() })
291 }
292
293 fn dynamic_cast_mut(&mut self) -> Option<&mut CPlayer> {
294 crate::mid::server::ENTITY_CLASS_VTABLE
295 .get()
296 .filter(|vtable| std::ptr::addr_eq(vtable.cplayer, self.vftable))
297 .and_then(|_| unsafe { std::ptr::from_mut(self).cast::<CPlayer>().as_mut() })
298 }
299}
300
301impl DynamicCast<CWeaponX> for CBaseEntity {
302 fn dynamic_cast(&self) -> Option<&CWeaponX> {
303 crate::mid::server::ENTITY_CLASS_VTABLE
304 .get()
305 .filter(|vtable| std::ptr::addr_eq(vtable.weaponx, self.vftable))
306 .and_then(|_| unsafe { std::ptr::from_ref(self).cast::<CWeaponX>().as_ref() })
307 }
308
309 fn dynamic_cast_mut(&mut self) -> Option<&mut CWeaponX> {
310 crate::mid::server::ENTITY_CLASS_VTABLE
311 .get()
312 .filter(|vtable| std::ptr::addr_eq(vtable.weaponx, self.vftable))
313 .and_then(|_| unsafe { std::ptr::from_mut(self).cast::<CWeaponX>().as_mut() })
314 }
315}
316
317impl DynamicCast<CPlayerDecoy> for CBaseEntity {
318 fn dynamic_cast(&self) -> Option<&CPlayerDecoy> {
319 crate::mid::server::ENTITY_CLASS_VTABLE
320 .get()
321 .filter(|vtable| std::ptr::addr_eq(vtable.cplayerdecoy, self.vftable))
322 .and_then(|_| unsafe { std::ptr::from_ref(self).cast::<CPlayerDecoy>().as_ref() })
323 }
324
325 fn dynamic_cast_mut(&mut self) -> Option<&mut CPlayerDecoy> {
326 crate::mid::server::ENTITY_CLASS_VTABLE
327 .get()
328 .filter(|vtable| std::ptr::addr_eq(vtable.cplayerdecoy, self.vftable))
329 .and_then(|_| unsafe { std::ptr::from_mut(self).cast::<CPlayerDecoy>().as_mut() })
330 }
331}