added new functions

This commit is contained in:
Lukasz Wlasinksi 2005-05-31 13:56:15 +00:00
parent 959a5b9225
commit 1cc60fc9ad
9 changed files with 759 additions and 41 deletions

View File

@ -79,3 +79,75 @@ void CPlayer::getTeamName(char * szName ){
szName[i] = *( (char*)pEdict->pvPrivateData + STEAM_PDOFFSET_TEAMNAME + i ); szName[i] = *( (char*)pEdict->pvPrivateData + STEAM_PDOFFSET_TEAMNAME + i );
} }
} }
void CObjective::SetKeyValue( int index, char *keyname, char *value ){
KeyValueData pkvd;
pkvd.szClassName = (char *)STRING(obj[index].pEdict->v.classname);
pkvd.szKeyName = keyname; // type
pkvd.szValue = value;
pkvd.fHandled = false;
MDLL_KeyValue(obj[index].pEdict, &pkvd);
}
void CObjective::InitObj(int dest , edict_t* ed ){
MESSAGE_BEGIN( dest, gmsgInitObj,0,ed );
WRITE_BYTE( count );
for ( int i=0; i<count; i++ ){
WRITE_SHORT(ENTINDEX(obj[i].pEdict));
WRITE_BYTE( obj[i].index );
WRITE_BYTE( obj[i].owner );
WRITE_BYTE( obj[i].visible );
WRITE_BYTE( obj[i].icon_neutral );
WRITE_BYTE( obj[i].icon_allies );
WRITE_BYTE( obj[i].icon_axis );
WRITE_COORD( obj[i].origin_x );
WRITE_COORD( obj[i].origin_y );
}
MESSAGE_END();
}
void CObjective::SetObj(int index){
MESSAGE_BEGIN(MSG_ALL,gmsgSetObj);
WRITE_BYTE(obj[index].index);
WRITE_BYTE(obj[index].owner);
WRITE_BYTE(0);
MESSAGE_END();
}
void CObjective::UpdateOwner(int index, int team){
obj[index].owner = team;
GET_CP_PD(obj[index].pEdict).owner = team;
switch ( team ){
case 0:
obj[index].pEdict->v.model = MAKE_STRING( GET_CP_PD(obj[index].pEdict).model_neutral );
obj[index].pEdict->v.body = GET_CP_PD(obj[index].pEdict).model_body_neutral;
break;
case 1:
obj[index].pEdict->v.model = MAKE_STRING( GET_CP_PD(obj[index].pEdict).model_allies );
obj[index].pEdict->v.body = GET_CP_PD(obj[index].pEdict).model_body_allies;
break;
case 2:
obj[index].pEdict->v.model = MAKE_STRING( GET_CP_PD(obj[index].pEdict).model_axis );
obj[index].pEdict->v.body = GET_CP_PD(obj[index].pEdict).model_body_axis;
break;
}
mObjects.SetObj(index);
}
void CObjective::Sort(){
objinfo_t temp;
for (int j=0;j<count-1;j++ ){
for (int i=0;i<count-1;i++ ){
if ( obj[i].index > obj[i+1].index ){
temp = obj[i+1];
obj[i+1] = obj[i];
obj[i] = temp;
}
}
}
}

View File

