mirror of
https://github.com/tbamud/tbamud.git
synced 2025-12-24 03:00:13 +01:00
Added room login trig types --Jamdog
This commit is contained in:
parent
e9373bb849
commit
ca675fdb67
6 changed files with 178 additions and 151 deletions
|
|
@ -35,6 +35,8 @@ export (QQ's a zone into a tarball)t
|
||||||
Xlist (mlist, olist, rlist, zlist, slist, tlist, qlist)
|
Xlist (mlist, olist, rlist, zlist, slist, tlist, qlist)
|
||||||
(lots of major bugfixes too)
|
(lots of major bugfixes too)
|
||||||
tbaMUD 3.59
|
tbaMUD 3.59
|
||||||
|
[Jan 31 2009] - Jamdog
|
||||||
|
Added room login trig types, to catch players logging in to a particular room
|
||||||
[Jan 29 2009] - Rumble
|
[Jan 29 2009] - Rumble
|
||||||
Corrected zcheck MAX_OBJ_GOLD_ALLOWED to compare against Val 0, not Val 1. (thanks Tails)
|
Corrected zcheck MAX_OBJ_GOLD_ALLOWED to compare against Val 0, not Val 1. (thanks Tails)
|
||||||
Created new MAX_OBJ_GOLD_ALLOWED define for zcheck. (thanks Tails)
|
Created new MAX_OBJ_GOLD_ALLOWED define for zcheck. (thanks Tails)
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -1,14 +1,14 @@
|
||||||
/**
|
/**
|
||||||
* @file constants.c
|
* @file constants.c
|
||||||
* Numeric and string contants used by the MUD.
|
* Numeric and string contants used by the MUD.
|
||||||
*
|
*
|
||||||
* Part of the core tbaMUD source code distribution, which is a derivative
|
* Part of the core tbaMUD source code distribution, which is a derivative
|
||||||
* of, and continuation of, CircleMUD.
|
* of, and continuation of, CircleMUD.
|
||||||
*
|
*
|
||||||
* All rights reserved. See license for complete information.
|
* All rights reserved. See license for complete information.
|
||||||
* Copyright (C) 1993, 94 by the Trustees of the Johns Hopkins University
|
* Copyright (C) 1993, 94 by the Trustees of the Johns Hopkins University
|
||||||
* CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991.
|
* CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991.
|
||||||
*
|
*
|
||||||
* @todo Come up with a standard for descriptive arrays. Either all end with
|
* @todo Come up with a standard for descriptive arrays. Either all end with
|
||||||
* newlines or all of them don not.
|
* newlines or all of them don not.
|
||||||
*/
|
*/
|
||||||
|
|
@ -21,7 +21,7 @@
|
||||||
|
|
||||||
/** Current tbaMUD version.
|
/** Current tbaMUD version.
|
||||||
* @todo defined with _TBAMUD so we don't have multiple constants to change.
|
* @todo defined with _TBAMUD so we don't have multiple constants to change.
|
||||||
* @todo cpp_extern isn't needed here (or anywhere) as the extern reserved word
|
* @todo cpp_extern isn't needed here (or anywhere) as the extern reserved word
|
||||||
* works correctly with C compilers (at least in my Experience)
|
* works correctly with C compilers (at least in my Experience)
|
||||||
* Jeremy Osborne 1/28/2008 */
|
* Jeremy Osborne 1/28/2008 */
|
||||||
cpp_extern const char *tbamud_version = "tbaMUD 3.58";
|
cpp_extern const char *tbamud_version = "tbaMUD 3.58";
|
||||||
|
|
@ -29,8 +29,8 @@ cpp_extern const char *tbamud_version = "tbaMUD 3.58";
|
||||||
/* strings corresponding to ordinals/bitvectors in structs.h */
|
/* strings corresponding to ordinals/bitvectors in structs.h */
|
||||||
/* (Note: strings for class definitions in class.c instead of here) */
|
/* (Note: strings for class definitions in class.c instead of here) */
|
||||||
|
|
||||||
/** Description of cardinal directions.
|
/** Description of cardinal directions.
|
||||||
* @pre Must be in the same order as the defines.
|
* @pre Must be in the same order as the defines.
|
||||||
* Must end array with a single newline. */
|
* Must end array with a single newline. */
|
||||||
const char *dirs[] =
|
const char *dirs[] =
|
||||||
{
|
{
|
||||||
|
|
@ -40,11 +40,11 @@ const char *dirs[] =
|
||||||
"west",
|
"west",
|
||||||
"up",
|
"up",
|
||||||
"down",
|
"down",
|
||||||
"\n"
|
"\n"
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Room flag descriptions.
|
/** Room flag descriptions.
|
||||||
* @pre Must be in the same order as the defines.
|
* @pre Must be in the same order as the defines.
|
||||||
* Must end array with a single newline. */
|
* Must end array with a single newline. */
|
||||||
const char *room_bits[] = {
|
const char *room_bits[] = {
|
||||||
"DARK",
|
"DARK",
|
||||||
|
|
@ -64,11 +64,11 @@ const char *room_bits[] = {
|
||||||
"OLC",
|
"OLC",
|
||||||
"*", /* The BFS Mark. */
|
"*", /* The BFS Mark. */
|
||||||
"WORLDMAP",
|
"WORLDMAP",
|
||||||
"\n"
|
"\n"
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Exit bits for doors.
|
/** Exit bits for doors.
|
||||||
* @pre Must be in the same order as the defines.
|
* @pre Must be in the same order as the defines.
|
||||||
* Must end array with a single newline. */
|
* Must end array with a single newline. */
|
||||||
const char *exit_bits[] = {
|
const char *exit_bits[] = {
|
||||||
"DOOR",
|
"DOOR",
|
||||||
|
|
@ -79,7 +79,7 @@ const char *exit_bits[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Description of the room sector type.
|
/** Description of the room sector type.
|
||||||
* @pre Must be in the same order as the defines.
|
* @pre Must be in the same order as the defines.
|
||||||
* Must end array with a single newline. */
|
* Must end array with a single newline. */
|
||||||
const char *sector_types[] = {
|
const char *sector_types[] = {
|
||||||
"Inside",
|
"Inside",
|
||||||
|
|
@ -96,7 +96,7 @@ const char *sector_types[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/** PC and NPC sex.
|
/** PC and NPC sex.
|
||||||
* @pre Must be in the same order as the defines.
|
* @pre Must be in the same order as the defines.
|
||||||
* Must end array with a single newline. */
|
* Must end array with a single newline. */
|
||||||
const char *genders[] =
|
const char *genders[] =
|
||||||
{
|
{
|
||||||
|
|
@ -107,7 +107,7 @@ const char *genders[] =
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Character positions.
|
/** Character positions.
|
||||||
* @pre Must be in the same order as the defines.
|
* @pre Must be in the same order as the defines.
|
||||||
* Must end array with a single newline. */
|
* Must end array with a single newline. */
|
||||||
const char *position_types[] = {
|
const char *position_types[] = {
|
||||||
"Dead",
|
"Dead",
|
||||||
|
|
@ -123,7 +123,7 @@ const char *position_types[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Player flags.
|
/** Player flags.
|
||||||
* @pre Must be in the same order as the defines.
|
* @pre Must be in the same order as the defines.
|
||||||
* Must end array with a single newline. */
|
* Must end array with a single newline. */
|
||||||
const char *player_bits[] = {
|
const char *player_bits[] = {
|
||||||
"KILLER",
|
"KILLER",
|
||||||
|
|
@ -152,7 +152,7 @@ const char *player_bits[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Mob action flags.
|
/** Mob action flags.
|
||||||
* @pre Must be in the same order as the defines.
|
* @pre Must be in the same order as the defines.
|
||||||
* Must end array with a single newline. */
|
* Must end array with a single newline. */
|
||||||
const char *action_bits[] = {
|
const char *action_bits[] = {
|
||||||
"SPEC",
|
"SPEC",
|
||||||
|
|
@ -178,7 +178,7 @@ const char *action_bits[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/** PC Preference flags.
|
/** PC Preference flags.
|
||||||
* @pre Must be in the same order as the defines.
|
* @pre Must be in the same order as the defines.
|
||||||
* Must end array with a single newline. */
|
* Must end array with a single newline. */
|
||||||
const char *preference_bits[] = {
|
const char *preference_bits[] = {
|
||||||
"BRIEF",
|
"BRIEF",
|
||||||
|
|
@ -217,7 +217,7 @@ const char *preference_bits[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Affected bits.
|
/** Affected bits.
|
||||||
* @pre Must be in the same order as the defines.
|
* @pre Must be in the same order as the defines.
|
||||||
* Must end array with a single newline. */
|
* Must end array with a single newline. */
|
||||||
const char *affected_bits[] =
|
const char *affected_bits[] =
|
||||||
{
|
{
|
||||||
|
|
@ -248,7 +248,7 @@ const char *affected_bits[] =
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Connection type descriptions.
|
/** Connection type descriptions.
|
||||||
* @pre Must be in the same order as the defines.
|
* @pre Must be in the same order as the defines.
|
||||||
* Must end array with a single newline. */
|
* Must end array with a single newline. */
|
||||||
const char *connected_types[] = {
|
const char *connected_types[] = {
|
||||||
"Playing",
|
"Playing",
|
||||||
|
|
@ -284,7 +284,7 @@ const char *connected_types[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Describes the position in the equipment listing.
|
/** Describes the position in the equipment listing.
|
||||||
* @pre Must be in the same order as the defines.
|
* @pre Must be in the same order as the defines.
|
||||||
* Not used in sprinttype() so no \n. */
|
* Not used in sprinttype() so no \n. */
|
||||||
const char *wear_where[] = {
|
const char *wear_where[] = {
|
||||||
"<used as light> ",
|
"<used as light> ",
|
||||||
|
|
@ -308,7 +308,7 @@ const char *wear_where[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Describes where an item can be worn.
|
/* Describes where an item can be worn.
|
||||||
* @pre Must be in the same order as the defines.
|
* @pre Must be in the same order as the defines.
|
||||||
* Must end array with a single newline. */
|
* Must end array with a single newline. */
|
||||||
const char *equipment_types[] = {
|
const char *equipment_types[] = {
|
||||||
"Used as light",
|
"Used as light",
|
||||||
|
|
@ -333,7 +333,7 @@ const char *equipment_types[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Describes the type of object.
|
/** Describes the type of object.
|
||||||
* @pre Must be in the same order as the defines.
|
* @pre Must be in the same order as the defines.
|
||||||
* Must end array with a single newline. */
|
* Must end array with a single newline. */
|
||||||
const char *item_types[] = {
|
const char *item_types[] = {
|
||||||
"UNDEFINED",
|
"UNDEFINED",
|
||||||
|
|
@ -364,7 +364,7 @@ const char *item_types[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Describes the wear flags set on an item.
|
/** Describes the wear flags set on an item.
|
||||||
* @pre Must be in the same order as the defines.
|
* @pre Must be in the same order as the defines.
|
||||||
* Must end array with a single newline. */
|
* Must end array with a single newline. */
|
||||||
const char *wear_bits[] = {
|
const char *wear_bits[] = {
|
||||||
"TAKE",
|
"TAKE",
|
||||||
|
|
@ -386,7 +386,7 @@ const char *wear_bits[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Describes the extra flags applied to an item.
|
/** Describes the extra flags applied to an item.
|
||||||
* @pre Must be in the same order as the defines.
|
* @pre Must be in the same order as the defines.
|
||||||
* Must end array with a single newline. */
|
* Must end array with a single newline. */
|
||||||
const char *extra_bits[] = {
|
const char *extra_bits[] = {
|
||||||
"GLOW",
|
"GLOW",
|
||||||
|
|
@ -411,7 +411,7 @@ const char *extra_bits[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Describes the apply types.
|
/** Describes the apply types.
|
||||||
* @pre Must be in the same order as the defines.
|
* @pre Must be in the same order as the defines.
|
||||||
* Must end array with a single newline. */
|
* Must end array with a single newline. */
|
||||||
const char *apply_types[] = {
|
const char *apply_types[] = {
|
||||||
"NONE",
|
"NONE",
|
||||||
|
|
@ -443,7 +443,7 @@ const char *apply_types[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Describes the closure mechanism for a container.
|
/** Describes the closure mechanism for a container.
|
||||||
* @pre Must be in the same order as the defines.
|
* @pre Must be in the same order as the defines.
|
||||||
* Must end array with a single newline. */
|
* Must end array with a single newline. */
|
||||||
const char *container_bits[] = {
|
const char *container_bits[] = {
|
||||||
"CLOSEABLE",
|
"CLOSEABLE",
|
||||||
|
|
@ -454,7 +454,7 @@ const char *container_bits[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Describes the liquid description.
|
/** Describes the liquid description.
|
||||||
* @pre Must be in the same order as the defines.
|
* @pre Must be in the same order as the defines.
|
||||||
* Must end array with a single newline. */
|
* Must end array with a single newline. */
|
||||||
const char *drinks[] =
|
const char *drinks[] =
|
||||||
{
|
{
|
||||||
|
|
@ -478,7 +478,7 @@ const char *drinks[] =
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Describes a one word alias for each type of liquid.
|
/** Describes a one word alias for each type of liquid.
|
||||||
* @pre Must be in the same order as the defines.
|
* @pre Must be in the same order as the defines.
|
||||||
* Must end array with a single newline. */
|
* Must end array with a single newline. */
|
||||||
const char *drinknames[] =
|
const char *drinknames[] =
|
||||||
{
|
{
|
||||||
|
|
@ -502,7 +502,7 @@ const char *drinknames[] =
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Define the effect of liquids on hunger, thirst, and drunkenness, in that
|
/** Define the effect of liquids on hunger, thirst, and drunkenness, in that
|
||||||
* order. See values.doc for more information.
|
* order. See values.doc for more information.
|
||||||
* @pre Must be in the same order as the defines. */
|
* @pre Must be in the same order as the defines. */
|
||||||
int drink_aff[][3] = {
|
int drink_aff[][3] = {
|
||||||
{0, 1, 10},
|
{0, 1, 10},
|
||||||
|
|
@ -524,7 +524,7 @@ int drink_aff[][3] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Describes the color of the various drinks.
|
/** Describes the color of the various drinks.
|
||||||
* @pre Must be in the same order as the defines.
|
* @pre Must be in the same order as the defines.
|
||||||
* Must end array with a single newline. */
|
* Must end array with a single newline. */
|
||||||
const char *color_liquid[] =
|
const char *color_liquid[] =
|
||||||
{
|
{
|
||||||
|
|
@ -547,7 +547,7 @@ const char *color_liquid[] =
|
||||||
"\n"
|
"\n"
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Used to describe the level of fullness of a drink container. Not used in
|
/** Used to describe the level of fullness of a drink container. Not used in
|
||||||
* sprinttype() so no \n. */
|
* sprinttype() so no \n. */
|
||||||
const char *fullness[] =
|
const char *fullness[] =
|
||||||
{
|
{
|
||||||
|
|
@ -877,17 +877,17 @@ const char *wtrig_types[] = {
|
||||||
"Cast",
|
"Cast",
|
||||||
"Leave",
|
"Leave",
|
||||||
"Door",
|
"Door",
|
||||||
"UNUSED",
|
"Login",
|
||||||
"Time",
|
"Time",
|
||||||
"\n"
|
"\n"
|
||||||
};
|
};
|
||||||
|
|
||||||
/** The names of the different channels that history is stored for.
|
/** The names of the different channels that history is stored for.
|
||||||
* @todo Only referenced by do_history at the moment. Should be moved local
|
* @todo Only referenced by do_history at the moment. Should be moved local
|
||||||
* to that function. */
|
* to that function. */
|
||||||
const char *history_types[] = {
|
const char *history_types[] = {
|
||||||
"all",
|
"all",
|
||||||
"say",
|
"say",
|
||||||
"gossip",
|
"gossip",
|
||||||
"wiznet",
|
"wiznet",
|
||||||
"tell",
|
"tell",
|
||||||
|
|
@ -895,7 +895,7 @@ const char *history_types[] = {
|
||||||
"grats",
|
"grats",
|
||||||
"holler",
|
"holler",
|
||||||
"auction",
|
"auction",
|
||||||
"\n"
|
"\n"
|
||||||
};
|
};
|
||||||
/* --- End of constants arrays. --- */
|
/* --- End of constants arrays. --- */
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,16 @@
|
||||||
/**
|
/**
|
||||||
* @file dg_scripts.h
|
* @file dg_scripts.h
|
||||||
* Header file for script structures, constants, and function prototypes for
|
* Header file for script structures, constants, and function prototypes for
|
||||||
* dg_scripts.c
|
* dg_scripts.c
|
||||||
*
|
*
|
||||||
* Part of the core tbaMUD source code distribution, which is a derivative
|
* Part of the core tbaMUD source code distribution, which is a derivative
|
||||||
* of, and continuation of, CircleMUD.
|
* of, and continuation of, CircleMUD.
|
||||||
*
|
*
|
||||||
* This source code, which was not part of the CircleMUD legacy code,
|
* This source code, which was not part of the CircleMUD legacy code,
|
||||||
* was created by the following people:
|
* was created by the following people:
|
||||||
* $Author: Mark A. Heilpern/egreen/Welcor $
|
* $Author: Mark A. Heilpern/egreen/Welcor $
|
||||||
* $Date: 2004/10/11 12:07:00$
|
* $Date: 2004/10/11 12:07:00$
|
||||||
* $Revision: 1.0.14 $
|
* $Revision: 1.0.14 $
|
||||||
*/
|
*/
|
||||||
#ifndef _DG_SCRIPTS_H_
|
#ifndef _DG_SCRIPTS_H_
|
||||||
#define _DG_SCRIPTS_H_
|
#define _DG_SCRIPTS_H_
|
||||||
|
|
@ -26,15 +26,15 @@
|
||||||
/* spells cast by objects and rooms use this level */
|
/* spells cast by objects and rooms use this level */
|
||||||
#define DG_SPELL_LEVEL 25
|
#define DG_SPELL_LEVEL 25
|
||||||
|
|
||||||
/* Define this if you don't want wear/remove triggers to fire when a player
|
/* Define this if you don't want wear/remove triggers to fire when a player
|
||||||
* is saved. */
|
* is saved. */
|
||||||
#define NO_EXTRANEOUS_TRIGGERS
|
#define NO_EXTRANEOUS_TRIGGERS
|
||||||
|
|
||||||
/* %actor.room% behaviour :
|
/* %actor.room% behaviour :
|
||||||
* Until pl 7 %actor.room% returned a room vnum. Working with this number in
|
* Until pl 7 %actor.room% returned a room vnum. Working with this number in
|
||||||
* scripts was unnecessarily hard, especially in those situations one needed
|
* scripts was unnecessarily hard, especially in those situations one needed
|
||||||
* the id of the room, the items in it, etc. As a result of this, the output
|
* the id of the room, the items in it, etc. As a result of this, the output
|
||||||
* has been changed (as of pl 8) to a room variable.i This means old scripts
|
* has been changed (as of pl 8) to a room variable.i This means old scripts
|
||||||
* will need a minor adjustment;
|
* will need a minor adjustment;
|
||||||
*
|
*
|
||||||
* Before:
|
* Before:
|
||||||
|
|
@ -105,8 +105,9 @@
|
||||||
#define WTRIG_CAST (1 << 15) /* spell cast in room */
|
#define WTRIG_CAST (1 << 15) /* spell cast in room */
|
||||||
#define WTRIG_LEAVE (1 << 16) /* character leaves the room */
|
#define WTRIG_LEAVE (1 << 16) /* character leaves the room */
|
||||||
#define WTRIG_DOOR (1 << 17) /* door manipulated in room */
|
#define WTRIG_DOOR (1 << 17) /* door manipulated in room */
|
||||||
|
#define WTRIG_LOGIN (1 << 18) /* character logs into MUD */
|
||||||
#define WTRIG_TIME (1 << 19) /* trigger based on game hour */
|
#define WTRIG_TIME (1 << 19) /* trigger based on game hour */
|
||||||
|
|
||||||
/* obj command trigger types */
|
/* obj command trigger types */
|
||||||
#define OCMD_EQUIP (1 << 0) /* obj must be in char's equip */
|
#define OCMD_EQUIP (1 << 0) /* obj must be in char's equip */
|
||||||
#define OCMD_INVEN (1 << 1) /* obj must be in char's inven */
|
#define OCMD_INVEN (1 << 1) /* obj must be in char's inven */
|
||||||
|
|
@ -120,7 +121,7 @@
|
||||||
#define TRIG_NEW 0 /* trigger starts from top */
|
#define TRIG_NEW 0 /* trigger starts from top */
|
||||||
#define TRIG_RESTART 1 /* trigger restarting */
|
#define TRIG_RESTART 1 /* trigger restarting */
|
||||||
|
|
||||||
/* These are slightly off of PULSE_MOBILE so everything isnt happening at the
|
/* These are slightly off of PULSE_MOBILE so everything isnt happening at the
|
||||||
* same time. */
|
* same time. */
|
||||||
#define PULSE_DG_SCRIPT (13 RL_SEC)
|
#define PULSE_DG_SCRIPT (13 RL_SEC)
|
||||||
|
|
||||||
|
|
@ -260,6 +261,8 @@ void time_mtrigger(char_data *ch);
|
||||||
void time_otrigger(obj_data *obj);
|
void time_otrigger(obj_data *obj);
|
||||||
void time_wtrigger(room_data *room);
|
void time_wtrigger(room_data *room);
|
||||||
|
|
||||||
|
int login_wtrigger(struct room_data *room, char_data *actor);
|
||||||
|
|
||||||
/* function prototypes from dg_scripts.c */
|
/* function prototypes from dg_scripts.c */
|
||||||
ACMD(do_attach) ;
|
ACMD(do_attach) ;
|
||||||
ACMD(do_detach);
|
ACMD(do_detach);
|
||||||
|
|
|
||||||
|
|
@ -88,8 +88,8 @@ int is_substring(char *sub, char *string)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return 1 if str contains a word or phrase from wordlist. Phrases are in
|
/* Return 1 if str contains a word or phrase from wordlist. Phrases are in
|
||||||
* double quotes ("). if wrdlist is NULL, then return 1, if str is NULL,
|
* double quotes ("). if wrdlist is NULL, then return 1, if str is NULL,
|
||||||
* return 0. */
|
* return 0. */
|
||||||
int word_check(char *str, char *wordlist)
|
int word_check(char *str, char *wordlist)
|
||||||
{
|
{
|
||||||
|
|
@ -674,7 +674,7 @@ int get_otrigger(obj_data *obj, char_data *actor)
|
||||||
if (TRIGGER_CHECK(t, OTRIG_GET) && (rand_number(1, 100) <= GET_TRIG_NARG(t))) {
|
if (TRIGGER_CHECK(t, OTRIG_GET) && (rand_number(1, 100) <= GET_TRIG_NARG(t))) {
|
||||||
ADD_UID_VAR(buf, t, actor, "actor", 0);
|
ADD_UID_VAR(buf, t, actor, "actor", 0);
|
||||||
ret_val = script_driver(&obj, t, OBJ_TRIGGER, TRIG_NEW);
|
ret_val = script_driver(&obj, t, OBJ_TRIGGER, TRIG_NEW);
|
||||||
/* Don't allow a get to take place, if the actor is killed (the mud
|
/* Don't allow a get to take place, if the actor is killed (the mud
|
||||||
* would choke on obj_to_char) or the object is purged. */
|
* would choke on obj_to_char) or the object is purged. */
|
||||||
if (DEAD(actor) || !obj)
|
if (DEAD(actor) || !obj)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -837,7 +837,7 @@ int give_otrigger(obj_data *obj, char_data *actor, char_data *victim)
|
||||||
ADD_UID_VAR(buf, t, actor, "actor", 0);
|
ADD_UID_VAR(buf, t, actor, "actor", 0);
|
||||||
ADD_UID_VAR(buf, t, victim, "victim", 0);
|
ADD_UID_VAR(buf, t, victim, "victim", 0);
|
||||||
ret_val = script_driver(&obj, t, OBJ_TRIGGER, TRIG_NEW);
|
ret_val = script_driver(&obj, t, OBJ_TRIGGER, TRIG_NEW);
|
||||||
/* Don't allow a give to take place, if the object is purged or the
|
/* Don't allow a give to take place, if the object is purged or the
|
||||||
* object is not carried by the giver. */
|
* object is not carried by the giver. */
|
||||||
if (!obj || obj->carried_by != actor)
|
if (!obj || obj->carried_by != actor)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -1237,3 +1237,22 @@ void time_wtrigger(struct room_data *room)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int login_wtrigger(struct room_data *room, char_data *actor)
|
||||||
|
{
|
||||||
|
trig_data *t;
|
||||||
|
char buf[MAX_INPUT_LENGTH];
|
||||||
|
|
||||||
|
if (!SCRIPT_CHECK(room, WTRIG_LOGIN))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
for (t = TRIGGERS(SCRIPT(room)); t; t = t->next) {
|
||||||
|
if (TRIGGER_CHECK(t, WTRIG_LOGIN) &&
|
||||||
|
(rand_number(1, 100) <= GET_TRIG_NARG(t))) {
|
||||||
|
ADD_UID_VAR(buf, t, actor, "actor", 0);
|
||||||
|
return script_driver(&room, t, WLD_TRIGGER, TRIG_NEW);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -51,12 +51,12 @@ int *cmd_sort_info = NULL;
|
||||||
|
|
||||||
struct command_info *complete_cmd_info;
|
struct command_info *complete_cmd_info;
|
||||||
|
|
||||||
/* This is the Master Command List. You can put new commands in, take commands
|
/* This is the Master Command List. You can put new commands in, take commands
|
||||||
* out, change the order they appear in, etc. You can adjust the "priority"
|
* out, change the order they appear in, etc. You can adjust the "priority"
|
||||||
* of commands simply by changing the order they appear in the command list.
|
* of commands simply by changing the order they appear in the command list.
|
||||||
* (For example, if you want "as" to mean "assist" instead of "ask", just put
|
* (For example, if you want "as" to mean "assist" instead of "ask", just put
|
||||||
* "assist" above "ask" in the Master Command List. In general, utility
|
* "assist" above "ask" in the Master Command List. In general, utility
|
||||||
* commands such as "at" should have high priority; infrequently used and
|
* commands such as "at" should have high priority; infrequently used and
|
||||||
* dangerously destructive commands should have low priority. */
|
* dangerously destructive commands should have low priority. */
|
||||||
|
|
||||||
cpp_extern const struct command_info cmd_info[] = {
|
cpp_extern const struct command_info cmd_info[] = {
|
||||||
|
|
@ -333,61 +333,61 @@ cpp_extern const struct command_info cmd_info[] = {
|
||||||
{ "zcheck" , "zcheck" , POS_DEAD , do_zcheck , LVL_GOD, 0 },
|
{ "zcheck" , "zcheck" , POS_DEAD , do_zcheck , LVL_GOD, 0 },
|
||||||
{ "zpurge" , "zpurge" , POS_DEAD , do_zpurge , LVL_BUILDER, 0 },
|
{ "zpurge" , "zpurge" , POS_DEAD , do_zpurge , LVL_BUILDER, 0 },
|
||||||
|
|
||||||
{ "\n", "zzzzzzz", 0, 0, 0, 0 } }; /* this must be last */
|
{ "\n", "zzzzzzz", 0, 0, 0, 0 } }; /* this must be last */
|
||||||
|
|
||||||
|
|
||||||
/* Thanks to Melzaren for this change to allow DG Scripts to be attachable
|
/* Thanks to Melzaren for this change to allow DG Scripts to be attachable
|
||||||
*to player's while still disallowing them to manually use the DG-Commands. */
|
*to player's while still disallowing them to manually use the DG-Commands. */
|
||||||
const struct mob_script_command_t mob_script_commands[] = {
|
const struct mob_script_command_t mob_script_commands[] = {
|
||||||
|
|
||||||
/* DG trigger commands. minimum_level should be set to -1. */
|
/* DG trigger commands. minimum_level should be set to -1. */
|
||||||
{ "masound" , do_masound , 0 },
|
{ "masound" , do_masound , 0 },
|
||||||
{ "mkill" , do_mkill , 0 },
|
{ "mkill" , do_mkill , 0 },
|
||||||
{ "mjunk" , do_mjunk , 0 },
|
{ "mjunk" , do_mjunk , 0 },
|
||||||
{ "mdamage" , do_mdamage , 0 },
|
{ "mdamage" , do_mdamage , 0 },
|
||||||
{ "mdoor" , do_mdoor , 0 },
|
{ "mdoor" , do_mdoor , 0 },
|
||||||
{ "mecho" , do_mecho , 0 },
|
{ "mecho" , do_mecho , 0 },
|
||||||
{ "mrecho" , do_mrecho , 0 },
|
{ "mrecho" , do_mrecho , 0 },
|
||||||
{ "mechoaround", do_mechoaround , 0 },
|
{ "mechoaround", do_mechoaround , 0 },
|
||||||
{ "msend" , do_msend , 0 },
|
{ "msend" , do_msend , 0 },
|
||||||
{ "mload" , do_mload , 0 },
|
{ "mload" , do_mload , 0 },
|
||||||
{ "mpurge" , do_mpurge , 0 },
|
{ "mpurge" , do_mpurge , 0 },
|
||||||
{ "mgoto" , do_mgoto , 0 },
|
{ "mgoto" , do_mgoto , 0 },
|
||||||
{ "mat" , do_mat , 0 },
|
{ "mat" , do_mat , 0 },
|
||||||
{ "mteleport", do_mteleport, 0 },
|
{ "mteleport", do_mteleport, 0 },
|
||||||
{ "mforce" , do_mforce , 0 },
|
{ "mforce" , do_mforce , 0 },
|
||||||
{ "mhunt" , do_mhunt , 0 },
|
{ "mhunt" , do_mhunt , 0 },
|
||||||
{ "mremember", do_mremember, 0 },
|
{ "mremember", do_mremember, 0 },
|
||||||
{ "mforget" , do_mforget , 0 },
|
{ "mforget" , do_mforget , 0 },
|
||||||
{ "mtransform", do_mtransform , 0 },
|
{ "mtransform", do_mtransform , 0 },
|
||||||
{ "mzoneecho", do_mzoneecho, 0 },
|
{ "mzoneecho", do_mzoneecho, 0 },
|
||||||
{ "mfollow" , do_mfollow , 0 },
|
{ "mfollow" , do_mfollow , 0 },
|
||||||
{ "\n" , do_not_here , 0 } };
|
{ "\n" , do_not_here , 0 } };
|
||||||
|
|
||||||
int script_command_interpreter(struct char_data *ch, char *arg) {
|
int script_command_interpreter(struct char_data *ch, char *arg) {
|
||||||
/* DG trigger commands */
|
/* DG trigger commands */
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
char first_arg[MAX_INPUT_LENGTH];
|
char first_arg[MAX_INPUT_LENGTH];
|
||||||
char *line;
|
char *line;
|
||||||
|
|
||||||
skip_spaces(&arg);
|
skip_spaces(&arg);
|
||||||
if (!*arg)
|
if (!*arg)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
line = any_one_arg(arg, first_arg);
|
line = any_one_arg(arg, first_arg);
|
||||||
|
|
||||||
for (i = 0; *mob_script_commands[i].command_name != '\n'; i++)
|
for (i = 0; *mob_script_commands[i].command_name != '\n'; i++)
|
||||||
if (!str_cmp(first_arg, mob_script_commands[i].command_name))
|
if (!str_cmp(first_arg, mob_script_commands[i].command_name))
|
||||||
break; // NB - only allow full matches.
|
break; // NB - only allow full matches.
|
||||||
|
|
||||||
if (*mob_script_commands[i].command_name == '\n')
|
if (*mob_script_commands[i].command_name == '\n')
|
||||||
return 0; // no matching commands.
|
return 0; // no matching commands.
|
||||||
|
|
||||||
/* Poiner to the command? */
|
/* Poiner to the command? */
|
||||||
((*mob_script_commands[i].command_pointer) (ch, line, 0,
|
((*mob_script_commands[i].command_pointer) (ch, line, 0,
|
||||||
mob_script_commands[i].subcmd));
|
mob_script_commands[i].subcmd));
|
||||||
return 1; // We took care of execution. Let caller know.
|
return 1; // We took care of execution. Let caller know.
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *fill[] =
|
const char *fill[] =
|
||||||
|
|
@ -456,7 +456,7 @@ void command_interpreter(struct char_data *ch, char *argument)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* special case to handle one-character, non-alphanumeric commands; requested
|
/* special case to handle one-character, non-alphanumeric commands; requested
|
||||||
* by many people so "'hi" or ";godnet test" is possible. Patch sent by Eric
|
* by many people so "'hi" or ";godnet test" is possible. Patch sent by Eric
|
||||||
* Green and Stefan Wasilewski. */
|
* Green and Stefan Wasilewski. */
|
||||||
if (!isalpha(*argument)) {
|
if (!isalpha(*argument)) {
|
||||||
arg[0] = argument[0];
|
arg[0] = argument[0];
|
||||||
|
|
@ -475,11 +475,11 @@ void command_interpreter(struct char_data *ch, char *argument)
|
||||||
if (cont) return; /* yes, command trigger took over */
|
if (cont) return; /* yes, command trigger took over */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allow IMPLs to switch into mobs to test the commands. */
|
/* Allow IMPLs to switch into mobs to test the commands. */
|
||||||
if (IS_NPC(ch) && ch->desc && GET_LEVEL(ch->desc->original) >= LVL_IMPL) {
|
if (IS_NPC(ch) && ch->desc && GET_LEVEL(ch->desc->original) >= LVL_IMPL) {
|
||||||
if (script_command_interpreter(ch, argument))
|
if (script_command_interpreter(ch, argument))
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (length = strlen(arg), cmd = 0; *complete_cmd_info[cmd].command != '\n'; cmd++)
|
for (length = strlen(arg), cmd = 0; *complete_cmd_info[cmd].command != '\n'; cmd++)
|
||||||
if(complete_cmd_info[cmd].command_pointer != do_action &&
|
if(complete_cmd_info[cmd].command_pointer != do_action &&
|
||||||
|
|
@ -500,17 +500,17 @@ void command_interpreter(struct char_data *ch, char *argument)
|
||||||
int found = 0;
|
int found = 0;
|
||||||
send_to_char(ch, "Huh!?!\r\n");
|
send_to_char(ch, "Huh!?!\r\n");
|
||||||
|
|
||||||
for (cmd = 0; *cmd_info[cmd].command != '\n'; cmd++)
|
for (cmd = 0; *cmd_info[cmd].command != '\n'; cmd++)
|
||||||
{
|
{
|
||||||
if (*arg != *cmd_info[cmd].command || cmd_info[cmd].minimum_level > GET_LEVEL(ch))
|
if (*arg != *cmd_info[cmd].command || cmd_info[cmd].minimum_level > GET_LEVEL(ch))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Only apply levenshtein counts if the command is not a trigger command. */
|
/* Only apply levenshtein counts if the command is not a trigger command. */
|
||||||
if ( (levenshtein_distance(arg, cmd_info[cmd].command) <= 2) &&
|
if ( (levenshtein_distance(arg, cmd_info[cmd].command) <= 2) &&
|
||||||
(cmd_info[cmd].minimum_level >= 0) )
|
(cmd_info[cmd].minimum_level >= 0) )
|
||||||
{
|
{
|
||||||
if (!found)
|
if (!found)
|
||||||
{
|
{
|
||||||
send_to_char(ch, "\r\nDid you mean:\r\n");
|
send_to_char(ch, "\r\nDid you mean:\r\n");
|
||||||
found = 1;
|
found = 1;
|
||||||
}
|
}
|
||||||
|
|
@ -631,8 +631,8 @@ ACMD(do_alias)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Valid numeric replacements are only $1 .. $9 (makes parsing a little easier,
|
/* Valid numeric replacements are only $1 .. $9 (makes parsing a little easier,
|
||||||
* and it's not that much of a limitation anyway.) Also valid is "$*", which
|
* and it's not that much of a limitation anyway.) Also valid is "$*", which
|
||||||
* stands for the entire original line after the alias. ";" is used to delimit
|
* stands for the entire original line after the alias. ";" is used to delimit
|
||||||
* commands. */
|
* commands. */
|
||||||
#define NUM_TOKENS 9
|
#define NUM_TOKENS 9
|
||||||
|
|
||||||
|
|
@ -730,8 +730,8 @@ int perform_alias(struct descriptor_data *d, char *orig, size_t maxlen)
|
||||||
/* Various other parsing utilities. */
|
/* Various other parsing utilities. */
|
||||||
|
|
||||||
/* Searches an array of strings for a target string. "exact" can be 0 or non-0,
|
/* Searches an array of strings for a target string. "exact" can be 0 or non-0,
|
||||||
* depending on whether or not the match must be exact for it to be returned.
|
* depending on whether or not the match must be exact for it to be returned.
|
||||||
* Returns -1 if not found; 0..n otherwise. Array must be terminated with a
|
* Returns -1 if not found; 0..n otherwise. Array must be terminated with a
|
||||||
* '\n' so it knows to stop searching. */
|
* '\n' so it knows to stop searching. */
|
||||||
int search_block(char *arg, const char **list, int exact)
|
int search_block(char *arg, const char **list, int exact)
|
||||||
{
|
{
|
||||||
|
|
@ -784,13 +784,13 @@ void skip_spaces(char **string)
|
||||||
for (; **string && isspace(**string); (*string)++);
|
for (; **string && isspace(**string); (*string)++);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Given a string, change all instances of double dollar signs ($$) to single
|
/* Given a string, change all instances of double dollar signs ($$) to single
|
||||||
* dollar signs ($). When strings come in, all $'s are changed to $$'s to
|
* dollar signs ($). When strings come in, all $'s are changed to $$'s to
|
||||||
* avoid having users be able to crash the system if the inputted string is
|
* avoid having users be able to crash the system if the inputted string is
|
||||||
* eventually sent to act(). If you are using user input to produce screen
|
* eventually sent to act(). If you are using user input to produce screen
|
||||||
* output AND YOU ARE SURE IT WILL NOT BE SENT THROUGH THE act() FUNCTION
|
* output AND YOU ARE SURE IT WILL NOT BE SENT THROUGH THE act() FUNCTION
|
||||||
* (i.e., do_gecho, do_title, but NOT do_say), you can call
|
* (i.e., do_gecho, do_title, but NOT do_say), you can call
|
||||||
* delete_doubledollar() to make the output look correct.
|
* delete_doubledollar() to make the output look correct.
|
||||||
* Modifies the string in-place. */
|
* Modifies the string in-place. */
|
||||||
char *delete_doubledollar(char *string)
|
char *delete_doubledollar(char *string)
|
||||||
{
|
{
|
||||||
|
|
@ -851,7 +851,7 @@ char *one_argument(char *argument, char *first_arg)
|
||||||
return (argument);
|
return (argument);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* one_word is like any_one_arg, except that words in quotes ("") are
|
/* one_word is like any_one_arg, except that words in quotes ("") are
|
||||||
* considered one word. No longer ignores fill words. -dak */
|
* considered one word. No longer ignores fill words. -dak */
|
||||||
char *one_word(char *argument, char *first_arg)
|
char *one_word(char *argument, char *first_arg)
|
||||||
{
|
{
|
||||||
|
|
@ -1049,11 +1049,11 @@ static int perform_dupe_check(struct descriptor_data *d)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now, go through the character list, deleting all characters that are not
|
/* Now, go through the character list, deleting all characters that are not
|
||||||
* already marked for deletion from the above step (i.e., in the CON_HANGUP
|
* already marked for deletion from the above step (i.e., in the CON_HANGUP
|
||||||
* state), and have not already been selected as a target for switching into.
|
* state), and have not already been selected as a target for switching into.
|
||||||
* In addition, if we haven't already found a target, choose one if one is
|
* In addition, if we haven't already found a target, choose one if one is
|
||||||
* available (while still deleting the other duplicates, though theoretically
|
* available (while still deleting the other duplicates, though theoretically
|
||||||
* none should be able to exist). */
|
* none should be able to exist). */
|
||||||
for (ch = character_list; ch; ch = next_ch) {
|
for (ch = character_list; ch; ch = next_ch) {
|
||||||
next_ch = ch->next;
|
next_ch = ch->next;
|
||||||
|
|
@ -1088,9 +1088,9 @@ static int perform_dupe_check(struct descriptor_data *d)
|
||||||
|
|
||||||
/* no target for switching into was found - allow login to continue */
|
/* no target for switching into was found - allow login to continue */
|
||||||
if (!target) {
|
if (!target) {
|
||||||
GET_PREF(d->character) = rand_number(1, 128000);
|
GET_PREF(d->character) = rand_number(1, 128000);
|
||||||
if (GET_HOST(d->character))
|
if (GET_HOST(d->character))
|
||||||
free(GET_HOST(d->character));
|
free(GET_HOST(d->character));
|
||||||
GET_HOST(d->character) = strdup(d->host);
|
GET_HOST(d->character) = strdup(d->host);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -1169,8 +1169,8 @@ int enter_player_game (struct descriptor_data *d)
|
||||||
/* find_char helper */
|
/* find_char helper */
|
||||||
add_to_lookup_table(GET_ID(d->character), (void *)d->character);
|
add_to_lookup_table(GET_ID(d->character), (void *)d->character);
|
||||||
|
|
||||||
/* After moving saving of variables to the player file, this should only
|
/* After moving saving of variables to the player file, this should only
|
||||||
* be called in case nothing was found in the pfile. If something was
|
* be called in case nothing was found in the pfile. If something was
|
||||||
* found, SCRIPT(ch) will be set. */
|
* found, SCRIPT(ch) will be set. */
|
||||||
if (!SCRIPT(d->character))
|
if (!SCRIPT(d->character))
|
||||||
read_saved_vars(d->character);
|
read_saved_vars(d->character);
|
||||||
|
|
@ -1181,6 +1181,9 @@ int enter_player_game (struct descriptor_data *d)
|
||||||
load_result = Crash_load(d->character);
|
load_result = Crash_load(d->character);
|
||||||
save_char(d->character);
|
save_char(d->character);
|
||||||
|
|
||||||
|
/* Check for a login trigger in the players' start room */
|
||||||
|
login_wtrigger(&world[IN_ROOM(d->character)], d->character);
|
||||||
|
|
||||||
return load_result;
|
return load_result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1242,7 +1245,7 @@ void nanny(struct descriptor_data *d, char *arg)
|
||||||
GET_PFILEPOS(d->character) = player_i;
|
GET_PFILEPOS(d->character) = player_i;
|
||||||
|
|
||||||
if (PLR_FLAGGED(d->character, PLR_DELETED)) {
|
if (PLR_FLAGGED(d->character, PLR_DELETED)) {
|
||||||
/* Make sure old files are removed so the new player doesn't get the
|
/* Make sure old files are removed so the new player doesn't get the
|
||||||
* deleted player's equipment. */
|
* deleted player's equipment. */
|
||||||
if ((player_i = get_ptable_by_name(tmp_name)) >= 0)
|
if ((player_i = get_ptable_by_name(tmp_name)) >= 0)
|
||||||
remove_player(player_i);
|
remove_player(player_i);
|
||||||
|
|
@ -1324,12 +1327,12 @@ void nanny(struct descriptor_data *d, char *arg)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CON_PASSWORD: /* get pwd for known player */
|
case CON_PASSWORD: /* get pwd for known player */
|
||||||
/* To really prevent duping correctly, the player's record should be reloaded
|
/* To really prevent duping correctly, the player's record should be reloaded
|
||||||
* from disk at this point (after the password has been typed). However I'm
|
* from disk at this point (after the password has been typed). However I'm
|
||||||
* afraid that trying to load a character over an already loaded character is
|
* afraid that trying to load a character over an already loaded character is
|
||||||
* going to cause some problem down the road that I can't see at the moment.
|
* going to cause some problem down the road that I can't see at the moment.
|
||||||
* So to compensate, I'm going to (1) add a 15 or 20-second time limit for
|
* So to compensate, I'm going to (1) add a 15 or 20-second time limit for
|
||||||
* entering a password, and (2) re-add the code to cut off duplicates when a
|
* entering a password, and (2) re-add the code to cut off duplicates when a
|
||||||
* player quits. JE 6 Feb 96 */
|
* player quits. JE 6 Feb 96 */
|
||||||
|
|
||||||
echo_on(d); /* turn echo back on */
|
echo_on(d); /* turn echo back on */
|
||||||
|
|
@ -1534,7 +1537,7 @@ void nanny(struct descriptor_data *d, char *arg)
|
||||||
case '2':
|
case '2':
|
||||||
if (d->character->player.description) {
|
if (d->character->player.description) {
|
||||||
write_to_output(d, "Current description:\r\n%s", d->character->player.description);
|
write_to_output(d, "Current description:\r\n%s", d->character->player.description);
|
||||||
/* Don't free this now... so that the old description gets loaded as the
|
/* Don't free this now... so that the old description gets loaded as the
|
||||||
* current buffer in the editor. Do setup the ABORT buffer here, however. */
|
* current buffer in the editor. Do setup the ABORT buffer here, however. */
|
||||||
d->backstr = strdup(d->character->player.description);
|
d->backstr = strdup(d->character->player.description);
|
||||||
}
|
}
|
||||||
|
|
@ -1605,7 +1608,7 @@ void nanny(struct descriptor_data *d, char *arg)
|
||||||
SET_BIT_AR(PLR_FLAGS(d->character), PLR_DELETED);
|
SET_BIT_AR(PLR_FLAGS(d->character), PLR_DELETED);
|
||||||
save_char(d->character);
|
save_char(d->character);
|
||||||
Crash_delete_file(GET_NAME(d->character));
|
Crash_delete_file(GET_NAME(d->character));
|
||||||
/* If the selfdelete_fastwipe flag is set (in config.c), remove all the
|
/* If the selfdelete_fastwipe flag is set (in config.c), remove all the
|
||||||
* player's immediately. */
|
* player's immediately. */
|
||||||
if (selfdelete_fastwipe)
|
if (selfdelete_fastwipe)
|
||||||
if ((player_i = get_ptable_by_name(GET_NAME(d->character))) >= 0) {
|
if ((player_i = get_ptable_by_name(GET_NAME(d->character))) >= 0) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue