--- deliantra/server/plugins/cfperl/cfperl.xs 2006/03/06 23:31:54 1.29 +++ deliantra/server/plugins/cfperl/cfperl.xs 2006/03/16 23:43:58 1.34 @@ -451,12 +451,15 @@ registerGlobalEvent (NULL, EVENT_MAPLOAD, PLUGIN_NAME, globalEventListener); registerGlobalEvent (NULL, EVENT_MAPOUT, PLUGIN_NAME, globalEventListener); registerGlobalEvent (NULL, EVENT_MAPIN, PLUGIN_NAME, globalEventListener); + registerGlobalEvent (NULL, EVENT_MAPCLEAN, PLUGIN_NAME, globalEventListener); registerGlobalEvent (NULL, EVENT_REMOVE, PLUGIN_NAME, globalEventListener); registerGlobalEvent (NULL, EVENT_SHOUT, PLUGIN_NAME, globalEventListener); registerGlobalEvent (NULL, EVENT_TELL, PLUGIN_NAME, globalEventListener); registerGlobalEvent (NULL, EVENT_MUZZLE, PLUGIN_NAME, globalEventListener); registerGlobalEvent (NULL, EVENT_KICK, PLUGIN_NAME, globalEventListener); registerGlobalEvent (NULL, EVENT_FREE_OB, PLUGIN_NAME, globalEventListener); + registerGlobalEvent (NULL, EVENT_PLAYER_LOAD, PLUGIN_NAME, globalEventListener); + registerGlobalEvent (NULL, EVENT_PLAYER_SAVE, PLUGIN_NAME, globalEventListener); char *argv[] = { "", @@ -512,9 +515,18 @@ printf ("Unimplemented for now\n"); break; + case EVENT_PLAYER_LOAD: + case EVENT_PLAYER_SAVE: + context.who = va_arg (args, object *); + buf = va_arg (args, char *); + if (buf != 0) + strncpy (context.message, buf, sizeof (context.message)); + break; + case EVENT_MAPLOAD: case EVENT_MAPOUT: case EVENT_MAPIN: + case EVENT_MAPCLEAN: context.map = va_arg (args, mapstruct *); break; @@ -653,6 +665,7 @@ const_iv (llevMonster) const_iv (PLAYER) + const_iv (TRANSPORT) const_iv (ROD) const_iv (TREASURE) const_iv (POTION) @@ -667,7 +680,6 @@ const_iv (ARMOUR) const_iv (PEDESTAL) const_iv (ALTAR) - const_iv (CONFUSION) const_iv (LOCKED_DOOR) const_iv (SPECIAL_KEY) const_iv (MAP) @@ -778,6 +790,7 @@ const_iv (ST_BD_BUILD) const_iv (ST_BD_REMOVE) + const_iv (ST_MAT_FLOOR) const_iv (ST_MAT_WALL) const_iv (ST_MAT_ITEM) @@ -985,6 +998,24 @@ const_iv (WILL_APPLY_EARTHWALL) const_iv (WILL_APPLY_DOOR) const_iv (WILL_APPLY_FOOD) + + const_iv (SAVE_MODE) + const_iv (SAVE_DIR_MODE) + + const_iv (M_PAPER) + const_iv (M_IRON) + const_iv (M_GLASS) + const_iv (M_LEATHER) + const_iv (M_WOOD) + const_iv (M_ORGANIC) + const_iv (M_STONE) + const_iv (M_CLOTH) + const_iv (M_ADAMANT) + const_iv (M_LIQUID) + const_iv (M_SOFT_METAL) + const_iv (M_BONE) + const_iv (M_ICE) + const_iv (M_SPECIAL) }; for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; ) @@ -1014,6 +1045,8 @@ const_event (CLOCK) const_event (CRASH) const_event (PLAYER_DEATH) + const_event (PLAYER_LOAD) + const_event (PLAYER_SAVE) const_event (GKILL) const_event (LOGIN) const_event (LOGOUT) @@ -1023,6 +1056,7 @@ const_event (MAPLOAD) const_event (MAPOUT) const_event (MAPIN) + const_event (MAPCLEAN) const_event (REMOVE) const_event (SHOUT) const_event (TELL) @@ -1259,6 +1293,7 @@ RETVAL = obj->attacktype; OUTPUT: RETVAL +# missing in plug-in api, of course void set_food (object *obj, int food) CODE: @@ -1417,6 +1452,12 @@ RETVAL = cf_query_base_name (ob, plural); OUTPUT: RETVAL +living * +stats (object *ob) + CODE: + RETVAL = &ob->stats; + OUTPUT: RETVAL + MODULE = cf PACKAGE = cf::object::player PREFIX = cf_player_ @@ -1475,6 +1516,21 @@ RETVAL = pl->next; OUTPUT: RETVAL +void get_savebed (player *pl) + ALIAS: + savebed = 0 + PPCODE: + EXTEND (SP, 3); + PUSHs (sv_2mortal (newSVpv (pl->savebed_map, 0))); + PUSHs (sv_2mortal (newSViv (pl->bed_x))); + PUSHs (sv_2mortal (newSViv (pl->bed_y))); + +void set_savebed (player *pl, char *map_path, int x, int y) + CODE: + strcpy (pl->savebed_map, map_path); + pl->bed_x = x; + pl->bed_y = y; + void list () PPCODE: @@ -1484,6 +1540,18 @@ XPUSHs (newSVcfapi (CFAPI_PPLAYER, pl)); } +living * +orig_stats (player *pl) + CODE: + RETVAL = &pl->orig_stats; + OUTPUT: RETVAL + +living * +last_stats (player *pl) + CODE: + RETVAL = &pl->last_stats; + OUTPUT: RETVAL + MODULE = cf PACKAGE = cf::map PREFIX = cf_map_ @@ -1706,3 +1774,55 @@ ALIAS: message = 0 +MODULE = cf PACKAGE = cf::living PREFIX = cf_living_ + +double +exp (living *liv, double new_val = 0.) + PROTOTYPE: $;$ + ALIAS: + Str = 1 + Dex = 2 + Con = 3 + Wis = 4 + Cha = 5 + Int = 6 + Pow = 7 + wc = 8 + ac = 9 + hp = 10 + maxhp = 11 + sp = 12 + maxsp = 13 + grace = 14 + maxgrace = 15 + food = 16 + dam = 17 + luck = 18 + CODE: +# define LIVING_ACC(acc,idx) case idx: RETVAL = liv->acc; if (ix > 1) liv->acc = new_val; break + switch (ix) + { + LIVING_ACC (exp , 0); + LIVING_ACC (Str , 1); + LIVING_ACC (Dex , 2); + LIVING_ACC (Con , 3); + LIVING_ACC (Wis , 4); + LIVING_ACC (Cha , 5); + LIVING_ACC (Int , 6); + LIVING_ACC (Pow , 7); + LIVING_ACC (wc , 8); + LIVING_ACC (ac , 9); + LIVING_ACC (hp , 10); + LIVING_ACC (maxhp , 11); + LIVING_ACC (sp , 12); + LIVING_ACC (maxsp , 13); + LIVING_ACC (grace , 14); + LIVING_ACC (maxgrace, 15); + LIVING_ACC (food , 16); + LIVING_ACC (dam , 17); + LIVING_ACC (luck , 18); + } +# undef LIVING_ACC + OUTPUT: + RETVAL +