Skip to content
Permalink
Browse files
* Init 'absolute' script for items that will be executed even in bloc…
…ked maps.

* Corrected Renewal item script that must be as 'absoulte' script.

Signed-off-by: Cydh Ramdh <cydh@pservero.com>
  • Loading branch information
cydh committed Nov 18, 2015
1 parent 057384a commit b8e0e56f3f8d2446bac64607803e2d249e66486f
Showing with 3,473 additions and 1,331 deletions.
  1. +8 −0 db/import-tmpl/item_script.txt
  2. +8 −0 db/pre-re/item_script.txt
  3. +1,328 −1,330 db/re/item_db.txt
  4. +2,053 −0 db/re/item_script.txt
  5. +10 −1 src/common/strlib.c
  6. +2 −0 src/common/strlib.h
  7. +24 −0 src/map/itemdb.c
  8. +1 −0 src/map/itemdb.h
  9. +36 −0 src/map/status.c
  10. +1 −0 vcproj-10/map-server.vcxproj
  11. +1 −0 vcproj-12/map-server.vcxproj
  12. +1 −0 vcproj-13/map-server.vcxproj
@@ -0,0 +1,8 @@
//===== Item Database ========================================
//= Additional Item Bonus Database
//= This script is always working even in blocked maps
//=
//= [Cydh] house.bad@gmail.com
//===== Strcuture ============================================
//= ItemID#{ Script }
//============================================================
@@ -0,0 +1,8 @@
//===== Item Database ========================================
//= Additional Item Bonus Database
//= This script is always working even in blocked maps
//=
//= [Cydh] house.bad@gmail.com
//===== Strcuture ============================================
//= ItemID#{ Script }
//============================================================

Large diffs are not rendered by default.

Large diffs are not rendered by default.

@@ -9,6 +9,10 @@
#include <stdlib.h>


char *__SV_READDB_FILE__;
unsigned int __SV_READDB_LINE__;


#define J_MAX_MALLOC_SIZE 65535