@ -33,19 +33,162 @@
#define CMISC_H #define CMISC_H
#ifndef __linux__ #ifndef __linux__
#define LINUXOFFSET 0 #define LINUXOFFSET 0
#else #else
#define LINUXOFFSET 5 #define LINUXOFFSET 5
#endif #endif
#define DODFUN_VERSION "0.1" #define DODFUN_VERSION "1.0.2"
#define STEAM_PDOFFSET_WDEPLOY 229 + LINUXOFFSET // weapon deploy // DoD Player
#define STEAM_PDOFFSET_WDEPLOY 229 + LINUXOFFSET // weapon deploy
#define STEAM_PDOFFSET_TEAMNAME 1396 + (LINUXOFFSET * sizeof(char)) // team name 349 char[16]
#define STEAM_PDOFFSET_CLASS 366 + LINUXOFFSET // player class #define STEAM_PDOFFSET_CLASS 366 + LINUXOFFSET // player class
#define STEAM_PDOFFSET_RCLASS 367 + LINUXOFFSET // random class #define STEAM_PDOFFSET_RCLASS 367 + LINUXOFFSET // random class
#define STEAM_PDOFFSET_SCORE 475 + LINUXOFFSET // score #define STEAM_PDOFFSET_SCORE 475 + LINUXOFFSET // score
#define STEAM_PDOFFSET_DEATHS 476 + LINUXOFFSET // deaths #define STEAM_PDOFFSET_DEATHS 476 + LINUXOFFSET // deaths
#define STEAM_PDOFFSET_TEAMNAME 1396 + LINUXOFFSET // team name
// DoD Control Point
struct pd_dcp {
int iunk_0;
#ifndef __linux__
int iunk_1; // windows only
#endif
int iunk_2; // pointer edict_t*
int iunk_3;
float origin_x;
float origin_y;
float origin_z; // 6
float mins_x;
float mins_y;
float mins_z;
float maxs_x;
float maxs_y;
float maxs_z;
float angles_x;
float angles_y;
float angles_z; // 15
// 19 - spawnflags ?
// 20-int , always 1
int unknown_block1[19];
int iunk_35; // pointer entvars_t*
int iunk_36; // pointer entvars_t*
int unknown_block2[52];
int iunk_89; // pointer entvars_t*
#ifdef __linux__
int iunk_extra1;
int iunk_extra2;
int iunk_extra3;
int iunk_extra4;
#endif
int owner; // 90
int iunk_91;
int iunk_92;
int default_owner; // 93
int flag_id;
int pointvalue;
int points_for_player;
int points_for_team;
float funk_98; // always 1.0
float cap_time;
char win_string[256]; // 100 MAP_PLAYER_CAP , %p player , %n pointname , %t teamname
int iunk_164;
int iunk_165;
char target_allies[256]; // 166
char target_axis[256]; // 230
char target_reset[256];
char model_allies[256]; // 358
char model_axis[256]; // 422
char model_neutral[256]; // 486
int model_body_allies; // 550
int model_body_axis;
int model_body_neutral;
int icon_allies;
int icon_axis;
int icon_neutral;
int can_touch; // flags : 1-allies can't, 256-axis can't , default 0 (all can)
int iunk_557;
int iunk_558; // ? -2 , 4
char pointgroup[256];
int iunk_623;
int iunk_624;
int iunk_625;
};
#define GET_CP_PD( x ) (*(pd_dcp*)x->pvPrivateData)
// DoD Capture Area
struct pd_dca {
int iunk_0;
int iunk_1;
int iunk_2;
#ifndef __linux__
int iunk_3; // if def windows
#endif
float origin_x;
float origin_y;
float origin_z; // 6
float mins_x;
float mins_y;
float mins_z;
float maxs_x;
float maxs_y;
float maxs_z;
float angles_x;
float angles_y;
float angles_z; // 15
// 16-135
#ifndef __linux__
int unknown_block_16[111];
#else
int unknown_block_16[116]; // linux +5 more
#endif
int time_to_cap; // 127
int iunk_128;
int allies_numcap; // 129
int axis_numcap; // 130
int iunk_131;
int iunk_132;
int can_cap; // 133 flags : 1-allies can , 256-axis can, default 257 (all can)
int iunk_134;
int iunk_135;
char allies_endcap[256]; // 136
char axis_endcap[256]; // 200
char allies_startcap[256]; // 264
char axis_startcap[256]; // 328
char allies_breakcap[256]; // 392
char axis_breakcap[256]; // 456
int iunk_520; // -1 allies area, blowable (charlie) ??
char hud_sprite[256]; // 521
// 585 - 649
int unknown_block_585[65];
char object_group[256]; // 650
int iunk_714;
int iunk_715;
int iunk_716;
// 717 size
};
#define GET_CA_PD( x ) (*(pd_dca*)x->pvPrivateData)
/* DoD weapons */ /* DoD weapons */
enum { enum {
@ -99,7 +242,7 @@ public:
bool staminaSet; bool staminaSet;
bool fuseSet; bool fuseSet;
int fuseType; // 1<<0 - for new , 1<<1 - for catched int fuseType; // 1<<0 - for new , 1<<1 - for cought
float nadeFuse; float nadeFuse;
bool ingame; bool ingame;
@ -122,7 +265,84 @@ public:
} }
}; };
typedef struct objinfo_s {
// initobj
edict_t* pEdict;
int index;
int default_owner;
int visible;
int icon_neutral;
int icon_allies;
int icon_axis;
float origin_x;
float origin_y;
// setobj
int owner;
// control area
int areaflags; // 0-need check , 1-no area , 2-found area
edict_t* pAreaEdict;
} objinfo_t;
class CObjective {
public:
int count;
objinfo_t obj[12];
inline void Clear() { count = 0; memset(obj,0,sizeof(objinfo_s)); }
void SetKeyValue( int index, char *keyname, char *value );
void InitObj(int dest = MSG_ALL , edict_t* ed = NULL);
void SetObj(int index);
void UpdateOwner( int index, int team );
void Sort();
};
enum CP_VALUE {
CP_edict = 1,
CP_area,
CP_index,
CP_owner,
CP_default_owner,
CP_visible,
CP_icon_neutral,
CP_icon_allies,
CP_icon_axis,
CP_origin_x,
CP_origin_y,
CP_can_touch,
CP_pointvalue,
CP_points_for_cap,
CP_team_points,
CP_model_body_neutral,
CP_model_body_allies,
CP_model_body_axis,
// strings
CP_name,
CP_reset_capsound,
CP_allies_capsound,
CP_axis_capsound,
CP_targetname,
CP_model_neutral,
CP_model_allies,
CP_model_axis,
};
enum CA_VALUE {
CA_edict = 1,
CA_allies_numcap,
CA_axis_numcap,
CA_timetocap,
CA_can_cap,
// strings
CA_target,
CA_sprite,
};
#endif // CMISC_H #endif // CMISC_H

