Jump to content
  • 0

How to make campfire system work?


JaranSwitch0101

Question


  • Group:  Members
  • Topic Count:  11
  • Topics Per Day:  0.01
  • Content Count:  59
  • Reputation:   5
  • Joined:  07/02/18
  • Last Seen:  

When  @Emistry  share it,I was very excited 

When i add system for my server,i don't know where i'm wrong?

My npc.cpp,before add the source

http://001.jpg

My npc.cpp after add the source

http://002.jpg

My npc.hpp:

http://003.jpg

My script.inc:

// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
// For more information, see LICENCE in the main folder

/**
 * Custom Script Commands
 * Place the body of custom script commands in this file.
 * Format:
 *	BUILDIN_FUNC(command_name)
 *	{
 *		<code>;
 *	}
 **/

//BUILDIN_FUNC(example)
//{
//	ShowInfo("buildin_example: It works!\n");
//	script_pushint(st,1);
//	return 0;
//}

/*==========================================
 * Duplicate any npc on live server
 * duplicatenpc "<Source NPC name>","<New NPC shown name>","<New NPC hidden name>","<mapname>",<map_x>,<map_y>,<dir>{, spriteid{, map_xs, map_ys}}};
 *------------------------------------------*/
BUILDIN_FUNC(duplicatenpc)
{
   int map_x = script_getnum(st, 6);
   int map_y = script_getnum(st, 7);
   int dir = script_getnum(st, 8);
   int spriteid, map_xs = -1, map_ys = -1, sourceid, type, mapid, i;
   const char *sourcename = script_getstr(st, 2);
   const char *new_shown_name = script_getstr(st, 3);
   const char *new_hidden_name = script_getstr(st, 4);
   const char *mapname = script_getstr(st, 5);

   char new_npc_name[24] = "";
   struct npc_data *nd_source, *nd_target;

   if(script_hasdata(st, 10))
       map_xs = (script_getnum(st, 10) < -1) ? -1 : script_getnum(st, 10);

   if(script_hasdata(st, 11))
       map_ys = (script_getnum(st, 11) < -1) ? -1 : script_getnum(st, 10);

   if(map_xs == -1 && map_ys != -1)
       map_xs = 0;

   if(map_xs != - 1 && map_ys == -1)
       map_ys = 0;

   if(strlen(new_shown_name) + strlen(new_hidden_name) > NAME_LENGTH) {
       ShowError("buildin_duplicatenpc: New NPC shown name + New NPC hidden name is too long (max %d chars). (%s)\n", sourcename, NAME_LENGTH);
       script_pushint(st, 0);
       return SCRIPT_CMD_FAILURE;
   }

   nd_source = npc_name2id(sourcename);

   if(script_hasdata(st, 9))
       spriteid = (script_getnum(st, 9) < -1) ? -1 : script_getnum(st, 9);
   else
       spriteid = nd_source->class_;

   if(nd_source == NULL) {
       ShowError("buildin_duplicatenpc: original npc not found for duplicate. (%s)\n", sourcename);
       script_pushint(st, 0);
       return SCRIPT_CMD_FAILURE;
   }
  
   sourceid = nd_source->bl.id;
   type = nd_source->subtype;
   mapid = map_mapname2mapid(mapname);

   if(mapid < 0) {
       ShowError("buildin_duplicatenpc: target map not found. (%s)\n", mapname);
       script_pushint(st, 0);
       return SCRIPT_CMD_FAILURE;
   }

   CREATE(nd_target, struct npc_data, 1);
  
   strcat(new_npc_name, new_shown_name);
   strncat(new_npc_name, "#", 1);
   strncat(new_npc_name, new_hidden_name, strlen(new_hidden_name));

   safestrncpy(nd_target->name, new_npc_name , sizeof(nd_target->name));
   safestrncpy(nd_target->exname, new_npc_name, sizeof(nd_target->exname));

   nd_target->bl.prev = nd_target->bl.next = NULL;
   nd_target->bl.m = mapid;
   nd_target->bl.x = map_x;
   nd_target->bl.y = map_y;
   nd_target->bl.id = npc_get_new_npc_id();
   nd_target->class_ = spriteid;
   nd_target->speed = 200;
   nd_target->src_id = sourceid;
   nd_target->bl.type = BL_NPC;
   nd_target->subtype = (enum npc_subtype)type;

   switch(type) {
       case NPCTYPE_SCRIPT:
           nd_target->u.scr.xs = map_xs;
           nd_target->u.scr.ys = map_ys;
           nd_target->u.scr.script = nd_source->u.scr.script;
           nd_target->u.scr.label_list = nd_source->u.scr.label_list;
           nd_target->u.scr.label_list_num = nd_source->u.scr.label_list_num;
           break;
       case NPCTYPE_SHOP:
       case NPCTYPE_CASHSHOP:
       case NPCTYPE_ITEMSHOP:
       case NPCTYPE_POINTSHOP:
       case NPCTYPE_MARKETSHOP:
           nd_target->u.shop.shop_item = nd_source->u.shop.shop_item;
           nd_target->u.shop.count = nd_source->u.shop.count;
           break;
       case NPCTYPE_WARP:
           if( !battle_config.warp_point_debug )
               nd_target->class_ = JT_WARPNPC;
           else
               nd_target->class_ = JT_GUILD_FLAG;
           nd_target->u.warp.xs = map_xs;
           nd_target->u.warp.ys = map_ys;
           nd_target->u.warp.mapindex = nd_source->u.warp.mapindex;
           nd_target->u.warp.x = nd_source->u.warp.x;
           nd_target->u.warp.y = nd_source->u.warp.y;
           nd_target->trigger_on_hidden = nd_source->trigger_on_hidden;
           break;
   }

   map_addnpc(mapid, nd_target);
   status_change_init(&nd_target->bl);
   unit_dataset(&nd_target->bl);
   nd_target->ud.dir = dir;
   npc_setcells(nd_target);
   map_addblock(&nd_target->bl);

   if(spriteid >= 0) {
       status_set_viewdata(&nd_target->bl, nd_target->class_);
       clif_spawn(&nd_target->bl);
   }

   strdb_put(npcname_db, nd_target->exname, nd_target);

   if(type == NPCTYPE_SCRIPT) {
       for (i = 0; i < nd_target->u.scr.label_list_num; i++) {
           char* lname = nd_target->u.scr.label_list[i].name;
           int pos = nd_target->u.scr.label_list[i].pos;

           if ((lname[0] == 'O' || lname[0] == 'o') && (lname[1] == 'N' || lname[1] == 'n')) {
               struct event_data* ev;
               char buf[NAME_LENGTH*2+3];
               snprintf(buf, ARRAYLENGTH(buf), "%s::%s", nd_target->exname, lname);

               CREATE(ev, struct event_data, 1);
               ev->nd = nd_target;
               ev->pos = pos;
               if(strdb_put(ev_db, buf, ev))
                   ShowWarning("npc_parse_duplicate : duplicate event %s (%s)\n", buf, nd_target->name);
           }
       }

       for (i = 0; i < nd_target->u.scr.label_list_num; i++) {
           int t = 0, k = 0;
           char *lname = nd_target->u.scr.label_list[i].name;
           int pos = nd_target->u.scr.label_list[i].pos;
           if (sscanf(lname, "OnTimer%d%n", &t, &k) == 1 && lname[k] == '\0') {
               struct npc_timerevent_list *te = nd_target->u.scr.timer_event;
               int j, k = nd_target->u.scr.timeramount;
               if (te == NULL)
                   te = (struct npc_timerevent_list *)aMalloc(sizeof(struct npc_timerevent_list));
               else
                   te = (struct npc_timerevent_list *)aRealloc( te, sizeof(struct npc_timerevent_list) * (k+1) );
               for (j = 0; j < k; j++) {
                   if (te[j].timer > t) {
                       memmove(te+j+1, te+j, sizeof(struct npc_timerevent_list)*(k-j));
                       break;
                   }
               }
               te[j].timer = t;
               te[j].pos = pos;
               nd_target->u.scr.timer_event = te;
               nd_target->u.scr.timeramount++;
           }
       }
       nd_target->u.scr.timerid = INVALID_TIMER;
   }

   script_pushint(st, 1);
   return SCRIPT_CMD_SUCCESS;
}

