99Max综合娱乐网站(旧版)

 找回密码
 立即注册
查看: 2867|回复: 7

[教程] 自定义商城点数变量商店系统[第二期]

  [复制链接]

升级   100%

发表于 2013-6-17 11:39:51 | 显示全部楼层 |阅读模式
第五步:
  1.         npc.c
  2.         static const char* npc_parse_shop(char* w1, char* w2, char* w3, char* w4, const char* start, const char* buffer, const char* filepath)
复制代码
在原:
  1.                CREATE(nd, struct npc_data, 1);
  2.                 CREATE(nd->u.shop.shop_item, struct npc_item_list, i);
  3.                 memcpy(nd->u.shop.shop_item, items, sizeof(struct npc_item_list)*i);
  4.                 nd->u.shop.count = i;
  5.                 nd->bl.prev = nd->bl.next = NULL;
  6.                 nd->bl.m = m;
  7.                 nd->bl.x = x;
  8.                 nd->bl.y = y;
  9.                 nd->bl.id = npc_get_new_npc_id();
  10.                 npc_parsename(nd, w3, start, buffer, filepath);
  11.                 nd->class_ = m==-1?-1:atoi(w4);
  12.                 nd->speed = 200;
复制代码
加入:
  1. //========================================================================================
  2.                 //现金商店修改(官方现金商店)
  3.                 if (type == CASHSHOP && !strcasecmp(w2,"cashshop") ){
  4.                         nd->u.shop.cash_var = aStrdup("#CASHPOINTS");
  5.                         nd->u.shop.point_var = aStrdup("#KAFRAPOINTS");
  6.                         nd->u.shop.cash_vartype = 2;
  7.                         nd->u.shop.point_vartype = 2;
  8.                 }
  9.                 else if (type == CASHSHOP) { //Variables were defined as cashshop(<cashpoints>{,<kafrapoints>})
  10.                         char cashvarname_temp[32];
  11.                         char pointvarname_temp[32];
  12.                         if (sscanf(w2,"cashshop(%32[^,],%32[^)])",cashvarname_temp,pointvarname_temp) == 2){
  13.                                 nd->u.shop.cash_var = aStrdup(cashvarname_temp);
  14.                                 nd->u.shop.point_var = aStrdup(pointvarname_temp);
  15.                         }
  16.                         else if (sscanf(w2,"cashshop(%32[^)])",cashvarname_temp) == 1){
  17.                                 nd->u.shop.cash_var = aStrdup(cashvarname_temp);
  18.                                 nd->u.shop.point_var = aStrdup("#KAFRAPOINTS");
  19.                         }
  20.                         else{
  21.                                 nd->u.shop.cash_var = aStrdup("#CASHPOINTS");
  22.                                 nd->u.shop.point_var = aStrdup("#KAFRAPOINTS");
  23.                                 ShowError("npc_parse_shop: 未知的现金商店 w2 "%s", 假设正常的变量\n",w2);
  24.                         }
  25.                         
  26.                         //得到变量性质
  27.                         if (nd->u.shop.cash_var[0] == '#' && nd->u.shop.cash_var[1] == '#')
  28.                                 nd->u.shop.cash_vartype = 1;
  29.                         else if (nd->u.shop.cash_var[0] == '#')
  30.                                 nd->u.shop.cash_vartype = 2;
  31.                         else
  32.                                 nd->u.shop.cash_vartype = 3;

  33.                         
  34.                         if (nd->u.shop.point_var[0] == '#' && nd->u.shop.point_var[1] == '#')
  35.                                 nd->u.shop.point_vartype = 1;
  36.                         else if (nd->u.shop.point_var[0] == '#')
  37.                                 nd->u.shop.point_vartype = 2;
  38.                         else
  39.                                 nd->u.shop.point_vartype = 3;
  40.                 }
  41.         //========================================================================================
  42.    
复制代码
第六步:
  1.        npc.c
  2.         const char* npc_parse_duplicate(char* w1, char* w2, char* w3, char* w4, const char* start, const char* buffer, const char* filepath)