// escapes a string in-place (' -> \' , \ -> \\ , % -> _)
@@ -1006,6 +1010,8 @@ bool sv_readdb(const char* directory, const char* filename, char delim, int minc
fields = (char**)aMalloc(nb_cols*sizeof(char*));
line = (char*)aMalloc(nb_cols*colsize);

__SV_READDB_FILE__ = aStrdup(path);

// process rows one by one
while( fgets(line, maxcols*colsize, fp) )
{
@@ -1039,7 +1045,7 @@ bool sv_readdb(const char* directory, const char* filename, char delim, int minc
ShowError("sv_readdb: Reached the maximum allowed number of entries (%d) when parsing file \"%s\".\n", maxrows, path);
break;
}

__SV_READDB_LINE__ = lines;
// parse this row
if( !parseproc(fields+1, columns, entries) )
{
@@ -1053,6 +1059,9 @@ bool sv_readdb(const char* directory, const char* filename, char delim, int minc
entries++;
}

aFree(__SV_READDB_FILE__);
__SV_READDB_LINE__ = 0;

aFree(fields);
aFree(line);
fclose(fp);
@@ -57,6 +57,8 @@ int strline(const char* str, size_t pos);
/// Returns true on success, false on failure.
bool bin2hex(char* output, unsigned char* input, size_t count);

extern char *__SV_READDB_FILE__;
extern unsigned int __SV_READDB_LINE__;

/// Bitfield determining the behaviour of sv_parse and sv_split.
typedef enum e_svopt
@@ -908,6 +908,27 @@ static bool itemdb_read_flag(char* fields[], int columns, int current) {
return true;
}

static bool itemdb_read_script(char *fields[], int column, int current) {
unsigned short nameid = atoi(fields[0]);
struct item_data *id;
struct script_code *script = NULL;

if (!(id = itemdb_exists(nameid))) {
ShowError("itemdb_read_flag: Invalid item item with id %hu\n", nameid);
return false;
}

if (id->abs_script)
script_free_code(id->abs_script);
id->abs_script = NULL;

if (!(script = parse_script(fields[1], __SV_READDB_FILE__, __SV_READDB_LINE__, 0)))
return false;

id->abs_script = script;
return true;
}

/**
* @return: amount of retrieved entries.
**/
@@ -1606,6 +1627,7 @@ static void itemdb_read(void) {
sv_readdb(dbsubpath2, "item_delay.txt", ',', 2, 3, -1, &itemdb_read_itemdelay, i);
sv_readdb(dbsubpath2, "item_buyingstore.txt", ',', 1, 1, -1, &itemdb_read_buyingstore, i);
sv_readdb(dbsubpath2, "item_flag.txt", ',', 2, 2, -1, &itemdb_read_flag, i);
sv_readdb(dbsubpath2, "item_script.txt", '#', 2, 2, -1, &itemdb_read_script, i);
aFree(dbsubpath1);
aFree(dbsubpath2);
}
@@ -1624,6 +1646,8 @@ static void destroy_item_data(struct item_data* self) {
// free scripts
if( self->script )
script_free_code(self->script);
if( self->abs_script )
script_free_code(self->abs_script);
if( self->equip_script )
script_free_code(self->equip_script);
if( self->unequip_script )
@@ -421,6 +421,7 @@ struct item_data
int id;
} mob[MAX_SEARCH]; //Holds the mobs that have the highest drop rate for this item. [Skotlex]
struct script_code *script; //Default script for everything.
struct script_code *abs_script; //Default script beyond everything.
struct script_code *equip_script; //Script executed once when equipping.
struct script_code *unequip_script;//Script executed once when unequipping.
struct {
@@ -3182,6 +3182,17 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt)
if(r) // Overrefine bonus.
wd->overrefine = refine_info[wlv].randombonus_max[r-1] / 100;
wa->range += sd->inventory_data[index]->range;
if (sd->inventory_data[index]->abs_script) {
if (wd == &sd->left_weapon) {
sd->state.lr_flag = 1;
run_script(sd->inventory_data[index]->abs_script,0,sd->bl.id,0);
sd->state.lr_flag = 0;
}
else
run_script(sd->inventory_data[index]->abs_script,0,sd->bl.id,0);
if (!calculating)
return 1;
}
if(sd->inventory_data[index]->script && (pc_has_permission(sd,PC_PERM_USE_ALL_EQUIPMENT) || !itemdb_isNoEquip(sd->inventory_data[index],sd->bl.m))) {
if (wd == &sd->left_weapon) {
sd->state.lr_flag = 1;
@@ -3205,6 +3216,15 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt)

if ( (r = sd->status.inventory[index].refine) )
refinedef += refine_info[REFINE_TYPE_ARMOR].bonus[r-1];
if (sd->inventory_data[index]->abs_script) {
if( i == EQI_HAND_L ) // Shield
sd->state.lr_flag = 3;
if( i == EQI_HAND_L ) // Shield
sd->state.lr_flag = 0;
run_script(sd->inventory_data[index]->abs_script,0,sd->bl.id,0);
if (!calculating)
return 1;
}
if(sd->inventory_data[index]->script && (pc_has_permission(sd,PC_PERM_USE_ALL_EQUIPMENT) || !itemdb_isNoEquip(sd->inventory_data[index],sd->bl.m))) {
if( i == EQI_HAND_L ) // Shield
sd->state.lr_flag = 3;
@@ -3215,6 +3235,11 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt)
return 1;
}
} else if( sd->inventory_data[index]->type == IT_SHADOWGEAR ) { // Shadow System
if (sd->inventory_data[index]->abs_script) {
run_script(sd->inventory_data[index]->abs_script,0,sd->bl.id,0);
if (!calculating)
return 1;
}
if (sd->inventory_data[index]->script && (pc_has_permission(sd,PC_PERM_USE_ALL_EQUIPMENT) || !itemdb_isNoEquip(sd->inventory_data[index],sd->bl.m))) {
run_script(sd->inventory_data[index]->script,0,sd->bl.id,0);
if( !calculating )
@@ -3303,6 +3328,17 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt)
if (!calculating)
return 1;
}
if (data->abs_script) {
if (i == EQI_HAND_L && sd->status.inventory[index].equip == EQP_HAND_L) { // Left hand status.
sd->state.lr_flag = 1;
run_script(data->abs_script,0,sd->bl.id,0);
sd->state.lr_flag = 0;
}
else
run_script(data->abs_script,0,sd->bl.id,0);
if (!calculating)
return 1;
}
if(!data->script)
continue;
if(!pc_has_permission(sd,PC_PERM_USE_ALL_EQUIPMENT) && itemdb_isNoEquip(data,sd->bl.m)) // Card restriction checks.
@@ -316,6 +316,7 @@
<Copy SourceFiles="..\db\import-tmpl\item_group_db.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\item_group_db.txt')" />
<Copy SourceFiles="..\db\import-tmpl\item_noequip.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\item_noequip.txt')" />
<Copy SourceFiles="..\db\import-tmpl\item_nouse.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\item_nouse.txt')" />
<Copy SourceFiles="..\db\import-tmpl\item_script.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\item_script.txt')" />
<Copy SourceFiles="..\db\import-tmpl\item_stack.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\item_stack.txt')" />
<Copy SourceFiles="..\db\import-tmpl\item_trade.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\item_trade.txt')" />
<Copy SourceFiles="..\db\import-tmpl\job_basehpsp_db.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\job_basehpsp_db.txt')" />
@@ -320,6 +320,7 @@
<Copy SourceFiles="..\db\import-tmpl\item_group_db.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\item_group_db.txt')" />
<Copy SourceFiles="..\db\import-tmpl\item_noequip.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\item_noequip.txt')" />
<Copy SourceFiles="..\db\import-tmpl\item_nouse.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\item_nouse.txt')" />
<Copy SourceFiles="..\db\import-tmpl\item_script.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\item_script.txt')" />
<Copy SourceFiles="..\db\import-tmpl\item_stack.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\item_stack.txt')" />
<Copy SourceFiles="..\db\import-tmpl\item_trade.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\item_trade.txt')" />
<Copy SourceFiles="..\db\import-tmpl\job_basehpsp_db.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\job_basehpsp_db.txt')" />
@@ -320,6 +320,7 @@
<Copy SourceFiles="..\db\import-tmpl\item_group_db.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\item_group_db.txt')" />
<Copy SourceFiles="..\db\import-tmpl\item_noequip.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\item_noequip.txt')" />
<Copy SourceFiles="..\db\import-tmpl\item_nouse.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\item_nouse.txt')" />
<Copy SourceFiles="..\db\import-tmpl\item_script.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\item_script.txt')" />
<Copy SourceFiles="..\db\import-tmpl\item_stack.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\item_stack.txt')" />
<Copy SourceFiles="..\db\import-tmpl\item_trade.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\item_trade.txt')" />
<Copy SourceFiles="..\db\import-tmpl\job_basehpsp_db.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\job_basehpsp_db.txt')" />

0 comments on commit b8e0e56

Please sign in to comment.