/*==========================================
 * Remove any npc duplicate on live server
 * duplicateremove "<NPC name>";
 *------------------------------------------*/
BUILDIN_FUNC(duplicateremove)
{
   struct npc_data *nd;

   if(script_hasdata(st, 2)) {
       nd = npc_name2id(script_getstr(st, 2));
       if(nd == NULL) {
           script_pushint(st, -1);
           return SCRIPT_CMD_FAILURE;
       }
   } else
       nd = (struct npc_data *)map_id2bl(st->oid);

   if(!nd->src_id)
       npc_unload_duplicates(nd);
   else
       npc_unload(nd,true);

   script_pushint(st, 1);
   return SCRIPT_CMD_SUCCESS;
}

My script_def.inc:

// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
// For more information, see LICENCE in the main folder

/**
 * Custom Script Commands
 * Place the definition of custom script commands in this file.
 * Format:
 *	BUILDIN_DEF(command_name,"parameters"),
 **/

 //BUILDIN_DEF(example,""),
BUILDIN_DEF(duplicatenpc, "ssssiii???"),
BUILDIN_DEF(duplicateremove, "?"),

My item_db:

902,Tree_Root,Tree Root,2,12,,10,,,,,,,,,,,,,{ callfunc("func_UpdateCampFire", rand(1, 5), 30, rand(1,8)); },{},{}
7035,Matchstick,Matchstick,2,100,,10,,,,,,,,,,,,,{ callfunc("func_CreateCampFire", rand(2, 5), 60, rand(1,10)); },{},{}
7850,Wooden_Block_,Wooden Block,2,20,,100,,,,,,,,,,,,,{ callfunc("func_UpdateCampFire", rand(3, 10), 60, rand(5,15)); },{},{}