复制代码
原:
  1.               case SHOP:
  2.                 case CASHSHOP:
  3.                         ++npc_shop;
  4.                         nd->u.shop.shop_item = dnd->u.shop.shop_item;
  5.                         nd->u.shop.count = dnd->u.shop.count;
  6.                         break;
复制代码
改:
  1.               case CASHSHOP:
  2.                         nd->u.shop.cash_var = dnd->u.shop.cash_var;
  3.                         nd->u.shop.cash_vartype = dnd->u.shop.cash_vartype;
  4.                         nd->u.shop.point_var = dnd->u.shop.point_var;
  5.                         nd->u.shop.point_vartype = dnd->u.shop.point_vartype;
  6.                 case SHOP:
  7.                         ++npc_shop;
  8.                         nd->u.shop.shop_item = dnd->u.shop.shop_item;
  9.                         nd->u.shop.count = dnd->u.shop.count;
  10.                         break;
复制代码
第七步:
  1.        clif.c
  2.         void clif_cashshop_show(struct map_session_data *sd, struct npc_data *nd)
  3.    
复制代码
原:
  1.                         WFIFOL(fd,4) = sd->cashPoints; // Cash Points
  2.                 #if PACKETVER >= 20070711
  3.                         WFIFOL(fd,8) = sd->kafraPoints; // Kafra Points
复制代码
改:
  1. //==========================================================================================
  2.                         WFIFOL(fd,4) = pc_readregistry(sd,nd->u.shop.cash_var,nd->u.shop.cash_vartype); // 现金点数
  3.                 #if PACKETVER >= 20070711
  4.                         WFIFOL(fd,8) = pc_readregistry(sd,nd->u.shop.point_var,nd->u.shop.point_vartype);; // 卡普拉点数
  5.                         //==========================================================================================
