i working a npc extension in css using CEntity, used alot scaned function , virtual function. And CEntity can't find some data member, like "m_pStudioHdr"
i already rewrite CAI_BaseNPC, CBaseHeadcrab, CHeadcrab
i can successful spawn npc_headcrab, but the AI/Schedules doesn't work
the following code use alot CAI_BaseNPC static pointer, like gm_SquadSlotNamespace and so on. It very hard to access...
i have "done" DECLARE_ACTIVITY, DECLARE_ANIMEVENT
if someone interest to try make it work, i can upload source code
Code:
//-----------------------------------------------------------------------------
//
// Schedules
//
//-----------------------------------------------------------------------------
AI_BEGIN_CUSTOM_NPC( npc_headcrab, CBaseHeadcrab )
DECLARE_TASK( TASK_HEADCRAB_HOP_ASIDE )
DECLARE_TASK( TASK_HEADCRAB_DROWN )
DECLARE_TASK( TASK_HEADCRAB_HOP_OFF_NPC )
DECLARE_TASK( TASK_HEADCRAB_WAIT_FOR_BARNACLE_KILL )
DECLARE_TASK( TASK_HEADCRAB_UNHIDE )
DECLARE_TASK( TASK_HEADCRAB_HARASS_HOP )
DECLARE_TASK( TASK_HEADCRAB_BURROW )
DECLARE_TASK( TASK_HEADCRAB_UNBURROW )
DECLARE_TASK( TASK_HEADCRAB_FIND_BURROW_IN_POINT )
DECLARE_TASK( TASK_HEADCRAB_BURROW_WAIT )
DECLARE_TASK( TASK_HEADCRAB_CHECK_FOR_UNBURROW )
DECLARE_TASK( TASK_HEADCRAB_JUMP_FROM_CANISTER )
DECLARE_TASK( TASK_HEADCRAB_CLIMB_FROM_CANISTER )
DECLARE_TASK( TASK_HEADCRAB_CEILING_POSITION )
DECLARE_TASK( TASK_HEADCRAB_CEILING_WAIT )
DECLARE_TASK( TASK_HEADCRAB_CEILING_DETACH )
DECLARE_TASK( TASK_HEADCRAB_CEILING_FALL )
DECLARE_TASK( TASK_HEADCRAB_CEILING_LAND )
DECLARE_ACTIVITY( ACT_HEADCRAB_THREAT_DISPLAY )
DECLARE_ACTIVITY( ACT_HEADCRAB_HOP_LEFT )
DECLARE_ACTIVITY( ACT_HEADCRAB_HOP_RIGHT )
DECLARE_ACTIVITY( ACT_HEADCRAB_DROWN )
DECLARE_ACTIVITY( ACT_HEADCRAB_BURROW_IN )
DECLARE_ACTIVITY( ACT_HEADCRAB_BURROW_OUT )
DECLARE_ACTIVITY( ACT_HEADCRAB_BURROW_IDLE )
DECLARE_ACTIVITY( ACT_HEADCRAB_CRAWL_FROM_CANISTER_LEFT )
DECLARE_ACTIVITY( ACT_HEADCRAB_CRAWL_FROM_CANISTER_CENTER )
DECLARE_ACTIVITY( ACT_HEADCRAB_CRAWL_FROM_CANISTER_RIGHT )
DECLARE_ACTIVITY( ACT_HEADCRAB_CEILING_FALL )
DECLARE_ACTIVITY( ACT_HEADCRAB_CEILING_IDLE )
DECLARE_ACTIVITY( ACT_HEADCRAB_CEILING_DETACH )
DECLARE_ACTIVITY( ACT_HEADCRAB_CEILING_LAND )
DECLARE_CONDITION( COND_HEADCRAB_IN_WATER )
DECLARE_CONDITION( COND_HEADCRAB_ILLEGAL_GROUNDENT )
DECLARE_CONDITION( COND_HEADCRAB_BARNACLED )
DECLARE_CONDITION( COND_HEADCRAB_UNHIDE )
//Adrian: events go here
DECLARE_ANIMEVENT( AE_HEADCRAB_JUMPATTACK )
DECLARE_ANIMEVENT( AE_HEADCRAB_JUMP_TELEGRAPH )
DECLARE_ANIMEVENT( AE_HEADCRAB_BURROW_IN )
DECLARE_ANIMEVENT( AE_HEADCRAB_BURROW_IN_FINISH )
DECLARE_ANIMEVENT( AE_HEADCRAB_BURROW_OUT )
DECLARE_ANIMEVENT( AE_HEADCRAB_CEILING_DETACH )
//=========================================================
// > SCHED_HEADCRAB_RANGE_ATTACK1
//=========================================================
DEFINE_SCHEDULE
(
SCHED_HEADCRAB_RANGE_ATTACK1,
" Tasks"
" TASK_STOP_MOVING 0"
" TASK_FACE_ENEMY 0"
" TASK_RANGE_ATTACK1 0"
" TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE"
" TASK_FACE_IDEAL 0"
" TASK_WAIT_RANDOM 0.5"
""
" Interrupts"
" COND_ENEMY_OCCLUDED"
" COND_NO_PRIMARY_AMMO"
)
//=========================================================
//
//=========================================================
DEFINE_SCHEDULE
(
SCHED_HEADCRAB_WAKE_ANGRY,
" Tasks"
" TASK_STOP_MOVING 0"
" TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE "
" TASK_FACE_IDEAL 0"
" TASK_SOUND_WAKE 0"
" TASK_PLAY_SEQUENCE_FACE_ENEMY ACTIVITY:ACT_HEADCRAB_THREAT_DISPLAY"
""
" Interrupts"
)
//=========================================================
//
//=========================================================
DEFINE_SCHEDULE
(
SCHED_HEADCRAB_WAKE_ANGRY_NO_DISPLAY,
" Tasks"
" TASK_STOP_MOVING 0"
" TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE "
" TASK_FACE_IDEAL 0"
" TASK_SOUND_WAKE 0"
" TASK_FACE_ENEMY 0"
""
" Interrupts"
)
//=========================================================
// > SCHED_FAST_HEADCRAB_RANGE_ATTACK1
//=========================================================
DEFINE_SCHEDULE
(
SCHED_FAST_HEADCRAB_RANGE_ATTACK1,
" Tasks"
" TASK_STOP_MOVING 0"
" TASK_FACE_ENEMY 0"
" TASK_RANGE_ATTACK1 0"
" TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE"
" TASK_FACE_IDEAL 0"
" TASK_WAIT_RANDOM 0.5"
""
" Interrupts"
)
//=========================================================
// The irreversible process of drowning
//=========================================================
DEFINE_SCHEDULE
(
SCHED_HEADCRAB_DROWN,
" Tasks"
" TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_HEADCRAB_FAIL_DROWN"
" TASK_SET_ACTIVITY ACTIVITY:ACT_HEADCRAB_DROWN"
" TASK_HEADCRAB_DROWN 0"
""
" Interrupts"
)
DEFINE_SCHEDULE
(
SCHED_HEADCRAB_FAIL_DROWN,
" Tasks"
" TASK_HEADCRAB_DROWN 0"
""
" Interrupts"
)
//=========================================================
// Headcrab lurks in place and waits for a chance to jump on
// some unfortunate soul.
//=========================================================
DEFINE_SCHEDULE
(
SCHED_HEADCRAB_AMBUSH,
" Tasks"
" TASK_STOP_MOVING 0"
" TASK_SET_ACTIVITY ACTIVITY:ACT_IDLE"
" TASK_WAIT_INDEFINITE 0"
" Interrupts"
" COND_SEE_ENEMY"
" COND_SEE_HATE"
" COND_CAN_RANGE_ATTACK1"
" COND_LIGHT_DAMAGE"
" COND_HEAVY_DAMAGE"
" COND_PROVOKED"
)
//=========================================================
// Headcrab has landed atop another NPC or has landed on
// a ledge. Get down!
//=========================================================
DEFINE_SCHEDULE
(
SCHED_HEADCRAB_HOP_RANDOMLY,
" Tasks"
" TASK_STOP_MOVING 0"
" TASK_HEADCRAB_HOP_OFF_NPC 0"
" Interrupts"
)
//=========================================================
// Headcrab is in the clutches of a barnacle
//=========================================================
DEFINE_SCHEDULE
(
SCHED_HEADCRAB_BARNACLED,
" Tasks"
" TASK_STOP_MOVING 0"
" TASK_SET_ACTIVITY ACTIVITY:ACT_HEADCRAB_DROWN"
" TASK_HEADCRAB_WAIT_FOR_BARNACLE_KILL 0"
" Interrupts"
)
//=========================================================
// Headcrab is unhiding
//=========================================================
DEFINE_SCHEDULE
(
SCHED_HEADCRAB_UNHIDE,
" Tasks"
" TASK_HEADCRAB_UNHIDE 0"
" Interrupts"
)
DEFINE_SCHEDULE
(
SCHED_HEADCRAB_HARASS_ENEMY,
" Tasks"
" TASK_FACE_ENEMY 0"
" TASK_HEADCRAB_HARASS_HOP 0"
" TASK_WAIT_FACE_ENEMY 1"
" TASK_SET_ROUTE_SEARCH_TIME 2" // Spend 2 seconds trying to build a path if stuck
" TASK_GET_PATH_TO_RANDOM_NODE 300"
" TASK_WALK_PATH 0"
" TASK_WAIT_FOR_MOVEMENT 0"
" Interrupts"
" COND_NEW_ENEMY"
)
DEFINE_SCHEDULE
(
SCHED_HEADCRAB_FALL_TO_GROUND,
" Tasks"
" TASK_SET_ACTIVITY ACTIVITY:ACT_HEADCRAB_DROWN"
" TASK_FALL_TO_GROUND 0"
""
" Interrupts"
)
DEFINE_SCHEDULE
(
SCHED_HEADCRAB_CRAWL_FROM_CANISTER,
" Tasks"
" TASK_HEADCRAB_CLIMB_FROM_CANISTER 0"
" TASK_HEADCRAB_JUMP_FROM_CANISTER 0"
""
" Interrupts"
)
//==================================================
// Burrow In
//==================================================
DEFINE_SCHEDULE
(
SCHED_HEADCRAB_BURROW_IN,
" Tasks"
" TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_CHASE_ENEMY_FAILED"
" TASK_HEADCRAB_BURROW 0"
" TASK_PLAY_SEQUENCE ACTIVITY:ACT_HEADCRAB_BURROW_IN"
" TASK_PLAY_SEQUENCE ACTIVITY:ACT_HEADCRAB_BURROW_IDLE"
" TASK_SET_SCHEDULE SCHEDULE:SCHED_HEADCRAB_BURROW_WAIT"
""
" Interrupts"
" COND_TASK_FAILED"
)
//==================================================
// Run to a nearby burrow hint and burrow there
//==================================================
DEFINE_SCHEDULE
(
SCHED_HEADCRAB_RUN_TO_BURROW_IN,
" Tasks"
" TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_CHASE_ENEMY_FAILED"
" TASK_HEADCRAB_FIND_BURROW_IN_POINT 512"
" TASK_SET_TOLERANCE_DISTANCE 8"
" TASK_RUN_PATH 0"
" TASK_WAIT_FOR_MOVEMENT 0"
" TASK_SET_SCHEDULE SCHEDULE:SCHED_HEADCRAB_BURROW_IN"
""
" Interrupts"
" COND_TASK_FAILED"
" COND_GIVE_WAY"
" COND_CAN_RANGE_ATTACK1"
)
//==================================================
// Run to m_pHintNode and burrow there
//==================================================
DEFINE_SCHEDULE
(
SCHED_HEADCRAB_RUN_TO_SPECIFIC_BURROW,
" Tasks"
" TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_CHASE_ENEMY_FAILED"
" TASK_SET_TOLERANCE_DISTANCE 8"
" TASK_GET_PATH_TO_HINTNODE 0"
" TASK_RUN_PATH 0"
" TASK_WAIT_FOR_MOVEMENT 0"
" TASK_SET_SCHEDULE SCHEDULE:SCHED_HEADCRAB_BURROW_IN"
""
" Interrupts"
" COND_TASK_FAILED"
" COND_GIVE_WAY"
)
//==================================================
// Wait until we can unburrow and attack something
//==================================================
DEFINE_SCHEDULE
(
SCHED_HEADCRAB_BURROW_WAIT,
" Tasks"
" TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_HEADCRAB_BURROW_WAIT"
" TASK_HEADCRAB_BURROW_WAIT 1"
""
" Interrupts"
" COND_TASK_FAILED"
" COND_NEW_ENEMY" // HACK: We don't actually choose a new schedule on new enemy, but
// we need this interrupt so that the headcrab actually acquires
// new enemies while burrowed. (look in ai_basenpc.cpp for "DO NOT mess")
" COND_CAN_RANGE_ATTACK1"
)
//==================================================
// Burrow Out
//==================================================
DEFINE_SCHEDULE
(
SCHED_HEADCRAB_BURROW_OUT,
" Tasks"
" TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_HEADCRAB_BURROW_WAIT"
" TASK_HEADCRAB_UNBURROW 0"
" TASK_PLAY_SEQUENCE ACTIVITY:ACT_HEADCRAB_BURROW_OUT"
""
" Interrupts"
" COND_TASK_FAILED"
)
//==================================================
// Wait for it to be clear for unburrowing
//==================================================
DEFINE_SCHEDULE
(
SCHED_HEADCRAB_WAIT_FOR_CLEAR_UNBURROW,
" Tasks"
" TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_HEADCRAB_BURROW_WAIT"
" TASK_HEADCRAB_CHECK_FOR_UNBURROW 1"
" TASK_SET_SCHEDULE SCHEDULE:SCHED_HEADCRAB_BURROW_OUT"
""
" Interrupts"
" COND_TASK_FAILED"
)
//==================================================
// Wait until we can drop.
//==================================================
DEFINE_SCHEDULE
(
SCHED_HEADCRAB_CEILING_WAIT,
" Tasks"
" TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_HEADCRAB_CEILING_DROP"
" TASK_SET_ACTIVITY ACTIVITY:ACT_HEADCRAB_CEILING_IDLE"
" TASK_HEADCRAB_CEILING_POSITION 0"
" TASK_HEADCRAB_CEILING_WAIT 1"
""
" Interrupts"
" COND_TASK_FAILED"
" COND_NEW_ENEMY"
" COND_CAN_RANGE_ATTACK1"
)
//==================================================
// Deatch from ceiling.
//==================================================
DEFINE_SCHEDULE
(
SCHED_HEADCRAB_CEILING_DROP,
" Tasks"
" TASK_SET_FAIL_SCHEDULE SCHEDULE:SCHED_HEADCRAB_CEILING_WAIT"
" TASK_HEADCRAB_CEILING_DETACH 0"
" TASK_HEADCRAB_CEILING_FALL 0"
" TASK_HEADCRAB_CEILING_LAND 0"
""
" Interrupts"
" COND_TASK_FAILED"
)
AI_END_CUSTOM_NPC()