When I build for src, I don't see any problems except this when opening the server ...

http://Umah.jpg

and it doesn't work at all without seeing any error messages ? 
Please help,I really like this system 

Edited by JaranSwitch0101
Link to comment
Share on other sites

3 answers to this question

Recommended Posts

  • 0

  • Group:  Members
  • Topic Count:  11
  • Topics Per Day:  0.00
  • Content Count:  81
  • Reputation:   14
  • Joined:  11/17/17
  • Last Seen:  

13 minutes ago, JaranSwitch0101 said:

For only script Campfire,right? It's make script error when open my sever ? 
buit,Thanks for your suggestion! ?

Your campfire script used old getmapxy constant, the new is

*getmapxy("<variable for map name>",<variable for x>,<variable for y>{,<type>,"<search value>"})

Type is the type of object to search for:

BL_PC   - Character object (default)
BL_NPC  - NPC object
BL_PET  - Pet object
BL_HOM  - Homunculus object
BL_MER  - Mercenary object
BL_ELEM - Elemental object

Update all your scripts where it contains getmapxy(.@mapname$, .@mapx, .@mapy, UNITTYPE_***)

You can find out more from https://github.com/rathena/rathena/pull/3890

Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  11
  • Topics Per Day:  0.00
  • Content Count:  81
  • Reputation:   14
  • Joined:  11/17/17
  • Last Seen:  

Hi, you need to change UNITTYPE_PC to BL_PC and UNITTYPE_NPC to BL_NPC

Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  11
  • Topics Per Day:  0.01
  • Content Count:  59
  • Reputation:   5
  • Joined:  07/02/18
  • Last Seen:  

On 3/2/2019 at 11:46 PM, rongmauhong said:

Hi, you need to change UNITTYPE_PC to BL_PC and UNITTYPE_NPC to BL_NPC

For only script Campfire,right? It's make script error when open my sever ? 
buit,Thanks for your suggestion! ?

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...