View File

@ -41,7 +41,6 @@ static cell AMX_NATIVE_CALL set_user_class(AMX *amx, cell *params){
if ( !pPlayer->ingame ) if ( !pPlayer->ingame )
return 0; return 0;
if (iClass){ if (iClass){
*( (int*)pPlayer->pEdict->pvPrivateData + STEAM_PDOFFSET_CLASS) = iClass; *( (int*)pPlayer->pEdict->pvPrivateData + STEAM_PDOFFSET_CLASS) = iClass;
*( (int*)pPlayer->pEdict->pvPrivateData + STEAM_PDOFFSET_RCLASS) = 0; // disable random class *( (int*)pPlayer->pEdict->pvPrivateData + STEAM_PDOFFSET_RCLASS) = 0; // disable random class
@ -439,34 +438,294 @@ static cell AMX_NATIVE_CALL get_user_ammo(AMX *amx, cell *params){
return 1; return 1;
} }
static cell AMX_NATIVE_CALL objective_set_data(AMX *amx, cell *params){ // index, key, ivalue , szvalue
static cell AMX_NATIVE_CALL test_pd(AMX *amx, cell *params){
int index = params[1]; int index = params[1];
CHECK_PLAYER(index); if ( index < 0 || index > mObjects.count ){
int type = params[2]; MF_LogError(amx, AMX_ERR_NATIVE, "Index out of range (%d)", index);
CPlayer* pPlayer = GET_PLAYER_POINTER_I(index); return 0;
if (pPlayer->ingame){
int i;
FILE *bp = fopen("pdtest.txt","at");
for ( i=1;i<1000;i++ ){
switch(type){
case 0: fprintf(bp,"%d %d\n",i,*( (int*)pPlayer->pEdict->pvPrivateData + i));
break;
case 1: fprintf(bp,"%d %f\n",i,*( (float*)pPlayer->pEdict->pvPrivateData + i));
break;
case 2:
fprintf(bp,"%d %c\n",i+1000,*( (char*)pPlayer->pEdict->pvPrivateData + i + 1000));
break;
//MF_PrintSrvConsole("",*( (int*)pPlayer->pEdict->pvPrivateData + i) );
}
}
fclose(bp);
} }
return 0;
edict_t *pent = mObjects.obj[index].pEdict;
int iLen;
int ivalue = params[3];
char *szValue = MF_GetAmxString(amx, params[4], 0, &iLen);
CP_VALUE key = (CP_VALUE)params[2];
switch ( key ){
case CP_owner :
mObjects.UpdateOwner( index, ivalue );
return 1;
case CP_default_owner :
mObjects.obj[index].default_owner = ivalue;
GET_CP_PD(pent).default_owner = ivalue;
return 1;
case CP_visible :
mObjects.obj[index].visible = ivalue;
mObjects.obj[index].pEdict->v.spawnflags = 1 - ivalue;
return 1;
case CP_icon_neutral :
mObjects.obj[index].icon_neutral = ivalue;
GET_CP_PD(pent).icon_neutral = ivalue;
return 1;
case CP_icon_allies :
mObjects.obj[index].icon_allies = ivalue;
GET_CP_PD(pent).icon_allies = ivalue;
return 1;
case CP_icon_axis :
mObjects.obj[index].icon_axis = ivalue;
GET_CP_PD(pent).icon_axis = ivalue;
return 1;
case CP_origin_x :
mObjects.obj[index].origin_x = (float)ivalue;
// reinit
return 1;
case CP_origin_y :
mObjects.obj[index].origin_y = (float)ivalue;
// reinit
return 1;
case CP_can_touch :
GET_CP_PD(pent).can_touch = ivalue;
return 1;
case CP_pointvalue :
GET_CP_PD(pent).pointvalue = ivalue;
return 1;
case CP_points_for_cap :
GET_CP_PD(pent).points_for_player = ivalue;
return 1;
case CP_team_points :
GET_CP_PD(pent).points_for_team = ivalue;
return 1;
case CP_model_body_neutral :
GET_CP_PD(pent).model_body_neutral = ivalue;
return 1;
case CP_model_body_allies :
GET_CP_PD(pent).model_body_axis = ivalue;
return 1;
case CP_model_body_axis :
GET_CP_PD(pent).model_body_axis = ivalue;
return 1;
// Strings
case CP_name :
mObjects.obj[index].pEdict->v.netname = MAKE_STRING(szValue);
return 1;
case CP_reset_capsound :
mObjects.obj[index].pEdict->v.noise = MAKE_STRING(szValue);
return 1;
case CP_allies_capsound :
mObjects.obj[index].pEdict->v.noise1 = MAKE_STRING(szValue);
return 1;
case CP_axis_capsound :
mObjects.obj[index].pEdict->v.noise2 = MAKE_STRING(szValue);
return 1;
case CP_targetname :
mObjects.obj[index].pEdict->v.targetname = MAKE_STRING(szValue);
return 1;
case CP_model_neutral :
strcpy(GET_CP_PD(pent).model_neutral,szValue);
return 1;
case CP_model_allies :
strcpy(GET_CP_PD(pent).model_allies,szValue);
return 1;
case CP_model_axis :
strcpy(GET_CP_PD(pent).model_axis,szValue);
return 1;
}
return 1;
}
static cell AMX_NATIVE_CALL objective_get_data(AMX *amx, cell *params){ // flagid, key, ivalue szvalue[],len=0
int index = params[1];
if ( index < 0 || index > mObjects.count ){
MF_LogError(amx, AMX_ERR_NATIVE, "Index out of range (%d)", index);
return 0;
}
int len = params[4];
CP_VALUE key = (CP_VALUE)params[2];
switch ( key ){
case CP_edict :
return ENTINDEX(mObjects.obj[index].pEdict);
case CP_area :
GET_CAPTURE_AREA(index)
return mObjects.obj[index].areaflags == 2 ? ENTINDEX(mObjects.obj[index].pAreaEdict) : 0;
case CP_owner :
return mObjects.obj[index].owner;
case CP_default_owner :
return mObjects.obj[index].default_owner;
case CP_visible :
return mObjects.obj[index].visible;
case CP_icon_neutral :
return mObjects.obj[index].icon_neutral;
case CP_icon_allies :
return mObjects.obj[index].icon_allies;
case CP_icon_axis :
return mObjects.obj[index].icon_axis;
case CP_origin_x :
return (int)mObjects.obj[index].origin_x;
case CP_origin_y :
return (int)mObjects.obj[index].origin_y;
case CP_can_touch :
return GET_CP_PD( mObjects.obj[index].pEdict ).can_touch;
case CP_pointvalue :
return GET_CP_PD( mObjects.obj[index].pEdict ).pointvalue;
case CP_points_for_cap :
return GET_CP_PD( mObjects.obj[index].pEdict ).points_for_player;
case CP_team_points :
return GET_CP_PD( mObjects.obj[index].pEdict ).points_for_team;
case CP_model_body_neutral :
return GET_CP_PD(mObjects.obj[index].pEdict).model_body_neutral;
case CP_model_body_allies :
return GET_CP_PD(mObjects.obj[index].pEdict).model_body_allies;
case CP_model_body_axis :
return GET_CP_PD(mObjects.obj[index].pEdict).model_body_axis;
// strings
case CP_name :
if ( len ){
MF_SetAmxString(amx,params[3],STRING(mObjects.obj[index].pEdict->v.netname),len);
}
return 1;
case CP_reset_capsound :
if ( len ){
MF_SetAmxString(amx,params[3],STRING(mObjects.obj[index].pEdict->v.noise),len);
}
return 1;
case CP_allies_capsound :
if ( len ){
MF_SetAmxString(amx,params[3],STRING(mObjects.obj[index].pEdict->v.noise1),len);
}
return 1;
case CP_axis_capsound :
if ( len ){
MF_SetAmxString(amx,params[3],STRING(mObjects.obj[index].pEdict->v.noise2),len);
}
return 1;
case CP_targetname :
if ( len ){
MF_SetAmxString(amx,params[3],STRING(mObjects.obj[index].pEdict->v.targetname),len);
}
return 1;
case CP_model_neutral :
if ( len ){
MF_SetAmxString(amx,params[3],GET_CP_PD(mObjects.obj[index].pEdict).model_neutral,len);
}
return 1;
case CP_model_allies :
if ( len ){
MF_SetAmxString(amx,params[3],GET_CP_PD(mObjects.obj[index].pEdict).model_allies,len);
}
return 1;
case CP_model_axis :
if ( len ){
MF_SetAmxString(amx,params[3],GET_CP_PD(mObjects.obj[index].pEdict).model_axis,len);
}
return 1;
}
return 1;
}
static cell AMX_NATIVE_CALL objectives_get_num(AMX *amx, cell *params){
return mObjects.count;
}
static cell AMX_NATIVE_CALL objectives_reinit(AMX *amx, cell *params){ // index
int player = params[1];
if ( player < 0 || player > gpGlobals->maxClients ){
MF_LogError(amx, AMX_ERR_NATIVE, "Index out of range (%d)", player);
return 0;
}
mObjects.InitObj( player == 0 ? MSG_ALL:MSG_ONE, player == 0 ? NULL:INDEXENT(player) );
return 1;
}
static cell AMX_NATIVE_CALL area_get_data(AMX *amx, cell *params){ // flagid, key, ivalue szvalue[],len=0
int index = params[1];
if ( index < 0 || index > mObjects.count ){
MF_LogError(amx, AMX_ERR_NATIVE, "Index out of range (%d)", index);
return 0;
}
int len = params[4];
CA_VALUE key = (CA_VALUE)params[2];
GET_CAPTURE_AREA(index)
switch ( key ){
case CA_edict :
return ENTINDEX(mObjects.obj[index].pAreaEdict);
case CA_allies_numcap :
return GET_CA_PD( mObjects.obj[index].pAreaEdict ).allies_numcap;
case CA_axis_numcap :
return GET_CA_PD( mObjects.obj[index].pAreaEdict ).axis_numcap;
case CA_timetocap :
return GET_CA_PD( mObjects.obj[index].pAreaEdict ).time_to_cap;
case CA_can_cap :
return GET_CA_PD( mObjects.obj[index].pAreaEdict ).can_cap;
// strings
case CA_target:
if ( len ){
MF_SetAmxString(amx,params[3],STRING(mObjects.obj[index].pAreaEdict->v.target),len);
}
return 1;
case CA_sprite:
if ( len ){
MF_SetAmxString(amx,params[3],GET_CA_PD(mObjects.obj[index].pAreaEdict).hud_sprite,len);
}
return 1;
}
return 1;
}
static cell AMX_NATIVE_CALL area_set_data(AMX *amx, cell *params){ // index, key, ivalue , szvalue
int index = params[1];
if ( index < 0 || index > mObjects.count ){
MF_LogError(amx, AMX_ERR_NATIVE, "Index out of range (%d)", index);
return 0;
}
int iLen;
int ivalue = params[3];
char *szValue = MF_GetAmxString(amx, params[4], 0, &iLen);
CA_VALUE key = (CA_VALUE)params[2];
GET_CAPTURE_AREA(index)
switch ( key ){
case CA_allies_numcap :
GET_CA_PD( mObjects.obj[index].pAreaEdict ).allies_numcap = ivalue;
return 1;
case CA_axis_numcap :
GET_CA_PD( mObjects.obj[index].pAreaEdict ).axis_numcap = ivalue;
return 1;
case CA_timetocap :
GET_CA_PD( mObjects.obj[index].pAreaEdict ).time_to_cap = ivalue;
return 1;
case CA_can_cap :
GET_CA_PD( mObjects.obj[index].pAreaEdict ).can_cap = ivalue;
return 1;
// strings
case CA_target:
mObjects.obj[index].pAreaEdict->v.target = MAKE_STRING(szValue);
return 1;
case CA_sprite:
strcpy(GET_CA_PD( mObjects.obj[index].pAreaEdict ).hud_sprite,szValue);
return 1;
}
return 1;
} }
AMX_NATIVE_INFO pd_Natives[] = { AMX_NATIVE_INFO pd_Natives[] = {
{ "dod_set_user_class", set_user_class }, { "dod_set_user_class", set_user_class },
{ "dod_set_user_team", set_user_team }, { "dod_set_user_team", set_user_team },
{ "dod_get_next_class", get_user_nextclass }, { "dod_get_next_class", get_user_nextclass },
@ -484,7 +743,12 @@ AMX_NATIVE_INFO pd_Natives[] = {
{ "dod_get_user_kills", get_user_frags }, { "dod_get_user_kills", get_user_frags },
{ "dod_set_user_kills", set_user_frags }, { "dod_set_user_kills", set_user_frags },
{ "dod_test_pd", test_pd }, { "objective_set_data", objective_set_data },
{ "objective_get_data", objective_get_data },
{ "objectives_get_num", objectives_get_num },
{ "objectives_reinit", objectives_reinit },
{ "area_set_data", area_set_data },
{ "area_get_data", area_get_data },
///******************* ///*******************
{ NULL, NULL } { NULL, NULL }
}; };

View File

@ -45,3 +45,4 @@ edict_t *FindEntityByClassname(edict_t *pentStart, const char *szName)
{ {
return FindEntityByString(pentStart, "classname", szName); return FindEntityByString(pentStart, "classname", szName);
} }

View File

@ -42,21 +42,30 @@ extern AMX_NATIVE_INFO base_Natives[];
extern AMX_NATIVE_INFO pd_Natives[]; extern AMX_NATIVE_INFO pd_Natives[];
extern int mState; extern int mState;
extern int mDest;
extern int mPlayerIndex; extern int mPlayerIndex;
void Client_CurWeapon(void*); void Client_CurWeapon(void*);
void Client_InitObj(void*);
void Client_SetObj(void*);
typedef void (*funEventCall)(void*); typedef void (*funEventCall)(void*);
extern int gmsgScoreShort; extern int gmsgScoreShort;
extern int gmsgPTeam; extern int gmsgPTeam;
extern int gmsgInitObj;
extern int gmsgSetObj;
extern int iFGrenade; extern int iFGrenade;
extern int iFInitCP;
extern CPlayer players[33]; extern CPlayer players[33];
extern CPlayer* mPlayer; extern CPlayer* mPlayer;
extern CObjective mObjects;
edict_t *FindEntityByClassname(edict_t *pentStart, const char *szName); edict_t *FindEntityByClassname(edict_t *pentStart, const char *szName);
edict_t *FindEntityByString(edict_t *pentStart, const char *szKeyword, const char *szValue);
#define CHECK_ENTITY(x) \ #define CHECK_ENTITY(x) \
if (x < 0 || x > gpGlobals->maxEntities) { \ if (x < 0 || x > gpGlobals->maxEntities) { \
@ -101,6 +110,20 @@ edict_t *FindEntityByClassname(edict_t *pentStart, const char *szName);
#define GETEDICT(n) \ #define GETEDICT(n) \
((n >= 1 && n <= gpGlobals->maxClients) ? MF_GetPlayerEdict(n) : INDEXENT(n)) ((n >= 1 && n <= gpGlobals->maxClients) ? MF_GetPlayerEdict(n) : INDEXENT(n))
#define GET_CAPTURE_AREA(x) \
if ( mObjects.obj[x].areaflags == 0 ){\
if ( (mObjects.obj[x].pAreaEdict = FindEntityByString(0,"target",STRING(mObjects.obj[x].pEdict->v.targetname)))\
&& (strcmp( STRING(mObjects.obj[x].pAreaEdict->v.classname),"dod_capture_area" )==0) ){\
mObjects.obj[x].areaflags = 2;\
}\
else{\
mObjects.obj[x].areaflags = 1;\
}\
}\
if ( mObjects.obj[x].areaflags == 1 )\
return 0;
#endif // DODFUN_H #endif // DODFUN_H

View File

@ -39,15 +39,20 @@ void (*endfunction)(void*);
CPlayer* mPlayer; CPlayer* mPlayer;
CPlayer players[33]; CPlayer players[33];
CObjective mObjects;
int mState; int mState;
int mDest;
int mPlayerIndex; int mPlayerIndex;
int iFGrenade; int iFGrenade;
int iFInitCP;
int gmsgCurWeapon; int gmsgCurWeapon;
int gmsgScoreShort; int gmsgScoreShort;
int gmsgPTeam; int gmsgPTeam;
int gmsgInitObj;
int gmsgSetObj;
struct sUserMsg { struct sUserMsg {
const char* name; const char* name;
@ -55,13 +60,15 @@ struct sUserMsg {
funEventCall func; funEventCall func;
bool endmsg; bool endmsg;
} g_user_msg[] = { } g_user_msg[] = {
{ "InitObj",&gmsgInitObj,Client_InitObj,false},
{ "CurWeapon",&gmsgCurWeapon,Client_CurWeapon,false }, { "CurWeapon",&gmsgCurWeapon,Client_CurWeapon,false },
{ "ScoreShort",&gmsgScoreShort,NULL,false }, { "ScoreShort",&gmsgScoreShort,NULL,false },
{ "PTeam",&gmsgPTeam,NULL,false }, { "PTeam",&gmsgPTeam,NULL,false },
{ "SetObj",&gmsgSetObj,Client_SetObj,false },
{ 0,0,0,false } { 0,0,0,false }
}; };
int RegUserMsg_Post(const char *pszName, int iSize){ int RegUserMsg_Post(const char *pszName, int iSize){
for (int i = 0; g_user_msg[ i ].name; ++i ){ for (int i = 0; g_user_msg[ i ].name; ++i ){
if ( !*g_user_msg[i].id && strcmp( g_user_msg[ i ].name , pszName ) == 0 ){ if ( !*g_user_msg[i].id && strcmp( g_user_msg[ i ].name , pszName ) == 0 ){
@ -148,6 +155,7 @@ void MessageBegin_Post(int msg_dest, int msg_type, const float *pOrigin, edict_t
mPlayer = NULL; mPlayer = NULL;
} }
mState = 0; mState = 0;
mDest = msg_dest;
if ( msg_type < 0 || msg_type >= MAX_REG_MSGS ) if ( msg_type < 0 || msg_type >= MAX_REG_MSGS )
msg_type = 0; msg_type = 0;
function=modMsgs[msg_type]; function=modMsgs[msg_type];
@ -230,7 +238,7 @@ void SetModel_Post(edict_t *e, const char *m){
e->v.dmgtime += pPlayer->nadeFuse - 5.0; e->v.dmgtime += pPlayer->nadeFuse - 5.0;
} }
} }
else{ // catched else{ // cought
bool ownNade = ( (pPlayer->pEdict->v.team == 1 && pPlayer->current == 16) || (pPlayer->pEdict->v.team == 2 && pPlayer->current == 15) ) ? true:false; bool ownNade = ( (pPlayer->pEdict->v.team == 1 && pPlayer->current == 16) || (pPlayer->pEdict->v.team == 2 && pPlayer->current == 15) ) ? true:false;
if ( ownNade ){ if ( ownNade ){
float fExp = e->v.dmgtime - gpGlobals->time; float fExp = e->v.dmgtime - gpGlobals->time;
@ -250,4 +258,5 @@ void OnAmxxAttach() {
void OnPluginsLoaded(){ void OnPluginsLoaded(){
iFGrenade = MF_RegisterForward("grenade_throw",ET_IGNORE,FP_CELL,FP_CELL,FP_CELL,FP_DONE); iFGrenade = MF_RegisterForward("grenade_throw",ET_IGNORE,FP_CELL,FP_CELL,FP_CELL,FP_DONE);
iFInitCP = MF_RegisterForward("controlpoints_init",ET_IGNORE,FP_DONE);
} }

View File

@ -5,7 +5,7 @@
// Module info // Module info
#define MODULE_NAME "DoD Fun" #define MODULE_NAME "DoD Fun"
#define MODULE_VERSION "1.01" #define MODULE_VERSION "1.02"
#define MODULE_AUTHOR "AMX Mod X Dev Team" #define MODULE_AUTHOR "AMX Mod X Dev Team"
#define MODULE_URL "http://www.amxmodx.org" #define MODULE_URL "http://www.amxmodx.org"
#define MODULE_LOGTAG "DODFUN" #define MODULE_LOGTAG "DODFUN"

View File

@ -1,6 +1,6 @@
/* /*
* dodfun * DoDFun
* Copyright (c) 2004 Lukasz Wlasinski * Copyright (c) 2004 £ukasz W³asiñski
* *
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
@ -28,6 +28,7 @@
* version. * version.
* *
*/ */
#include "amxxmodule.h" #include "amxxmodule.h"
#include "dodfun.h" #include "dodfun.h"
@ -46,4 +47,65 @@ void Client_CurWeapon(void* mValue){
} }
} }
void Client_InitObj(void* mValue){
static int num;
if ( mDest != MSG_ALL )
return;
switch (mState++){
case 0:
num = 0;
mObjects.count = *(int*)mValue;
if ( mObjects.count == 0 )
mObjects.Clear();
break;
case 1:
mObjects.obj[num].pEdict = INDEXENT(*(int*)mValue);
break;
case 2:
mObjects.obj[num].index = *(int*)mValue;
break;
case 3:
mObjects.obj[num].default_owner = *(int*)mValue;
mObjects.obj[num].owner = mObjects.obj[num].default_owner;
break;
case 4:
mObjects.obj[num].visible = *(int*)mValue;
break;
case 5:
mObjects.obj[num].icon_neutral = *(int*)mValue;
break;
case 6:
mObjects.obj[num].icon_allies = *(int*)mValue;
break;
case 7:
mObjects.obj[num].icon_axis = *(int*)mValue;
break;
case 8:
mObjects.obj[num].origin_x = *(float*)mValue;
break;
case 9: // 8,9 coord
mObjects.obj[num].origin_y = *(float*)mValue;
mState = 1;
num++;
if ( num == mObjects.count ){
mObjects.Sort();
MF_ExecuteForward( iFInitCP );
}
break;
}
}
void Client_SetObj(void* mValue){
static int id;
switch (mState++){
case 0:
id = *(int*)mValue;
break;
case 1:
mObjects.obj[id].owner = *(int*)mValue;
break;
}
}

View File

@ -1,6 +1,6 @@
/* DoDFun functions /* DoDFun functions
* *
* (c) 2004, SidLuke * (c) 2004-2005, SidLuke
* This file is provided as is (no warranties). * This file is provided as is (no warranties).
*/ */
@ -65,4 +65,71 @@ native dod_set_user_ammo(index,wid,value);
/*Gets the ammo of the specified weapon entity id */ /*Gets the ammo of the specified weapon entity id */
native dod_get_user_ammo(index,wid); native dod_get_user_ammo(index,wid);
/* called after first InitObj */
forward controlpoints_init();
enum CP_VALUE {
CP_edict = 1, // read only
CP_area, // read only
CP_index, // read only
CP_owner,
CP_default_owner,
CP_visible, // reinit after change
CP_icon_neutral, // reinit after change
CP_icon_allies, // reinit after change
CP_icon_axis, // reinit after change
CP_origin_x, // reinit after change
CP_origin_y, // reinit after change
CP_can_touch,
CP_pointvalue,
CP_points_for_cap,
CP_team_points,
CP_model_body_neutral,
CP_model_body_allies,
CP_model_body_axis,
// strings
CP_name,
CP_reset_capsound,
CP_allies_capsound,
CP_axis_capsound,
CP_targetname,
CP_model_neutral,
CP_model_allies,
CP_model_axis,
};
/* returns number of objectives */
native objectives_get_num();
/* use this function to update client(s) hud. You need to do this sometimes. Check CP_VALUE comments.
if player is 0 , all clients will get this message */
native objectives_reinit( player=0 );
/* use this function to get info about specified control point */
native objective_get_data( index, CP_VALUE:key, szValue[]="", len=0 );
/* use this function to change control point's data */
native objective_set_data( index, CP_VALUE:key , iValue=-1, szValue[]="" );
enum CA_VALUE {
CA_edict = 1,
CA_allies_numcap,
CA_axis_numcap,
CA_timetocap,
CA_can_cap,
// strings
CA_target,
CA_sprite,
};
/* use this function to get info about specified control point's area */
native area_get_data( index, CP_VALUE:key, szValue[]="", len=0 );
/* use this function to change control point's area data */
native area_set_data( index, CP_VALUE:key , iValue=-1, szValue[]="" );