复制代码
第八步:
  1.         clif.c
  2.         void clif_cashshop_ack(struct map_session_data* sd, int error) {
复制代码
原:
  1.                 WFIFOL(fd,2) = sd->cashPoints;
  2.                 #if PACKETVER < 20070711
  3.                         WFIFOW(fd,6) = TOW(error);
  4.                 #else
  5.                         WFIFOL(fd,6) = sd->kafraPoints;
  6.                         WFIFOW(fd,10) = TOW(error);
  7.                 #endif
复制代码
改:
  1.                 WFIFOL(fd,2) = pc_readregistry(sd,nd->u.shop.cash_var,nd->u.shop.cash_vartype);
  2.                 #if PACKETVER < 20070711
  3.                         WFIFOW(fd,6) = TOW(error);
  4.                 #else
  5.                         WFIFOL(fd,6) = pc_readregistry(sd,nd->u.shop.point_var,nd->u.shop.point_vartype);
  6.                         WFIFOW(fd,10) = TOW(error);
  7.                 #endif
复制代码
第九步:
  1.         script.c
复制代码
加入:
  1.        BUILDIN_FUNC(setcashpoints)
  2.         {
  3.                 const char* npcname = script_getstr(st,2);
  4.                 struct npc_data* nd = npc_name2id(npcname);
  5.                 const char* newcashvar = script_getstr(st,3);
  6.                 size_t len;
  7.          
  8.                 if( !nd || nd->subtype != CASHSHOP )
  9.                 {        //Not found.
  10.                         script_pushint(st,0);
  11.                         return 0;
  12.                 }
  13.                
  14.                 len = strlen(newcashvar)+1;
  15.                 if (len < 32){
  16.                         RECREATE(nd->u.shop.cash_var, char, len);
  17.                         memcpy(nd->u.shop.cash_var, newcashvar, len*sizeof(char));
  18.                 }
  19.                 else{ //variable name too long
  20.                         script_pushint(st,0);
  21.                         ShowError("setcashpoints: 无法设置现金变量 %s 到 %s 由于字符长度.\n",npcname,newcashvar);
  22.                         return 0;
  23.                 }

  24.                 if (newcashvar[0] == '#' && newcashvar[1] == '#')
  25.                         nd->u.shop.cash_vartype = 1;
  26.                 else if (newcashvar[0] == '#')
  27.                         nd->u.shop.cash_vartype = 2;
  28.                 else
  29.                         nd->u.shop.cash_vartype = 3;

  30.                 script_pushint(st,1);
  31.                 return 0;
  32.         }

  33.         BUILDIN_FUNC(setfreepoints)
  34.         {
  35.                 const char* npcname = script_getstr(st,2);
  36.                 struct npc_data* nd = npc_name2id(npcname);
  37.                 const char* newcashvar = script_getstr(st,3);
  38.                 size_t len;

  39.                 if( !nd || nd->subtype != CASHSHOP )
  40.                 {        //Not found.
  41.                         script_pushint(st,0);
  42.                         return 0;
  43.                 }
  44.                
  45.                 len = strlen(newcashvar)+1;
  46.                 if (len < 32){
  47.                         RECREATE(nd->u.shop.point_var, char, len);
  48.                         memcpy(nd->u.shop.point_var, newcashvar, len*sizeof(char));
  49.                 }
  50.                 else{ //variable name too long
  51.                         script_pushint(st,0);
  52.                         ShowError("setfreepoints: 无法设置现金变量 %s 到 %s 由于字符长度.\n",npcname,newcashvar);
  53.                         return 0;
  54.                 }

  55.                 if (newcashvar[0] == '#' && newcashvar[1] == '#')
  56.                         nd->u.shop.point_vartype = 1;
  57.                 else if (newcashvar[0] == '#')
  58.                         nd->u.shop.point_vartype = 2;
  59.                 else
  60.                         nd->u.shop.point_vartype = 3;

  61.                 script_pushint(st,1);
  62.                 return 0;
  63.         }
复制代码
  1.         void script_parse_builtin(void) {
复制代码
在原:
  1.                 struct script_function BUILDIN[] = {
复制代码
加入:
  1.                         //自定义商城点数变量
  2.                         BUILDIN_DEF(setcashpoints,"ss"),
  3.                         BUILDIN_DEF(setfreepoints,"ss"),
复制代码
格式:
  1. prontera.gat,147,125,5        cashshop        官方现金商店        89,12210:10 //扣除官方现金点数

  2. prontera.gat,147,125,5        cashshop(jifen)        积分商店        89,12210:10 //扣除自定义的变量(jifen)

  3. 类似于官方的现金商店在官方现金商店的基础上加了()中的变量名
复制代码
此系统主要针对与自定义商店系统
自定义商店系统针对的是玩家的露天商店
而此系统针对的是官方的现金商店
温馨提示:
1. 本站模拟器源于网络,经 99Max.mE 二次开发,仅供个人学习娱乐使用,切勿用于商业用途,否则后果自负!
2. 如需更好体验游戏内容,请前往官方游戏!不具备合法的运营模式,都是强盗,请勿擅自搭建私服!
3. 如本站内容有侵犯您的权益,请发送信息至QQ:372607220 或 EMAIL:372607220@qq.com ,我们会及时删除。

升级   26.4%

发表于 2013-7-21 15:50:59 | 显示全部楼层
靈巧兒大大,能不能再提供多一點您的端源碼教學,
像神鑒系統和裝備鎖定,還有自定義指令,
都很特別!希望能分享一下,感激不盡~!

升级   0%

发表于 2013-7-23 11:27:20 | 显示全部楼层
顶起啊!!!!!!
支持!

升级   63.33%

发表于 2015-8-13 08:58:51 | 显示全部楼层
支持,好东西,学习~

升级   25.8%

发表于 2015-12-22 13:21:21 | 显示全部楼层
好东西,学习~

升级   25.8%

发表于 2015-12-22 13:26:48 | 显示全部楼层

支持,好东西

升级   79.33%

群组: JRO日本客户端

发表于 2019-3-18 14:35:17 | 显示全部楼层
好东西,支持下!

升级   0%

群组: JRO日本客户端

发表于 2020-6-21 06:32:43 | 显示全部楼层
前来学习经验。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|99Max综合娱乐网站(旧版) ( 沪ICP备11024206号-1 )

GMT+8, 2024-5-2 16:08 , Processed in 0.058577 second(s), 25 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表