Go to the documentation of this file.
29 #ifndef PLUGIN_COMMON_H
30 #define PLUGIN_COMMON_H
33 #define CF_PLUGIN __declspec(dllexport)
35 #ifdef HAVE_VISIBILITY
36 #define CF_PLUGIN __attribute__((visibility("default")))
44 #define PLUGIN_ERROR_INT 0x0FFFFF
67 extern const char *
cf_re_cmp(
const char *
str,
const char *regexp);
152 extern object *
cf_object_split(
object *orig_ob, uint32_t nr,
char *err,
size_t size);
void cf_cost_string_from_value(uint64_t cost, int largest_coin, char *buffer, int length)
region * cf_map_get_region_property(mapstruct *map, int propcode)
void cf_log(LogLevel logLevel, const char *format,...)
sstring cf_query_name_pl(object *ob)
int cf_map_get_height(mapstruct *map)
object * cf_object_check_for_spell(object *op, const char *name)
const char * cf_get_weekday_name(int index)
int cf_region_get_jail_y(region *reg)
sstring cf_add_string(const char *str)
mapstruct * cf_map_get_first(void)
sstring cf_map_get_sstring_property(mapstruct *map, int propcode)
const char * cf_get_directory(int id)
int cf_object_get_weight(object *ob)
int cf_map_get_int_property(mapstruct *map, int property)
void cf_player_set_marked_item(object *op, object *ob)
int cf_map_get_players(mapstruct *map)
int cf_object_teleport(object *ob, mapstruct *map, int x, int y)
const char * cf_party_get_name(partylist *party)
int cf_object_out_of_map(object *op, int x, int y)
const char * cf_get_season_name(int index)
char * cf_object_get_string_property(object *op, int propcode, char *buf, int size)
long cf_object_get_long_property(object *op, long propcode)
void cf_object_apply_below(object *pl)
sstring cf_archetype_get_name(archetype *arch)
archetype * cf_archetype_get_first(void)
sstring cf_object_get_sstring_property(object *op, int propcode)
int cf_player_knowledge_has(object *op, const char *knowledge)
arch
DIALOGCHECK MINARGS 1 MAXARGS 1
int cf_object_query_cost(const object *tmp, object *who, int flag)
object * cf_object_get_object_property(object *op, int propcode)
int cf_object_cast_spell(object *op, object *caster, int dir, object *spell_ob, char *stringarg)
void cf_fix_object(object *op)
const char * cf_region_get_jail_path(region *reg)
void cf_player_knowledge_give(object *op, const char *knowledge)
char * cf_strdup_local(const char *str)
object * cf_create_object_by_name(const char *name)
int cf_map_get_reset_time(mapstruct *map)
char * cf_query_name(object *ob, char *name, int size)
object * cf_map_insert_object_around(mapstruct *where, object *op, int x, int y)
void cf_object_set_float_property(object *op, int propcode, float value)
player * cf_party_get_first_player(partylist *party)
int cf_timer_destroy(int id)
Crossfire Protocol most of the time after the actual code was already omit certain important and possibly make life miserable any new developer or curious player should be able to find most of the relevant information here If inconsistencies are found or this documentation proves to be consider the latest server side protocol code in the public source code repository as the authoritative reference Introduction If you were ever curious enough to telnet or netcat to a Crossfire chances are you were sorely disappointed While the protocol may seem to use plain text at it actually uses a mix of ASCII and binary data This handbook attempts to document various aspects of the Crossfire protocol As consult the README file to find out how to get in touch with helpful people via mailing and more History the communications plan was set to be a text based system It was up to the server and client to parse these messages and determine what to do These messages were assumed to be line per message At a reasonably early stage of Eric Anderson wrote a then the data itself you could send many data and after the other end could decode these commands This works fairly but I think the creation of numerous sub packets has some performance hit the eutl was not especially well so writing a client for a different platform became more Eric left to work on other products shortly after writing his which didn t really leave anyone with a full understanding of the socket code I have decided to remove the eutl dependency At least one advantage is that having this network related code directly in the client and server makes error handling a bit easier cleaner Packet Format the outside packet method the byte size for the size information is not included here Eutl originally used bytes for the size to bytes seems it makes a least some sense The actual data is something of the nature of the commands listed below It is a text command
non standard information is not specified or uptime this means how long since the executable has been started A particular host may have been running a server for quite a long time
int cf_object_apply(object *op, object *author, int flags)
knowledge
DIALOGCHECK MINARGS 1 MAXARGS 1
region * cf_region_get_next(region *reg)
int64_t cf_object_get_int64_property(object *op, int propcode)
int cf_object_move_to(object *op, int x, int y)
void cf_object_free_drop_inventory(object *ob)
static const flag_definition flags[]
int cf_player_can_pay(object *op)
sstring cf_find_string(const char *str)
linux kernel c mode(defun linux-c-mode() "C mode with adjusted defaults for use with the Linux kernel."(interactive)(c-mode)(c-set-style "K&R")(setq c-basic-offset 8))
void cf_object_set_string_property(object *op, int propcode, const char *value)
int64_t cf_object_perm_exp(object *op)
void cf_quest_set_player_state(object *pl, sstring quest_code, int state)
int cf_map_get_light(mapstruct *map)
object * cf_map_insert_object(mapstruct *where, object *op, int x, int y)
int cf_player_arrest(object *who)
int cf_player_move(player *pl, int dir)
partylist * cf_party_get_next(partylist *party)
object * cf_archetype_get_clone(archetype *arch)
void cf_player_set_title(object *op, const char *title)
void cf_spring_trap(object *trap, object *victim)
const char * cf_object_get_msg(object *)
int cf_object_pay_amount(object *pl, uint64_t to_pay)
Plugin animator file specs[Config] name
int cf_object_change_abil(object *op, object *tmp)
int cf_object_set_key(object *op, const char *keyname, const char *value, int add_key)
void cf_system_get_region_vector(int property, std::vector< region * > *list)
void cf_quest_start(object *pl, sstring quest_code, int state)
region * cf_region_get_parent(region *reg)
static event_registration m
archetype * cf_archetype_get_more(archetype *arch)
int cf_object_set_animation(object *op, const char *animation)
void cf_log_plain(LogLevel logLevel, const char *message)
partylist * cf_party_get_first(void)
partylist * cf_player_get_party(object *op)
void cf_object_say(object *op, const char *msg)
object * cf_map_get_object_at(mapstruct *m, int x, int y)
int cf_timer_create(object *ob, long delay, int mode)
object * cf_identify(object *op)
void cf_object_set_int64_property(object *op, int propcode, int64_t value)
int cf_find_face(const char *name, int error)
object * cf_map_insert_object_there(object *op, mapstruct *m, object *originator, int flag)
void(* f_plug_api)(int *type,...)
int cf_map_get_enter_y(mapstruct *map)
void cf_system_unregister_global_event(int event, const char *name)
const char * cf_get_month_name(int index)
int cf_init_plugin(f_plug_api getHooks)
MoveType cf_object_get_movetype_property(object *op, int propcode)
object * cf_object_find_by_arch_name(const object *who, const char *name)
mapstruct * cf_object_get_map_property(object *op, int propcode)
int cf_object_query_money(const object *op)
const char * cf_region_get_longname(region *reg)
mapstruct * cf_get_empty_map(int sizex, int sizey)
region * cf_region_get_first(void)
void cf_map_set_int_property(mapstruct *map, int propcode, int value)
void cf_object_query_cost_string(const object *tmp, object *who, int flag, char *buffer, int length)
partylist * cf_object_get_partylist_property(object *op, int propcode)
int cf_object_get_nrof(object *)
void cf_object_set_weight_limit(object *ob, int weight)
object * cf_object_clone(object *op, int clonetype)
TIPS on SURVIVING Crossfire is populated with a wealth of different monsters These monsters can have varying immunities and attack types In some of them can be quite a bit smarter than others It will be important for new players to learn the abilities of different monsters and learn just how much it will take to kill them This section discusses how monsters can interact with players Most monsters in the game are out to mindlessly kill and destroy the players These monsters will help boost a player s after he kills them When fighting a large amount of monsters in a single attempt to find a narrower hallway so that you are not being attacked from all sides Charging into a room full of Beholders for instance would not be open the door and fight them one at a time For there are several maps designed for them Find these areas and clear them out All throughout these a player can find signs and books which they can read by stepping onto them and hitting A to apply the book sign These messages will help the player to learn the system One more always keep an eye on your food If your food drops to your character will soon so BE CAREFUL ! NPCs Non Player Character are special monsters which have intelligence Players may be able to interact with these monsters to help solve puzzles and find items of interest To speak with a monster you suspect to be a simply move to an adjacent square to them and push the double ie Enter your message
with a maximum of six This is not so if you are wearing plate you receive no benefit Armour is additive with all the supplementry forms of which means that it lasts until the next semi permanent spell effect is cast upon the character spell
double cf_object_get_double_property(object *op, int propcode)
void cf_map_message(mapstruct *m, const char *msg, int color)
int cf_map_get_reset_timeout(mapstruct *map)
int cf_object_get_flag(object *ob, int flag)
void cf_object_drop(object *op, object *author)
int cf_map_get_enter_x(mapstruct *map)
mapstruct * cf_map_get_map_property(mapstruct *map, int propcode)
int cf_object_transfer(object *op, int x, int y, int randomly, object *originator)
TIPS on SURVIVING Crossfire is populated with a wealth of different monsters These monsters can have varying immunities and attack types In some of them can be quite a bit smarter than others It will be important for new players to learn the abilities of different monsters and learn just how much it will take to kill them This section discusses how monsters can interact with players Most monsters in the game are out to mindlessly kill and destroy the players These monsters will help boost a player s after he kills them When fighting a large amount of monsters in a single attempt to find a narrower hallway so that you are not being attacked from all sides Charging into a room full of Beholders for instance would not be open the door and fight them one at a time For there are several maps designed for them Find these areas and clear them out All throughout these a player can find signs and books which they can read by stepping onto them and hitting A to apply the book sign These messages will help the player to learn the system One more always keep an eye on your food If your food drops to your character will soon so BE CAREFUL ! NPCs Non Player Character are special monsters which have intelligence Players may be able to interact with these monsters to help solve puzzles and find items of interest To speak with a monster you suspect to be a simply move to an adjacent square to them and push the double ie Enter your and press< Return > You can also use say if you feel like typing a little extra Other NPCs may not speak to but display intelligence with their movement Some monsters can be and may attack the nearest of your enemies Others can be in that they follow you around and help you in your quest to kill enemies and find treasure SPECIAL ITEMS There are many special items which can be found in of these the most important may be the signs all a player must do is apply the handle In the case of the player must move items over the button to hold it down Some of the larger buttons may need very large items to be moved onto before they can be activated Gates and locked but be for you could fall down into a pit full of ghosts or dragons and not be able to get back out Break away sometimes it may be worth a player s time to test the walls of a map for secret doors Fire such as missile weapons and spells you will notice them going up in smoke ! So be careful not to destroy valuable items Spellbooks sometimes a player can learn the other times they cannot There are many different types of books and scrolls out there Improve item have lower weight
void cf_object_set_movetype_property(object *op, int propcode, MoveType value)
int cf_map_get_flags(mapstruct *oldmap, mapstruct **newmap, int16_t x, int16_t y, int16_t *nx, int16_t *ny)
void cf_free_string(sstring str)
const char * cf_region_get_message(region *reg)
int cf_random_map_set_variable(RMParms *rp, const char *buf)
object * cf_object_present_archname_inside(object *op, char *whatstr)
object * cf_object_find_by_name(const object *who, const char *name)
void cf_object_pickup(object *op, object *what)
int cf_region_get_jail_x(region *reg)
archetype * cf_object_get_archetype_property(object *op, int propcode)
object * cf_player_get_marked_item(object *op)
command_registration cf_system_register_command_extra(const char *name, const char *extra, command_function_extra func, uint8_t command_type, float time)
void cf_map_set_string_property(mapstruct *map, int propcode, const char *value)
object * cf_object_insert_in_ob(object *op, object *where)
int cf_object_user_event(object *op, object *activator, object *third, const char *message, int fix)
int cf_object_move(object *op, int dir, object *originator)
void cf_system_get_object_vector(int property, std::vector< object * > *list)
object * cf_object_split(object *orig_ob, uint32_t nr, char *err, size_t size)
void cf_system_register_global_event(int event, const char *name, f_plug_event hook)
command_registration cf_system_register_command(const char *name, command_function func, uint8_t command_type, float time)
void cf_player_set_party(object *op, partylist *party)
int cf_find_animation(const char *txt)
void cf_object_set_weight(object *ob, int weight)
archetype * cf_archetype_get_next(archetype *arch)
const char * cf_get_periodofday_name(int index)
void cf_map_trigger_connected(objectlink *ol, object *cause, int state)
void cf_object_set_flag(object *ob, int flag, int value)
void cf_system_get_map_vector(int property, std::vector< mapstruct * > *list)
int(* f_plug_event)(int *type,...)
const typedef char * sstring
const char * cf_region_get_name(region *reg)
int cf_object_set_nrof(object *, int nrof)
mapstruct * cf_map_has_been_loaded(const char *name)
const char * cf_re_cmp(const char *str, const char *regexp)
Python Guilds Quick outline Add a guild(mapmakers) this is still a problem *after dropping the token to gain access to the stove a woodfloor now appears which is Toolshed Token(found in Guild_HQ) *Note also have multiple gates in place to protect players and items from the mana explosion drop x for Jewelers room *Jewelers room works just need to determine what x is drop x for Thaumaturgy room *Thaumaturgy room works just need to determine what x is drop gold dropping the Firestar named fearless allows access to but I suspect that the drop location of the chest is not as intended because the player is in the way once you enter the chest the exit back to the basement is things such as the message et al reside on teleporters which then transport items to the map as they are when the map is already purchased items reappear in that area From my this does not cause any problems at the moment But this should be corrected fixed Major it s now possible to buy guilds Ryo Update Uploaded guild package to CVS Changes the cauldrons and the charging room I spent a while agonizing over They were natural guild enhancements but much too much value for any reasonable expense to buy them Then I thought that they should be pay access but at a greatly reduced rate SO when you buy a forge or whatever for your guild it is available on a perplayer daily rate but it will be accessable for testing and to DMs to play with Like I said lots still to do with the especially comingt up with quest items for buying things like the new workshops and stuff One of the things I would like some input on would be proposals for additional fields for either the guildhouses or guild datafiles to play with Currently the Guildhouse but there is no reason we can t have more than one measure of a guild perhaps have dues relate to Dues and use points for some other suspended or inactive or when a guild is founded inactive active Guilds have the format
int cf_object_check_trigger(object *op, object *cause)
int cf_quest_get_player_state(object *pl, sstring quest_code)
void cf_object_set_long_property(object *op, int propcode, long value)
object * cf_create_object(void)
char * cf_get_maps_directory(const char *name, char *buf, int size)
const char * cf_object_get_key(object *op, const char *keyname)
void cf_system_get_archetype_vector(int property, std::vector< archetype * > *list)
player * cf_player_find(const char *plname)
object * cf_friendlylist_get_next(object *ob)
const char * cf_party_get_password(partylist *party)
char * cf_player_get_title(object *op, char *title, int size)
void cf_system_unregister_command(command_registration command)
archetype * cf_archetype_get_head(archetype *arch)
void(* command_function_extra)(object *op, const char *params, const char *extra)
int cf_map_get_difficulty(mapstruct *map)
player * cf_party_get_next_player(partylist *party, player *op)
int cf_object_set_face(object *op, const char *face)
event
DIALOGCHECK MINARGS 1 MAXARGS 2
uint64_t command_registration
int cf_map_get_darkness(mapstruct *map)
void cf_player_message(object *op, const char *txt, int flags)
mapstruct * cf_map_get_map(const char *name, int flags)
object * cf_object_change_map(object *op, mapstruct *m, object *originator, int flag, int x, int y)
mapstruct * cf_random_map_generate(const char *OutFileName, RMParms *RP, char **use_layout, sstring reset_group)
void cf_object_forget_spell(object *op, object *sp)
int cf_object_pay_item(object *op, object *pl)
int cf_object_get_weight_limit(object *ob)
void cf_system_get_party_vector(int property, std::vector< partylist * > *list)
object * cf_object_insert_object(object *op, object *container)
int16_t cf_object_get_resistance(object *op, int rtype)
void cf_object_set_int_property(object *op, int propcode, int value)
void cf_object_update(object *op, int flags)
object * cf_friendlylist_get_first(void)
void cf_object_remove(object *op)
void(* command_function)(object *op, const char *params)
void cf_object_change_exp(object *op, int64_t exp, const char *skill_name, int flag)
sstring cf_player_get_ip(object *op)
void cf_object_set_object_property(object *op, int propcode, object *value)
object * cf_map_find_by_archetype_name(const char *str, mapstruct *map, int nx, int ny)
void cf_object_learn_spell(object *op, object *spell, int special_prayer)
int cf_map_get_width(mapstruct *map)
int cf_object_get_int_property(object *op, int propcode)
int cf_quest_was_completed(object *pl, sstring quest_code)
float cf_object_get_float_property(object *op, int propcode)
int cf_map_change_light(mapstruct *m, int change)
void cf_get_time(timeofday_t *tod)
void cf_object_set_resistance(object *op, int rtype, int16_t value)
int cf_object_remove_depletion(object *op, int level)