- Fixed the server crashing on startup due to bad define
- Fixed the server crashing on a timer-queued disguise / undisguise (no sd check) - re-added the item_group_list for consistency's sake, moved to itemdb.h (after some hacking to remove the ugly map.h dependency) - Removed some overly verbose item group messages & code git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@10112 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
parent
37d8d915b2
commit
dec82b6120
@ -9,11 +9,11 @@
|
|||||||
#include "../common/malloc.h"
|
#include "../common/malloc.h"
|
||||||
#include "../common/showmsg.h"
|
#include "../common/showmsg.h"
|
||||||
#include "../common/strlib.h"
|
#include "../common/strlib.h"
|
||||||
#include "map.h"
|
|
||||||
#include "battle.h"
|
|
||||||
#include "itemdb.h"
|
#include "itemdb.h"
|
||||||
#include "script.h"
|
#include "map.h"
|
||||||
#include "pc.h"
|
#include "battle.h" // struct battle_config
|
||||||
|
#include "script.h" // item script processing
|
||||||
|
#include "pc.h" // W_MUSICAL, W_WHIP
|
||||||
|
|
||||||
static struct dbt* item_db;
|
static struct dbt* item_db;
|
||||||
|
|
||||||
@ -103,19 +103,18 @@ int itemdb_searchrandomid(int group)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*==========================================
|
/*==========================================
|
||||||
* Calculates total item-group related bonuses for the given item. [Skotlex]
|
* Calculates total item-group related bonuses for the given item
|
||||||
*------------------------------------------
|
*------------------------------------------*/
|
||||||
*/
|
int itemdb_group_bonus(const int itemgrouphealrate[MAX_ITEMGROUP], int itemid)
|
||||||
int itemdb_group_bonus(struct map_session_data *sd, int itemid)
|
|
||||||
{
|
{
|
||||||
int bonus = 0, i, j;
|
int bonus = 0, i, j;
|
||||||
for (i=0; i < MAX_ITEMGROUP; i++) {
|
for (i=0; i < MAX_ITEMGROUP; i++) {
|
||||||
if (!sd->itemgrouphealrate[i])
|
if (itemgrouphealrate[i])
|
||||||
continue;
|
continue;
|
||||||
for (j=0; j < itemgroup_db[i].qty; j++) {
|
for (j=0; j < itemgroup_db[i].qty; j++) {
|
||||||
if (itemgroup_db[i].nameid[j] == itemid)
|
if (itemgroup_db[i].nameid[j] == itemid)
|
||||||
{
|
{
|
||||||
bonus += sd->itemgrouphealrate[i];
|
bonus += itemgrouphealrate[i];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -447,8 +446,7 @@ static int itemdb_read_itemavail (void)
|
|||||||
|
|
||||||
/*==========================================
|
/*==========================================
|
||||||
* read item group data
|
* read item group data
|
||||||
*------------------------------------------
|
*------------------------------------------*/
|
||||||
*/
|
|
||||||
static void itemdb_read_itemgroup_sub(const char* filename)
|
static void itemdb_read_itemgroup_sub(const char* filename)
|
||||||
{
|
{
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
@ -498,7 +496,7 @@ static void itemdb_read_itemgroup_sub(const char* filename)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
k = atoi(str[2]);
|
k = atoi(str[2]);
|
||||||
if (itemgroup_db[groupid].qty+k > MAX_RANDITEM) {
|
if (itemgroup_db[groupid].qty+k >= MAX_RANDITEM) {
|
||||||
ShowWarning("itemdb_read_itemgroup: Group %d is full (%d entries) in %s:%d\n", groupid, MAX_RANDITEM, filename, ln);
|
ShowWarning("itemdb_read_itemgroup: Group %d is full (%d entries) in %s:%d\n", groupid, MAX_RANDITEM, filename, ln);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -512,52 +510,11 @@ static void itemdb_read_itemgroup_sub(const char* filename)
|
|||||||
static void itemdb_read_itemgroup(void)
|
static void itemdb_read_itemgroup(void)
|
||||||
{
|
{
|
||||||
char path[256];
|
char path[256];
|
||||||
int i;
|
|
||||||
const char* groups[] = {
|
|
||||||
"Blue Box",
|
|
||||||
"Violet Box",
|
|
||||||
"Card Album",
|
|
||||||
"Gift Box",
|
|
||||||
"Scroll Box",
|
|
||||||
"Finding Ore",
|
|
||||||
"Cookie Bag",
|
|
||||||
"Potion",
|
|
||||||
"Herbs",
|
|
||||||
"Fruits",
|
|
||||||
"Meat",
|
|
||||||
"Candy",
|
|
||||||
"Juice",
|
|
||||||
"Fish",
|
|
||||||
"Boxes",
|
|
||||||
"Gemstone",
|
|
||||||
"Jellopy",
|
|
||||||
"Ore",
|
|
||||||
"Food",
|
|
||||||
"Recovery",
|
|
||||||
"Minerals",
|
|
||||||
"Taming",
|
|
||||||
"Scrolls",
|
|
||||||
"Quivers",
|
|
||||||
"Masks",
|
|
||||||
"Accesory",
|
|
||||||
"Jewels",
|
|
||||||
"Gift Box 1",
|
|
||||||
"Gift Box 2",
|
|
||||||
"Gift Box 3",
|
|
||||||
"Gift Box 4",
|
|
||||||
"Egg Boy",
|
|
||||||
"Egg Girl",
|
|
||||||
"Gift Box China",
|
|
||||||
"Lotto Box",
|
|
||||||
};
|
|
||||||
memset(&itemgroup_db, 0, sizeof(itemgroup_db));
|
|
||||||
snprintf(path, 255, "%s/item_group_db.txt", db_path);
|
snprintf(path, 255, "%s/item_group_db.txt", db_path);
|
||||||
|
|
||||||
|
memset(&itemgroup_db, 0, sizeof(itemgroup_db));
|
||||||
itemdb_read_itemgroup_sub(path);
|
itemdb_read_itemgroup_sub(path);
|
||||||
ShowStatus("Done reading '"CL_WHITE"%s"CL_RESET"'.\n", "item_group_db.txt");
|
ShowStatus("Done reading '"CL_WHITE"%s"CL_RESET"'.\n", "item_group_db.txt");
|
||||||
if (battle_config.etc_log) {
|
|
||||||
for (i = 1; i < MAX_ITEMGROUP; i++)
|
|
||||||
ShowInfo("Group %s: %d entries.\n", groups[i-1], itemgroup_db[i].qty);
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,6 +9,8 @@
|
|||||||
#include "../common/mapindex.h"
|
#include "../common/mapindex.h"
|
||||||
#include "../common/db.h"
|
#include "../common/db.h"
|
||||||
|
|
||||||
|
#include "itemdb.h" // MAX_ITEMGROUP
|
||||||
|
|
||||||
//Uncomment to enable the Cell Stack Limit mod.
|
//Uncomment to enable the Cell Stack Limit mod.
|
||||||
//It's only config is the battle_config cell_stack_limit.
|
//It's only config is the battle_config cell_stack_limit.
|
||||||
//Only chars affected are those defined in BL_CHAR (mobs and players currently)
|
//Only chars affected are those defined in BL_CHAR (mobs and players currently)
|
||||||
@ -56,8 +58,6 @@
|
|||||||
#define MOBID_EMPERIUM 1288
|
#define MOBID_EMPERIUM 1288
|
||||||
|
|
||||||
#define MAX_PC_BONUS 10
|
#define MAX_PC_BONUS 10
|
||||||
//Designed for search functions, species max number of matches to display.
|
|
||||||
#define MAX_SEARCH 5
|
|
||||||
#define MAX_DUEL 1024
|
#define MAX_DUEL 1024
|
||||||
|
|
||||||
#define map_id2index(id) map[(id)].index
|
#define map_id2index(id) map[(id)].index
|
||||||
@ -229,10 +229,6 @@ enum {
|
|||||||
ELE_MAX
|
ELE_MAX
|
||||||
};
|
};
|
||||||
|
|
||||||
//The onlu item group required by the code to be known.
|
|
||||||
#define IG_FINDINGORE 6
|
|
||||||
#define MAX_ITEMGROUP 40
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
ATF_SELF=0x01,
|
ATF_SELF=0x01,
|
||||||
ATF_TARGET=0x02,
|
ATF_TARGET=0x02,
|
||||||
|
@ -90,12 +90,12 @@ int npc_enable_sub( struct block_list *bl, va_list ap )
|
|||||||
{
|
{
|
||||||
struct map_session_data *sd;
|
struct map_session_data *sd;
|
||||||
struct npc_data *nd;
|
struct npc_data *nd;
|
||||||
//char *name=(char *)aCallocA(50,sizeof(char)); // fixed [Shinomori]
|
|
||||||
|
|
||||||
nullpo_retr(0, bl);
|
nullpo_retr(0, bl);
|
||||||
nullpo_retr(0, ap);
|
nullpo_retr(0, ap);
|
||||||
nullpo_retr(0, nd=va_arg(ap,struct npc_data *));
|
nullpo_retr(0, nd=va_arg(ap,struct npc_data *));
|
||||||
if(bl->type == BL_PC && (sd=(struct map_session_data *)bl)){
|
if(bl->type == BL_PC && (sd=(struct map_session_data *)bl))
|
||||||
|
{
|
||||||
char name[50]; // need 24 + 9 for the "::OnTouch"
|
char name[50]; // need 24 + 9 for the "::OnTouch"
|
||||||
|
|
||||||
if (nd->sc.option&OPTION_INVISIBLE) // 無効化されている
|
if (nd->sc.option&OPTION_INVISIBLE) // 無効化されている
|
||||||
@ -2136,7 +2136,8 @@ static int npc_parse_script(char *w1,char *w2,char *w3,char *w4,char *first_line
|
|||||||
|
|
||||||
//-----------------------------------------
|
//-----------------------------------------
|
||||||
// イベント用ラベルデータのエクスポート
|
// イベント用ラベルデータのエクスポート
|
||||||
for (i = 0; i < nd->u.scr.label_list_num; i++){
|
for (i = 0; i < nd->u.scr.label_list_num; i++)
|
||||||
|
{
|
||||||
char *lname = nd->u.scr.label_list[i].name;
|
char *lname = nd->u.scr.label_list[i].name;
|
||||||
int pos = nd->u.scr.label_list[i].pos;
|
int pos = nd->u.scr.label_list[i].pos;
|
||||||
|
|
||||||
@ -2149,11 +2150,9 @@ static int npc_parse_script(char *w1,char *w2,char *w3,char *w4,char *first_line
|
|||||||
exit(1);
|
exit(1);
|
||||||
} else {
|
} else {
|
||||||
struct event_data *ev;
|
struct event_data *ev;
|
||||||
unsigned char buf[51];
|
unsigned char buf[50+1]; // 24 for npc name + 24 for label + 2 for a "::" and 1 for EOS
|
||||||
// 51 comes from: 24 for npc name + 24 for label + 2 for a "::" and 1 for EOS
|
|
||||||
sprintf(buf,"%s::%s",nd->exname,lname);
|
sprintf(buf,"%s::%s",nd->exname,lname);
|
||||||
|
|
||||||
// remember the label is max 50 chars + eos; see the strdb_init below
|
|
||||||
// generate the data and insert it
|
// generate the data and insert it
|
||||||
ev=(struct event_data *)aMalloc(sizeof(struct event_data));
|
ev=(struct event_data *)aMalloc(sizeof(struct event_data));
|
||||||
ev->nd=nd;
|
ev->nd=nd;
|
||||||
|
@ -37,7 +37,7 @@ struct view_data* npc_get_viewdata(int class_);
|
|||||||
int npc_chat_sub(struct block_list *bl, va_list ap);
|
int npc_chat_sub(struct block_list *bl, va_list ap);
|
||||||
int npc_event_dequeue(struct map_session_data *sd);
|
int npc_event_dequeue(struct map_session_data *sd);
|
||||||
int npc_event_timer(int tid,unsigned int tick,int id,int data);
|
int npc_event_timer(int tid,unsigned int tick,int id,int data);
|
||||||
int npc_event(struct map_session_data *sd,const unsigned char *npcname,int);
|
int npc_event(struct map_session_data *sd, const unsigned char *eventname, int mob_kill);
|
||||||
int npc_timer_event(const unsigned char *eventname); // Added by RoVeRT
|
int npc_timer_event(const unsigned char *eventname); // Added by RoVeRT
|
||||||
int npc_command(struct map_session_data* sd, const char* npcname, const char* command);
|
int npc_command(struct map_session_data* sd, const char* npcname, const char* command);
|
||||||
int npc_touch_areanpc(struct map_session_data *,int,int,int);
|
int npc_touch_areanpc(struct map_session_data *,int,int,int);
|
||||||
|
@ -10134,33 +10134,32 @@ BUILDIN_FUNC(clearitem)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*==========================================
|
/*==========================================
|
||||||
Disguise Player (returns Mob/NPC ID if success, 0 on fail) [Lupus]
|
* Disguise Player (returns Mob/NPC ID if success, 0 on fail)
|
||||||
*------------------------------------------
|
*------------------------------------------*/
|
||||||
*/
|
|
||||||
BUILDIN_FUNC(disguise)
|
BUILDIN_FUNC(disguise)
|
||||||
{
|
{
|
||||||
struct map_session_data *sd=script_rid2sd(st);
|
|
||||||
int id;
|
int id;
|
||||||
|
struct map_session_data* sd = script_rid2sd(st);
|
||||||
|
if (sd == NULL) return 0;
|
||||||
|
|
||||||
id = script_getnum(st,2);
|
id = script_getnum(st,2);
|
||||||
|
|
||||||
if (!mobdb_checkid(id) && !npcdb_checkid(id)) {
|
if (mobdb_checkid(id) || npcdb_checkid(id)) {
|
||||||
script_pushint(st,0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
pc_disguise(sd, id);
|
pc_disguise(sd, id);
|
||||||
script_pushint(st,id);
|
script_pushint(st,id);
|
||||||
|
} else
|
||||||
|
script_pushint(st,0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*==========================================
|
/*==========================================
|
||||||
Undisguise Player (returns 1 if success, 0 on fail) [Lupus]
|
* Undisguise Player (returns 1 if success, 0 on fail)
|
||||||
*------------------------------------------
|
*------------------------------------------*/
|
||||||
*/
|
|
||||||
BUILDIN_FUNC(undisguise)
|
BUILDIN_FUNC(undisguise)
|
||||||
{
|
{
|
||||||
struct map_session_data* sd = script_rid2sd(st);
|
struct map_session_data* sd = script_rid2sd(st);
|
||||||
|
if (sd == NULL) return 0;
|
||||||
|
|
||||||
if (sd->disguise) {
|
if (sd->disguise) {
|
||||||
pc_disguise(sd, 0);
|
pc_disguise(sd, 0);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user