From 33982166de006d777aa2d95a9d95b2778db1c65a Mon Sep 17 00:00:00 2001 From: Murilo Pereti Tavares Date: Thu, 25 Jan 2018 01:13:35 -0200 Subject: Implementation of 'constants.inc' file This file will help to make constants that are only accessible on src to be accessible on scripts too. --- src/map/constants.inc | 1029 +++++++++++++++++++++++++++++++++++++++++++++++++ src/map/script.c | 1 + 2 files changed, 1030 insertions(+) create mode 100644 src/map/constants.inc diff --git a/src/map/constants.inc b/src/map/constants.inc new file mode 100644 index 000000000..355e2a825 --- /dev/null +++ b/src/map/constants.inc @@ -0,0 +1,1029 @@ + script->constdb_comment("Status Icons"); + + script->set_constant("SI_BLANK", SI_BLANK, false, false); + + script->set_constant("SI_PROVOKE", SI_PROVOKE, false, false); + script->set_constant("SI_ENDURE", SI_ENDURE, false, false); + script->set_constant("SI_TWOHANDQUICKEN", SI_TWOHANDQUICKEN, false, false); + script->set_constant("SI_CONCENTRATION", SI_CONCENTRATION, false, false); + script->set_constant("SI_HIDING", SI_HIDING, false, false); + script->set_constant("SI_CLOAKING", SI_CLOAKING, false, false); + script->set_constant("SI_ENCHANTPOISON", SI_ENCHANTPOISON, false, false); + script->set_constant("SI_POISONREACT", SI_POISONREACT, false, false); + script->set_constant("SI_QUAGMIRE", SI_QUAGMIRE, false, false); + script->set_constant("SI_ANGELUS", SI_ANGELUS, false, false); + script->set_constant("SI_BLESSING", SI_BLESSING, false, false); + script->set_constant("SI_CRUCIS", SI_CRUCIS, false, false); + script->set_constant("SI_INC_AGI", SI_INC_AGI, false, false); + script->set_constant("SI_DEC_AGI", SI_DEC_AGI, false, false); + script->set_constant("SI_SLOWPOISON", SI_SLOWPOISON, false, false); + script->set_constant("SI_IMPOSITIO", SI_IMPOSITIO, false, false); + script->set_constant("SI_SUFFRAGIUM", SI_SUFFRAGIUM, false, false); + script->set_constant("SI_ASPERSIO", SI_ASPERSIO, false, false); + script->set_constant("SI_BENEDICTIO", SI_BENEDICTIO, false, false); + script->set_constant("SI_KYRIE", SI_KYRIE, false, false); + script->set_constant("SI_MAGNIFICAT", SI_MAGNIFICAT, false, false); + script->set_constant("SI_GLORIA", SI_GLORIA, false, false); + script->set_constant("SI_LEXAETERNA", SI_LEXAETERNA, false, false); + script->set_constant("SI_ADRENALINE", SI_ADRENALINE, false, false); + script->set_constant("SI_WEAPONPERFECT", SI_WEAPONPERFECT, false, false); + script->set_constant("SI_OVERTHRUST", SI_OVERTHRUST, false, false); + script->set_constant("SI_MAXIMIZE", SI_MAXIMIZE, false, false); + script->set_constant("SI_RIDING", SI_RIDING, false, false); + script->set_constant("SI_FALCON", SI_FALCON, false, false); + script->set_constant("SI_TRICKDEAD", SI_TRICKDEAD, false, false); + script->set_constant("SI_SHOUT", SI_SHOUT, false, false); + script->set_constant("SI_ENERGYCOAT", SI_ENERGYCOAT, false, false); + script->set_constant("SI_BROKENARMOR", SI_BROKENARMOR, false, false); + script->set_constant("SI_BROKENWEAPON", SI_BROKENWEAPON, false, false); + script->set_constant("SI_ILLUSION", SI_ILLUSION, false, false); + script->set_constant("SI_WEIGHTOVER50", SI_WEIGHTOVER50, false, false); + script->set_constant("SI_WEIGHTOVER90", SI_WEIGHTOVER90, false, false); + script->set_constant("SI_ATTHASTE_POTION1", SI_ATTHASTE_POTION1, false, false); + script->set_constant("SI_ATTHASTE_POTION2", SI_ATTHASTE_POTION2, false, false); + script->set_constant("SI_ATTHASTE_POTION3", SI_ATTHASTE_POTION3, false, false); + script->set_constant("SI_ATTHASTE_INFINITY", SI_ATTHASTE_INFINITY, false, false); + script->set_constant("SI_MOVHASTE_POTION", SI_MOVHASTE_POTION, false, false); + script->set_constant("SI_MOVHASTE_INFINITY", SI_MOVHASTE_INFINITY, false, false); + //script->set_constant("SI_AUTOCOUNTER", SI_AUTOCOUNTER, false, false); + //script->set_constant("SI_SPLASHER", SI_SPLASHER, false, false); + script->set_constant("SI_ANKLESNARE", SI_ANKLESNARE, false, false); + script->set_constant("SI_POSTDELAY", SI_POSTDELAY, false, false); + //script->set_constant("SI_NOACTION", SI_NOACTION, false, false); + //script->set_constant("SI_IMPOSSIBLEPICKUP", SI_IMPOSSIBLEPICKUP, false, false); + //script->set_constant("SI_BARRIER", SI_BARRIER, false, false); + + script->set_constant("SI_NOEQUIPWEAPON", SI_NOEQUIPWEAPON, false, false); + script->set_constant("SI_NOEQUIPSHIELD", SI_NOEQUIPSHIELD, false, false); + script->set_constant("SI_NOEQUIPARMOR", SI_NOEQUIPARMOR, false, false); + script->set_constant("SI_NOEQUIPHELM", SI_NOEQUIPHELM, false, false); + script->set_constant("SI_PROTECTWEAPON", SI_PROTECTWEAPON, false, false); + script->set_constant("SI_PROTECTSHIELD", SI_PROTECTSHIELD, false, false); + script->set_constant("SI_PROTECTARMOR", SI_PROTECTARMOR, false, false); + script->set_constant("SI_PROTECTHELM", SI_PROTECTHELM, false, false); + script->set_constant("SI_AUTOGUARD", SI_AUTOGUARD, false, false); + script->set_constant("SI_REFLECTSHIELD", SI_REFLECTSHIELD, false, false); + //script->set_constant("SI_DEVOTION", SI_DEVOTION, false, false); + script->set_constant("SI_PROVIDENCE", SI_PROVIDENCE, false, false); + script->set_constant("SI_DEFENDER", SI_DEFENDER, false, false); + //script->set_constant("SI_MAGICROD", SI_MAGICROD, false, false); + //script->set_constant("SI_WEAPONPROPERTY", SI_WEAPONPROPERTY, false, false); + script->set_constant("SI_AUTOSPELL", SI_AUTOSPELL, false, false); + //script->set_constant("SI_SPECIALZONE", SI_SPECIALZONE, false, false); + //script->set_constant("SI_MASK", SI_MASK, false, false); + script->set_constant("SI_SPEARQUICKEN", SI_SPEARQUICKEN, false, false); + //script->set_constant("SI_BDPLAYING", SI_BDPLAYING, false, false); + //script->set_constant("SI_WHISTLE", SI_WHISTLE, false, false); + //script->set_constant("SI_ASSASSINCROSS", SI_ASSASSINCROSS, false, false); + //script->set_constant("SI_POEMBRAGI", SI_POEMBRAGI, false, false); + //script->set_constant("SI_APPLEIDUN", SI_APPLEIDUN, false, false); + //script->set_constant("SI_HUMMING", SI_HUMMING, false, false); + //script->set_constant("SI_DONTFORGETME", SI_DONTFORGETME, false, false); + //script->set_constant("SI_FORTUNEKISS", SI_FORTUNEKISS, false, false); + //script->set_constant("SI_SERVICEFORYOU", SI_SERVICEFORYOU, false, false); + //script->set_constant("SI_RICHMANKIM", SI_RICHMANKIM, false, false); + //script->set_constant("SI_ETERNALCHAOS", SI_ETERNALCHAOS, false, false); + //script->set_constant("SI_DRUMBATTLEFIELD", SI_DRUMBATTLEFIELD, false, false); + //script->set_constant("SI_RINGNIBELUNGEN", SI_RINGNIBELUNGEN, false, false); + //script->set_constant("SI_ROKISWEIL", SI_ROKISWEIL, false, false); + //script->set_constant("SI_INTOABYSS", SI_INTOABYSS, false, false); + //script->set_constant("SI_SIEGFRIED", SI_SIEGFRIED, false, false); + //script->set_constant("SI_BLADESTOP", SI_BLADESTOP, false, false); + script->set_constant("SI_EXPLOSIONSPIRITS", SI_EXPLOSIONSPIRITS, false, false); + script->set_constant("SI_STEELBODY", SI_STEELBODY, false, false); + script->set_constant("SI_EXTREMITYFIST", SI_EXTREMITYFIST, false, false); + //script->set_constant("SI_COMBOATTACK", SI_COMBOATTACK, false, false); + script->set_constant("SI_PROPERTYFIRE", SI_PROPERTYFIRE, false, false); + script->set_constant("SI_PROPERTYWATER", SI_PROPERTYWATER, false, false); + script->set_constant("SI_PROPERTYWIND", SI_PROPERTYWIND, false, false); + script->set_constant("SI_PROPERTYGROUND", SI_PROPERTYGROUND, false, false); + //script->set_constant("SI_MAGICATTACK", SI_MAGICATTACK, false, false); + script->set_constant("SI_STOP", SI_STOP, false, false); + //script->set_constant("SI_WEAPONBRAKER", SI_WEAPONBRAKER, false, false); + script->set_constant("SI_PROPERTYUNDEAD", SI_PROPERTYUNDEAD, false, false); + //script->set_constant("SI_POWERUP", SI_POWERUP, false, false); + //script->set_constant("SI_AGIUP", SI_AGIUP, false, false); + + //script->set_constant("SI_SIEGEMODE", SI_SIEGEMODE, false, false); + //script->set_constant("SI_INVISIBLE", SI_INVISIBLE, false, false); + //script->set_constant("SI_STATUSONE", SI_STATUSONE, false, false); + script->set_constant("SI_AURABLADE", SI_AURABLADE, false, false); + script->set_constant("SI_PARRYING", SI_PARRYING, false, false); + script->set_constant("SI_LKCONCENTRATION", SI_LKCONCENTRATION, false, false); + script->set_constant("SI_TENSIONRELAX", SI_TENSIONRELAX, false, false); + script->set_constant("SI_BERSERK", SI_BERSERK, false, false); + //script->set_constant("SI_SACRIFICE", SI_SACRIFICE, false, false); + //script->set_constant("SI_GOSPEL", SI_GOSPEL, false, false); + script->set_constant("SI_ASSUMPTIO", SI_ASSUMPTIO, false, false); + //script->set_constant("SI_BASILICA", SI_BASILICA, false, false); + script->set_constant("SI_GROUNDMAGIC", SI_GROUNDMAGIC, false, false); + script->set_constant("SI_MAGICPOWER", SI_MAGICPOWER, false, false); + script->set_constant("SI_EDP", SI_EDP, false, false); + script->set_constant("SI_TRUESIGHT", SI_TRUESIGHT, false, false); + script->set_constant("SI_WINDWALK", SI_WINDWALK, false, false); + script->set_constant("SI_MELTDOWN", SI_MELTDOWN, false, false); + script->set_constant("SI_CARTBOOST", SI_CARTBOOST, false, false); + //script->set_constant("SI_CHASEWALK", SI_CHASEWALK, false, false); + script->set_constant("SI_SWORDREJECT", SI_SWORDREJECT, false, false); + script->set_constant("SI_MARIONETTE_MASTER", SI_MARIONETTE_MASTER, false, false); + script->set_constant("SI_MARIONETTE", SI_MARIONETTE, false, false); + script->set_constant("SI_MOON", SI_MOON, false, false); + script->set_constant("SI_BLOODING", SI_BLOODING, false, false); + script->set_constant("SI_JOINTBEAT", SI_JOINTBEAT, false, false); + //script->set_constant("SI_MINDBREAKER", SI_MINDBREAKER, false, false); + //script->set_constant("SI_MEMORIZE", SI_MEMORIZE, false, false); + //script->set_constant("SI_FOGWALL", SI_FOGWALL, false, false); + //script->set_constant("SI_SPIDERWEB", SI_SPIDERWEB, false, false); + script->set_constant("SI_PROTECTEXP", SI_PROTECTEXP, false, false); + //script->set_constant("SI_SUB_WEAPONPROPERTY", SI_SUB_WEAPONPROPERTY, false, false); + script->set_constant("SI_AUTOBERSERK", SI_AUTOBERSERK, false, false); + script->set_constant("SI_RUN", SI_RUN, false, false); + script->set_constant("SI_TING", SI_TING, false, false); + script->set_constant("SI_STORMKICK_ON", SI_STORMKICK_ON, false, false); + script->set_constant("SI_STORMKICK_READY", SI_STORMKICK_READY, false, false); + script->set_constant("SI_DOWNKICK_ON", SI_DOWNKICK_ON, false, false); + script->set_constant("SI_DOWNKICK_READY", SI_DOWNKICK_READY, false, false); + script->set_constant("SI_TURNKICK_ON", SI_TURNKICK_ON, false, false); + script->set_constant("SI_TURNKICK_READY", SI_TURNKICK_READY, false, false); + script->set_constant("SI_COUNTER_ON", SI_COUNTER_ON, false, false); + script->set_constant("SI_COUNTER_READY", SI_COUNTER_READY, false, false); + script->set_constant("SI_DODGE_ON", SI_DODGE_ON, false, false); + script->set_constant("SI_DODGE_READY", SI_DODGE_READY, false, false); + script->set_constant("SI_STRUP", SI_STRUP, false, false); + script->set_constant("SI_PROPERTYDARK", SI_PROPERTYDARK, false, false); + script->set_constant("SI_ADRENALINE2", SI_ADRENALINE2, false, false); + script->set_constant("SI_PROPERTYTELEKINESIS", SI_PROPERTYTELEKINESIS, false, false); + script->set_constant("SI_SOULLINK", SI_SOULLINK, false, false); + + script->set_constant("SI_PLUSATTACKPOWER", SI_PLUSATTACKPOWER, false, false); + script->set_constant("SI_PLUSMAGICPOWER", SI_PLUSMAGICPOWER, false, false); + script->set_constant("SI_DEVIL1", SI_DEVIL1, false, false); + script->set_constant("SI_KAITE", SI_KAITE, false, false); + //script->set_constant("SI_SWOO", SI_SWOO, false, false); + //script->set_constant("SI_STAR2", SI_STAR2, false, false); + script->set_constant("SI_KAIZEL", SI_KAIZEL, false, false); + script->set_constant("SI_KAAHI", SI_KAAHI, false, false); + script->set_constant("SI_KAUPE", SI_KAUPE, false, false); + script->set_constant("SI_SMA_READY", SI_SMA_READY, false, false); + script->set_constant("SI_SKE", SI_SKE, false, false); + script->set_constant("SI_ONEHANDQUICKEN", SI_ONEHANDQUICKEN, false, false); + //script->set_constant("SI_FRIEND", SI_FRIEND, false, false); + //script->set_constant("SI_FRIENDUP", SI_FRIENDUP, false, false); + //script->set_constant("SI_SG_WARM", SI_SG_WARM, false, false); + script->set_constant("SI_SG_SUN_WARM", SI_SG_SUN_WARM, false, false); + //script->set_constant("SI_SG_MOON_WARM", SI_SG_MOON_WARM, false, false); + //script->set_constant("SI_SG_STAR_WARM", SI_SG_STAR_WARM, false, false); + //script->set_constant("SI_EMOTION", SI_EMOTION, false, false); + script->set_constant("SI_SUN_COMFORT", SI_SUN_COMFORT, false, false); + script->set_constant("SI_MOON_COMFORT", SI_MOON_COMFORT, false, false); + script->set_constant("SI_STAR_COMFORT", SI_STAR_COMFORT, false, false); + //script->set_constant("SI_EXPUP", SI_EXPUP, false, false); + //script->set_constant("SI_GDSKILL_BATTLEORDER", SI_GDSKILL_BATTLEORDER, false, false); + //script->set_constant("SI_GDSKILL_REGENERATION", SI_GDSKILL_REGENERATION, false, false); + //script->set_constant("SI_GDSKILL_POSTDELAY", SI_GDSKILL_POSTDELAY, false, false); + //script->set_constant("SI_RESISTHANDICAP", SI_RESISTHANDICAP, false, false); + //script->set_constant("SI_MAXHPPERCENT", SI_MAXHPPERCENT, false, false); + //script->set_constant("SI_MAXSPPERCENT", SI_MAXSPPERCENT, false, false); + //script->set_constant("SI_DEFENCE", SI_DEFENCE, false, false); + //script->set_constant("SI_SLOWDOWN", SI_SLOWDOWN, false, false); + script->set_constant("SI_PRESERVE", SI_PRESERVE, false, false); + script->set_constant("SI_INCSTR", SI_INCSTR, false, false); + //script->set_constant("SI_NOT_EXTREMITYFIST", SI_NOT_EXTREMITYFIST, false, false); + script->set_constant("SI_CLAIRVOYANCE", SI_CLAIRVOYANCE, false, false); + script->set_constant("SI_MOVESLOW_POTION", SI_MOVESLOW_POTION, false, false); + script->set_constant("SI_DOUBLECASTING", SI_DOUBLECASTING, false, false); + //script->set_constant("SI_GRAVITATION", SI_GRAVITATION, false, false); + script->set_constant("SI_OVERTHRUSTMAX", SI_OVERTHRUSTMAX, false, false); + //script->set_constant("SI_LONGING", SI_LONGING, false, false); + //script->set_constant("SI_HERMODE", SI_HERMODE, false, false); + script->set_constant("SI_TAROTCARD", SI_TAROTCARD, false, false); + //script->set_constant("SI_HLIF_AVOID", SI_HLIF_AVOID, false, false); + //script->set_constant("SI_HFLI_FLEET", SI_HFLI_FLEET, false, false); + //script->set_constant("SI_HFLI_SPEED", SI_HFLI_SPEED, false, false); + //script->set_constant("SI_HLIF_CHANGE", SI_HLIF_CHANGE, false, false); + //script->set_constant("SI_HAMI_BLOODLUST", SI_HAMI_BLOODLUST, false, false); + script->set_constant("SI_CR_SHRINK", SI_CR_SHRINK, false, false); + script->set_constant("SI_WZ_SIGHTBLASTER", SI_WZ_SIGHTBLASTER, false, false); + script->set_constant("SI_DC_WINKCHARM", SI_DC_WINKCHARM, false, false); + + script->set_constant("SI_RG_CCONFINE_M", SI_RG_CCONFINE_M, false, false); + script->set_constant("SI_RG_CCONFINE_S", SI_RG_CCONFINE_S, false, false); + //script->set_constant("SI_DISABLEMOVE", SI_DISABLEMOVE, false, false); + script->set_constant("SI_GS_MADNESSCANCEL", SI_GS_MADNESSCANCEL, false, false); + script->set_constant("SI_GS_GATLINGFEVER", SI_GS_GATLINGFEVER, false, false); + script->set_constant("SI_EARTHSCROLL", SI_EARTHSCROLL, false, false); + script->set_constant("SI_NJ_UTSUSEMI", SI_NJ_UTSUSEMI, false, false); + script->set_constant("SI_NJ_BUNSINJYUTSU", SI_NJ_BUNSINJYUTSU, false, false); + script->set_constant("SI_NJ_NEN", SI_NJ_NEN, false, false); + script->set_constant("SI_GS_ADJUSTMENT", SI_GS_ADJUSTMENT, false, false); + script->set_constant("SI_GS_ACCURACY", SI_GS_ACCURACY, false, false); + script->set_constant("SI_NJ_SUITON", SI_NJ_SUITON, false, false); + //script->set_constant("SI_PET", SI_PET, false, false); + //script->set_constant("SI_MENTAL", SI_MENTAL, false, false); + //script->set_constant("SI_EXPMEMORY", SI_EXPMEMORY, false, false); + //script->set_constant("SI_PERFORMANCE", SI_PERFORMANCE, false, false); + //script->set_constant("SI_GAIN", SI_GAIN, false, false); + //script->set_constant("SI_GRIFFON", SI_GRIFFON, false, false); + //script->set_constant("SI_DRIFT", SI_DRIFT, false, false); + //script->set_constant("SI_WALLSHIFT", SI_WALLSHIFT, false, false); + //script->set_constant("SI_REINCARNATION", SI_REINCARNATION, false, false); + //script->set_constant("SI_PATTACK", SI_PATTACK, false, false); + //script->set_constant("SI_PSPEED", SI_PSPEED, false, false); + //script->set_constant("SI_PDEFENSE", SI_PDEFENSE, false, false); + //script->set_constant("SI_PCRITICAL", SI_PCRITICAL, false, false); + //script->set_constant("SI_RANKING", SI_RANKING, false, false); + //script->set_constant("SI_PTRIPLE", SI_PTRIPLE, false, false); + //script->set_constant("SI_DENERGY", SI_DENERGY, false, false); + //script->set_constant("SI_WAVE1", SI_WAVE1, false, false); + //script->set_constant("SI_WAVE2", SI_WAVE2, false, false); + //script->set_constant("SI_WAVE3", SI_WAVE3, false, false); + //script->set_constant("SI_WAVE4", SI_WAVE4, false, false); + //script->set_constant("SI_DAURA", SI_DAURA, false, false); + //script->set_constant("SI_DFREEZER", SI_DFREEZER, false, false); + //script->set_constant("SI_DPUNISH", SI_DPUNISH, false, false); + //script->set_constant("SI_DBARRIER", SI_DBARRIER, false, false); + //script->set_constant("SI_DWARNING", SI_DWARNING, false, false); + //script->set_constant("SI_MOUSEWHEEL", SI_MOUSEWHEEL, false, false); + //script->set_constant("SI_DGAUGE", SI_DGAUGE, false, false); + //script->set_constant("SI_DACCEL", SI_DACCEL, false, false); + //script->set_constant("SI_DBLOCK", SI_DBLOCK, false, false); + script->set_constant("SI_FOOD_STR", SI_FOOD_STR, false, false); + script->set_constant("SI_FOOD_AGI", SI_FOOD_AGI, false, false); + script->set_constant("SI_FOOD_VIT", SI_FOOD_VIT, false, false); + script->set_constant("SI_FOOD_DEX", SI_FOOD_DEX, false, false); + script->set_constant("SI_FOOD_INT", SI_FOOD_INT, false, false); + script->set_constant("SI_FOOD_LUK", SI_FOOD_LUK, false, false); + script->set_constant("SI_FOOD_BASICAVOIDANCE", SI_FOOD_BASICAVOIDANCE, false, false); + script->set_constant("SI_FOOD_BASICHIT", SI_FOOD_BASICHIT, false, false); + script->set_constant("SI_FOOD_CRITICALSUCCESSVALUE", SI_FOOD_CRITICALSUCCESSVALUE, false, false); + + script->set_constant("SI_CASH_PLUSEXP", SI_CASH_PLUSEXP, false, false); + script->set_constant("SI_CASH_DEATHPENALTY", SI_CASH_DEATHPENALTY, false, false); + script->set_constant("SI_CASH_RECEIVEITEM", SI_CASH_RECEIVEITEM, false, false); + script->set_constant("SI_CASH_BOSS_ALARM", SI_CASH_BOSS_ALARM, false, false); + //script->set_constant("SI_DA_ENERGY", SI_DA_ENERGY, false, false); + //script->set_constant("SI_DA_FIRSTSLOT", SI_DA_FIRSTSLOT, false, false); + //script->set_constant("SI_DA_HEADDEF", SI_DA_HEADDEF, false, false); + //script->set_constant("SI_DA_SPACE", SI_DA_SPACE, false, false); + //script->set_constant("SI_DA_TRANSFORM", SI_DA_TRANSFORM, false, false); + //script->set_constant("SI_DA_ITEMREBUILD", SI_DA_ITEMREBUILD, false, false); + //script->set_constant("SI_DA_ILLUSION", SI_DA_ILLUSION, false, false); + //script->set_constant("SI_DA_DARKPOWER", SI_DA_DARKPOWER, false, false); + //script->set_constant("SI_DA_EARPLUG", SI_DA_EARPLUG, false, false); + //script->set_constant("SI_DA_CONTRACT", SI_DA_CONTRACT, false, false); + //script->set_constant("SI_DA_BLACK", SI_DA_BLACK, false, false); + //script->set_constant("SI_DA_MAGICCART", SI_DA_MAGICCART, false, false); + //script->set_constant("SI_CRYSTAL", SI_CRYSTAL, false, false); + //script->set_constant("SI_DA_REBUILD", SI_DA_REBUILD, false, false); + //script->set_constant("SI_DA_EDARKNESS", SI_DA_EDARKNESS, false, false); + //script->set_constant("SI_DA_EGUARDIAN", SI_DA_EGUARDIAN, false, false); + //script->set_constant("SI_DA_TIMEOUT", SI_DA_TIMEOUT, false, false); + script->set_constant("SI_FOOD_STR_CASH", SI_FOOD_STR_CASH, false, false); + script->set_constant("SI_FOOD_AGI_CASH", SI_FOOD_AGI_CASH, false, false); + script->set_constant("SI_FOOD_VIT_CASH", SI_FOOD_VIT_CASH, false, false); + script->set_constant("SI_FOOD_DEX_CASH", SI_FOOD_DEX_CASH, false, false); + script->set_constant("SI_FOOD_INT_CASH", SI_FOOD_INT_CASH, false, false); + script->set_constant("SI_FOOD_LUK_CASH", SI_FOOD_LUK_CASH, false, false); + script->set_constant("SI_MER_FLEE", SI_MER_FLEE, false, false); + script->set_constant("SI_MER_ATK", SI_MER_ATK, false, false); + script->set_constant("SI_MER_HP", SI_MER_HP, false, false); + script->set_constant("SI_MER_SP", SI_MER_SP, false, false); + script->set_constant("SI_MER_HIT", SI_MER_HIT, false, false); + script->set_constant("SI_SLOWCAST", SI_SLOWCAST, false, false); + //script->set_constant("SI_MAGICMIRROR", SI_MAGICMIRROR, false, false); + //script->set_constant("SI_STONESKIN", SI_STONESKIN, false, false); + //script->set_constant("SI_ANTIMAGIC", SI_ANTIMAGIC, false, false); + script->set_constant("SI_CRITICALWOUND", SI_CRITICALWOUND, false, false); + //script->set_constant("SI_NPC_DEFENDER", SI_NPC_DEFENDER, false, false); + //script->set_constant("SI_NOACTION_WAIT", SI_NOACTION_WAIT, false, false); + script->set_constant("SI_MOVHASTE_HORSE", SI_MOVHASTE_HORSE, false, false); + script->set_constant("SI_PROTECT_DEF", SI_PROTECT_DEF, false, false); + script->set_constant("SI_PROTECT_MDEF", SI_PROTECT_MDEF, false, false); + script->set_constant("SI_HEALPLUS", SI_HEALPLUS, false, false); + script->set_constant("SI_S_LIFEPOTION", SI_S_LIFEPOTION, false, false); + script->set_constant("SI_L_LIFEPOTION", SI_L_LIFEPOTION, false, false); + script->set_constant("SI_CRITICALPERCENT", SI_CRITICALPERCENT, false, false); + script->set_constant("SI_PLUSAVOIDVALUE", SI_PLUSAVOIDVALUE, false, false); + script->set_constant("SI_ATKER_ASPD", SI_ATKER_ASPD, false, false); + script->set_constant("SI_TARGET_ASPD", SI_TARGET_ASPD, false, false); + script->set_constant("SI_ATKER_MOVESPEED", SI_ATKER_MOVESPEED, false, false); + + script->set_constant("SI_ATKER_BLOOD", SI_ATKER_BLOOD, false, false); + script->set_constant("SI_TARGET_BLOOD", SI_TARGET_BLOOD, false, false); + script->set_constant("SI_ARMOR_PROPERTY", SI_ARMOR_PROPERTY, false, false); + //script->set_constant("SI_REUSE_LIMIT_A", SI_REUSE_LIMIT_A, false, false); + script->set_constant("SI_HELLPOWER", SI_HELLPOWER, false, false); + script->set_constant("SI_STEAMPACK", SI_STEAMPACK, false, false); + //script->set_constant("SI_REUSE_LIMIT_B", SI_REUSE_LIMIT_B, false, false); + //script->set_constant("SI_REUSE_LIMIT_C", SI_REUSE_LIMIT_C, false, false); + //script->set_constant("SI_REUSE_LIMIT_D", SI_REUSE_LIMIT_D, false, false); + //script->set_constant("SI_REUSE_LIMIT_E", SI_REUSE_LIMIT_E, false, false); + //script->set_constant("SI_REUSE_LIMIT_F", SI_REUSE_LIMIT_F, false, false); + script->set_constant("SI_INVINCIBLE", SI_INVINCIBLE, false, false); + script->set_constant("SI_CASH_PLUSONLYJOBEXP", SI_CASH_PLUSONLYJOBEXP, false, false); + script->set_constant("SI_PARTYFLEE", SI_PARTYFLEE, false, false); + script->set_constant("SI_ANGEL_PROTECT", SI_ANGEL_PROTECT, false, false); + //script->set_constant("SI_ENDURE_MDEF", SI_ENDURE_MDEF, false, false); + script->set_constant("SI_ENCHANTBLADE", SI_ENCHANTBLADE, false, false); + script->set_constant("SI_DEATHBOUND", SI_DEATHBOUND, false, false); + script->set_constant("SI_REFRESH", SI_REFRESH, false, false); + script->set_constant("SI_GIANTGROWTH", SI_GIANTGROWTH, false, false); + script->set_constant("SI_STONEHARDSKIN", SI_STONEHARDSKIN, false, false); + script->set_constant("SI_VITALITYACTIVATION", SI_VITALITYACTIVATION, false, false); + script->set_constant("SI_FIGHTINGSPIRIT", SI_FIGHTINGSPIRIT, false, false); + script->set_constant("SI_ABUNDANCE", SI_ABUNDANCE, false, false); + script->set_constant("SI_REUSE_MILLENNIUMSHIELD", SI_REUSE_MILLENNIUMSHIELD, false, false); + script->set_constant("SI_REUSE_CRUSHSTRIKE", SI_REUSE_CRUSHSTRIKE, false, false); + script->set_constant("SI_REUSE_REFRESH", SI_REUSE_REFRESH, false, false); + script->set_constant("SI_REUSE_STORMBLAST", SI_REUSE_STORMBLAST, false, false); + script->set_constant("SI_VENOMIMPRESS", SI_VENOMIMPRESS, false, false); + script->set_constant("SI_EPICLESIS", SI_EPICLESIS, false, false); + script->set_constant("SI_ORATIO", SI_ORATIO, false, false); + script->set_constant("SI_LAUDAAGNUS", SI_LAUDAAGNUS, false, false); + script->set_constant("SI_LAUDARAMUS", SI_LAUDARAMUS, false, false); + script->set_constant("SI_CLOAKINGEXCEED", SI_CLOAKINGEXCEED, false, false); + script->set_constant("SI_HALLUCINATIONWALK", SI_HALLUCINATIONWALK, false, false); + script->set_constant("SI_HALLUCINATIONWALK_POSTDELAY", SI_HALLUCINATIONWALK_POSTDELAY, false, false); + script->set_constant("SI_RENOVATIO", SI_RENOVATIO, false, false); + script->set_constant("SI_WEAPONBLOCKING", SI_WEAPONBLOCKING, false, false); + script->set_constant("SI_WEAPONBLOCKING_POSTDELAY", SI_WEAPONBLOCKING_POSTDELAY, false, false); + script->set_constant("SI_ROLLINGCUTTER", SI_ROLLINGCUTTER, false, false); + script->set_constant("SI_EXPIATIO", SI_EXPIATIO, false, false); + script->set_constant("SI_POISONINGWEAPON", SI_POISONINGWEAPON, false, false); + script->set_constant("SI_TOXIN", SI_TOXIN, false, false); + script->set_constant("SI_PARALYSE", SI_PARALYSE, false, false); + script->set_constant("SI_VENOMBLEED", SI_VENOMBLEED, false, false); + script->set_constant("SI_MAGICMUSHROOM", SI_MAGICMUSHROOM, false, false); + script->set_constant("SI_DEATHHURT", SI_DEATHHURT, false, false); + script->set_constant("SI_PYREXIA", SI_PYREXIA, false, false); + script->set_constant("SI_OBLIVIONCURSE", SI_OBLIVIONCURSE, false, false); + script->set_constant("SI_LEECHESEND", SI_LEECHESEND, false, false); + + script->set_constant("SI_DUPLELIGHT", SI_DUPLELIGHT, false, false); + script->set_constant("SI_FROSTMISTY", SI_FROSTMISTY, false, false); + script->set_constant("SI_FEARBREEZE", SI_FEARBREEZE, false, false); + script->set_constant("SI_ELECTRICSHOCKER", SI_ELECTRICSHOCKER, false, false); + script->set_constant("SI_MARSHOFABYSS", SI_MARSHOFABYSS, false, false); + script->set_constant("SI_RECOGNIZEDSPELL", SI_RECOGNIZEDSPELL, false, false); + script->set_constant("SI_STASIS", SI_STASIS, false, false); + script->set_constant("SI_WUGRIDER", SI_WUGRIDER, false, false); + script->set_constant("SI_WUGDASH", SI_WUGDASH, false, false); + script->set_constant("SI_WUGBITE", SI_WUGBITE, false, false); + script->set_constant("SI_CAMOUFLAGE", SI_CAMOUFLAGE, false, false); + script->set_constant("SI_ACCELERATION", SI_ACCELERATION, false, false); + script->set_constant("SI_HOVERING", SI_HOVERING, false, false); + script->set_constant("SI_SPHERE_1", SI_SPHERE_1, false, false); + script->set_constant("SI_SPHERE_2", SI_SPHERE_2, false, false); + script->set_constant("SI_SPHERE_3", SI_SPHERE_3, false, false); + script->set_constant("SI_SPHERE_4", SI_SPHERE_4, false, false); + script->set_constant("SI_SPHERE_5", SI_SPHERE_5, false, false); + script->set_constant("SI_MVPCARD_TAOGUNKA", SI_MVPCARD_TAOGUNKA, false, false); + script->set_constant("SI_MVPCARD_MISTRESS", SI_MVPCARD_MISTRESS, false, false); + script->set_constant("SI_MVPCARD_ORCHERO", SI_MVPCARD_ORCHERO, false, false); + script->set_constant("SI_MVPCARD_ORCLORD", SI_MVPCARD_ORCLORD, false, false); + script->set_constant("SI_OVERHEAT_LIMITPOINT", SI_OVERHEAT_LIMITPOINT, false, false); + script->set_constant("SI_OVERHEAT", SI_OVERHEAT, false, false); + script->set_constant("SI_SHAPESHIFT", SI_SHAPESHIFT, false, false); + script->set_constant("SI_INFRAREDSCAN", SI_INFRAREDSCAN, false, false); + script->set_constant("SI_MAGNETICFIELD", SI_MAGNETICFIELD, false, false); + script->set_constant("SI_NEUTRALBARRIER", SI_NEUTRALBARRIER, false, false); + script->set_constant("SI_NEUTRALBARRIER_MASTER", SI_NEUTRALBARRIER_MASTER, false, false); + script->set_constant("SI_STEALTHFIELD", SI_STEALTHFIELD, false, false); + script->set_constant("SI_STEALTHFIELD_MASTER", SI_STEALTHFIELD_MASTER, false, false); + script->set_constant("SI_MANU_ATK", SI_MANU_ATK, false, false); + script->set_constant("SI_MANU_DEF", SI_MANU_DEF, false, false); + script->set_constant("SI_SPL_ATK", SI_SPL_ATK, false, false); + script->set_constant("SI_SPL_DEF", SI_SPL_DEF, false, false); + script->set_constant("SI_REPRODUCE", SI_REPRODUCE, false, false); + script->set_constant("SI_MANU_MATK", SI_MANU_MATK, false, false); + script->set_constant("SI_SPL_MATK", SI_SPL_MATK, false, false); + script->set_constant("SI_STR_SCROLL", SI_STR_SCROLL, false, false); + script->set_constant("SI_INT_SCROLL", SI_INT_SCROLL, false, false); + script->set_constant("SI_LG_REFLECTDAMAGE", SI_LG_REFLECTDAMAGE, false, false); + script->set_constant("SI_FORCEOFVANGUARD", SI_FORCEOFVANGUARD, false, false); + script->set_constant("SI_BUCHEDENOEL", SI_BUCHEDENOEL, false, false); + script->set_constant("SI_AUTOSHADOWSPELL", SI_AUTOSHADOWSPELL, false, false); + script->set_constant("SI_SHADOWFORM", SI_SHADOWFORM, false, false); + script->set_constant("SI_RAID", SI_RAID, false, false); + script->set_constant("SI_SHIELDSPELL_DEF", SI_SHIELDSPELL_DEF, false, false); + script->set_constant("SI_SHIELDSPELL_MDEF", SI_SHIELDSPELL_MDEF, false, false); + script->set_constant("SI_SHIELDSPELL_REF", SI_SHIELDSPELL_REF, false, false); + script->set_constant("SI_BODYPAINT", SI_BODYPAINT, false, false); + + script->set_constant("SI_EXEEDBREAK", SI_EXEEDBREAK, false, false); + script->set_constant("SI_ADORAMUS", SI_ADORAMUS, false, false); + script->set_constant("SI_PRESTIGE", SI_PRESTIGE, false, false); + script->set_constant("SI_INVISIBILITY", SI_INVISIBILITY, false, false); + script->set_constant("SI_DEADLYINFECT", SI_DEADLYINFECT, false, false); + script->set_constant("SI_BANDING", SI_BANDING, false, false); + script->set_constant("SI_EARTHDRIVE", SI_EARTHDRIVE, false, false); + script->set_constant("SI_INSPIRATION", SI_INSPIRATION, false, false); + script->set_constant("SI_ENERVATION", SI_ENERVATION, false, false); + script->set_constant("SI_GROOMY", SI_GROOMY, false, false); + script->set_constant("SI_RAISINGDRAGON", SI_RAISINGDRAGON, false, false); + script->set_constant("SI_IGNORANCE", SI_IGNORANCE, false, false); + script->set_constant("SI_LAZINESS", SI_LAZINESS, false, false); + script->set_constant("SI_LIGHTNINGWALK", SI_LIGHTNINGWALK, false, false); + script->set_constant("SI_ACARAJE", SI_ACARAJE, false, false); + script->set_constant("SI_UNLUCKY", SI_UNLUCKY, false, false); + script->set_constant("SI_CURSEDCIRCLE_ATKER", SI_CURSEDCIRCLE_ATKER, false, false); + script->set_constant("SI_CURSEDCIRCLE_TARGET", SI_CURSEDCIRCLE_TARGET, false, false); + script->set_constant("SI_WEAKNESS", SI_WEAKNESS, false, false); + script->set_constant("SI_CRESCENTELBOW", SI_CRESCENTELBOW, false, false); + script->set_constant("SI_NOEQUIPACCESSARY", SI_NOEQUIPACCESSARY, false, false); + script->set_constant("SI_STRIPACCESSARY", SI_STRIPACCESSARY, false, false); + script->set_constant("SI_MANHOLE", SI_MANHOLE, false, false); + script->set_constant("SI_POPECOOKIE", SI_POPECOOKIE, false, false); + script->set_constant("SI_FALLENEMPIRE", SI_FALLENEMPIRE, false, false); + script->set_constant("SI_GENTLETOUCH_ENERGYGAIN", SI_GENTLETOUCH_ENERGYGAIN, false, false); + script->set_constant("SI_GENTLETOUCH_CHANGE", SI_GENTLETOUCH_CHANGE, false, false); + script->set_constant("SI_GENTLETOUCH_REVITALIZE", SI_GENTLETOUCH_REVITALIZE, false, false); + script->set_constant("SI_BLOODYLUST", SI_BLOODYLUST, false, false); + script->set_constant("SI_SWINGDANCE", SI_SWINGDANCE, false, false); + script->set_constant("SI_SYMPHONYOFLOVERS", SI_SYMPHONYOFLOVERS, false, false); + script->set_constant("SI_PROPERTYWALK", SI_PROPERTYWALK, false, false); + script->set_constant("SI_SPELLFIST", SI_SPELLFIST, false, false); + script->set_constant("SI_NETHERWORLD", SI_NETHERWORLD, false, false); + script->set_constant("SI_SIREN", SI_SIREN, false, false); + script->set_constant("SI_DEEPSLEEP", SI_DEEPSLEEP, false, false); + script->set_constant("SI_SIRCLEOFNATURE", SI_SIRCLEOFNATURE, false, false); + script->set_constant("SI_COLD", SI_COLD, false, false); + script->set_constant("SI_GLOOMYDAY", SI_GLOOMYDAY, false, false); + script->set_constant("SI_SONG_OF_MANA", SI_SONG_OF_MANA, false, false); + script->set_constant("SI_CLOUDKILL", SI_CLOUDKILL, false, false); + script->set_constant("SI_DANCEWITHWUG", SI_DANCEWITHWUG, false, false); + script->set_constant("SI_RUSHWINDMILL", SI_RUSHWINDMILL, false, false); + script->set_constant("SI_ECHOSONG", SI_ECHOSONG, false, false); + script->set_constant("SI_HARMONIZE", SI_HARMONIZE, false, false); + script->set_constant("SI_STRIKING", SI_STRIKING, false, false); + //script->set_constant("SI_WARMER", SI_WARMER, false, false); + script->set_constant("SI_MOONLITSERENADE", SI_MOONLITSERENADE, false, false); + script->set_constant("SI_SATURDAYNIGHTFEVER", SI_SATURDAYNIGHTFEVER, false, false); + script->set_constant("SI_SITDOWN_FORCE", SI_SITDOWN_FORCE, false, false); + + script->set_constant("SI_ANALYZE", SI_ANALYZE, false, false); + script->set_constant("SI_LERADSDEW", SI_LERADSDEW, false, false); + script->set_constant("SI_MELODYOFSINK", SI_MELODYOFSINK, false, false); + script->set_constant("SI_WARCRYOFBEYOND", SI_WARCRYOFBEYOND, false, false); + script->set_constant("SI_UNLIMITEDHUMMINGVOICE", SI_UNLIMITEDHUMMINGVOICE, false, false); + script->set_constant("SI_SPELLBOOK1", SI_SPELLBOOK1, false, false); + script->set_constant("SI_SPELLBOOK2", SI_SPELLBOOK2, false, false); + script->set_constant("SI_SPELLBOOK3", SI_SPELLBOOK3, false, false); + script->set_constant("SI_FREEZE_SP", SI_FREEZE_SP, false, false); + script->set_constant("SI_GN_TRAINING_SWORD", SI_GN_TRAINING_SWORD, false, false); + script->set_constant("SI_GN_REMODELING_CART", SI_GN_REMODELING_CART, false, false); + script->set_constant("SI_CARTSBOOST", SI_CARTSBOOST, false, false); + script->set_constant("SI_FIXEDCASTINGTM_REDUCE", SI_FIXEDCASTINGTM_REDUCE, false, false); + script->set_constant("SI_THORNTRAP", SI_THORNTRAP, false, false); + script->set_constant("SI_BLOODSUCKER", SI_BLOODSUCKER, false, false); + script->set_constant("SI_SPORE_EXPLOSION", SI_SPORE_EXPLOSION, false, false); + script->set_constant("SI_DEMONIC_FIRE", SI_DEMONIC_FIRE, false, false); + script->set_constant("SI_FIRE_EXPANSION_SMOKE_POWDER", SI_FIRE_EXPANSION_SMOKE_POWDER, false, false); + script->set_constant("SI_FIRE_EXPANSION_TEAR_GAS", SI_FIRE_EXPANSION_TEAR_GAS, false, false); + script->set_constant("SI_BLOCKING_PLAY", SI_BLOCKING_PLAY, false, false); + script->set_constant("SI_MANDRAGORA", SI_MANDRAGORA, false, false); + script->set_constant("SI_ACTIVATE", SI_ACTIVATE, false, false); + script->set_constant("SI_SECRAMENT", SI_SECRAMENT, false, false); + script->set_constant("SI_ASSUMPTIO2", SI_ASSUMPTIO2, false, false); + script->set_constant("SI_TK_SEVENWIND", SI_TK_SEVENWIND, false, false); + script->set_constant("SI_LIMIT_ODINS_RECALL", SI_LIMIT_ODINS_RECALL, false, false); + script->set_constant("SI_STOMACHACHE", SI_STOMACHACHE, false, false); + script->set_constant("SI_MYSTERIOUS_POWDER", SI_MYSTERIOUS_POWDER, false, false); + script->set_constant("SI_MELON_BOMB", SI_MELON_BOMB, false, false); + script->set_constant("SI_BANANA_BOMB_SITDOWN_POSTDELAY", SI_BANANA_BOMB_SITDOWN_POSTDELAY, false, false); + script->set_constant("SI_PROMOTE_HEALTH_RESERCH", SI_PROMOTE_HEALTH_RESERCH, false, false); + script->set_constant("SI_ENERGY_DRINK_RESERCH", SI_ENERGY_DRINK_RESERCH, false, false); + script->set_constant("SI_EXTRACT_WHITE_POTION_Z", SI_EXTRACT_WHITE_POTION_Z, false, false); + script->set_constant("SI_VITATA_500", SI_VITATA_500, false, false); + script->set_constant("SI_EXTRACT_SALAMINE_JUICE", SI_EXTRACT_SALAMINE_JUICE, false, false); + script->set_constant("SI_BOOST500", SI_BOOST500, false, false); + script->set_constant("SI_FULL_SWING_K", SI_FULL_SWING_K, false, false); + script->set_constant("SI_MANA_PLUS", SI_MANA_PLUS, false, false); + script->set_constant("SI_MUSTLE_M", SI_MUSTLE_M, false, false); + script->set_constant("SI_LIFE_FORCE_F", SI_LIFE_FORCE_F, false, false); + script->set_constant("SI_VACUUM_EXTREME", SI_VACUUM_EXTREME, false, false); + script->set_constant("SI_SAVAGE_STEAK", SI_SAVAGE_STEAK, false, false); + script->set_constant("SI_COCKTAIL_WARG_BLOOD", SI_COCKTAIL_WARG_BLOOD, false, false); + script->set_constant("SI_MINOR_BBQ", SI_MINOR_BBQ, false, false); + script->set_constant("SI_SIROMA_ICE_TEA", SI_SIROMA_ICE_TEA, false, false); + script->set_constant("SI_DROCERA_HERB_STEAMED", SI_DROCERA_HERB_STEAMED, false, false); + script->set_constant("SI_PUTTI_TAILS_NOODLES", SI_PUTTI_TAILS_NOODLES, false, false); + script->set_constant("SI_BANANA_BOMB", SI_BANANA_BOMB, false, false); + script->set_constant("SI_SUMMON_AGNI", SI_SUMMON_AGNI, false, false); + script->set_constant("SI_SPELLBOOK4", SI_SPELLBOOK4, false, false); + + script->set_constant("SI_SPELLBOOK5", SI_SPELLBOOK5, false, false); + script->set_constant("SI_SPELLBOOK6", SI_SPELLBOOK6, false, false); + script->set_constant("SI_SPELLBOOK7", SI_SPELLBOOK7, false, false); + script->set_constant("SI_ELEMENTAL_AGGRESSIVE", SI_ELEMENTAL_AGGRESSIVE, false, false); + script->set_constant("SI_RETURN_TO_ELDICASTES", SI_RETURN_TO_ELDICASTES, false, false); + script->set_constant("SI_BANDING_DEFENCE", SI_BANDING_DEFENCE, false, false); + script->set_constant("SI_SKELSCROLL", SI_SKELSCROLL, false, false); + script->set_constant("SI_DISTRUCTIONSCROLL", SI_DISTRUCTIONSCROLL, false, false); + script->set_constant("SI_ROYALSCROLL", SI_ROYALSCROLL, false, false); + script->set_constant("SI_IMMUNITYSCROLL", SI_IMMUNITYSCROLL, false, false); + script->set_constant("SI_MYSTICSCROLL", SI_MYSTICSCROLL, false, false); + script->set_constant("SI_BATTLESCROLL", SI_BATTLESCROLL, false, false); + script->set_constant("SI_ARMORSCROLL", SI_ARMORSCROLL, false, false); + script->set_constant("SI_FREYJASCROLL", SI_FREYJASCROLL, false, false); + script->set_constant("SI_SOULSCROLL", SI_SOULSCROLL, false, false); + script->set_constant("SI_CIRCLE_OF_FIRE", SI_CIRCLE_OF_FIRE, false, false); + script->set_constant("SI_CIRCLE_OF_FIRE_OPTION", SI_CIRCLE_OF_FIRE_OPTION, false, false); + script->set_constant("SI_FIRE_CLOAK", SI_FIRE_CLOAK, false, false); + script->set_constant("SI_FIRE_CLOAK_OPTION", SI_FIRE_CLOAK_OPTION, false, false); + script->set_constant("SI_WATER_SCREEN", SI_WATER_SCREEN, false, false); + script->set_constant("SI_WATER_SCREEN_OPTION", SI_WATER_SCREEN_OPTION, false, false); + script->set_constant("SI_WATER_DROP", SI_WATER_DROP, false, false); + script->set_constant("SI_WATER_DROP_OPTION", SI_WATER_DROP_OPTION, false, false); + script->set_constant("SI_WIND_STEP", SI_WIND_STEP, false, false); + script->set_constant("SI_WIND_STEP_OPTION", SI_WIND_STEP_OPTION, false, false); + script->set_constant("SI_WIND_CURTAIN", SI_WIND_CURTAIN, false, false); + script->set_constant("SI_WIND_CURTAIN_OPTION", SI_WIND_CURTAIN_OPTION, false, false); + script->set_constant("SI_WATER_BARRIER", SI_WATER_BARRIER, false, false); + script->set_constant("SI_ZEPHYR", SI_ZEPHYR, false, false); + script->set_constant("SI_SOLID_SKIN", SI_SOLID_SKIN, false, false); + script->set_constant("SI_SOLID_SKIN_OPTION", SI_SOLID_SKIN_OPTION, false, false); + script->set_constant("SI_STONE_SHIELD", SI_STONE_SHIELD, false, false); + script->set_constant("SI_STONE_SHIELD_OPTION", SI_STONE_SHIELD_OPTION, false, false); + script->set_constant("SI_POWER_OF_GAIA", SI_POWER_OF_GAIA, false, false); + //script->set_constant("SI_EL_WAIT", SI_EL_WAIT, false, false); + //script->set_constant("SI_EL_PASSIVE", SI_EL_PASSIVE, false, false); + //script->set_constant("SI_EL_DEFENSIVE", SI_EL_DEFENSIVE, false, false); + //script->set_constant("SI_EL_OFFENSIVE", SI_EL_OFFENSIVE, false, false); + //script->set_constant("SI_EL_COST", SI_EL_COST, false, false); + script->set_constant("SI_PYROTECHNIC", SI_PYROTECHNIC, false, false); + script->set_constant("SI_PYROTECHNIC_OPTION", SI_PYROTECHNIC_OPTION, false, false); + script->set_constant("SI_HEATER", SI_HEATER, false, false); + script->set_constant("SI_HEATER_OPTION", SI_HEATER_OPTION, false, false); + script->set_constant("SI_TROPIC", SI_TROPIC, false, false); + script->set_constant("SI_TROPIC_OPTION", SI_TROPIC_OPTION, false, false); + script->set_constant("SI_AQUAPLAY", SI_AQUAPLAY, false, false); + script->set_constant("SI_AQUAPLAY_OPTION", SI_AQUAPLAY_OPTION, false, false); + script->set_constant("SI_COOLER", SI_COOLER, false, false); + script->set_constant("SI_COOLER_OPTION", SI_COOLER_OPTION, false, false); + script->set_constant("SI_CHILLY_AIR", SI_CHILLY_AIR, false, false); + + script->set_constant("SI_CHILLY_AIR_OPTION", SI_CHILLY_AIR_OPTION, false, false); + script->set_constant("SI_GUST", SI_GUST, false, false); + script->set_constant("SI_GUST_OPTION", SI_GUST_OPTION, false, false); + script->set_constant("SI_BLAST", SI_BLAST, false, false); + script->set_constant("SI_BLAST_OPTION", SI_BLAST_OPTION, false, false); + script->set_constant("SI_WILD_STORM", SI_WILD_STORM, false, false); + script->set_constant("SI_WILD_STORM_OPTION", SI_WILD_STORM_OPTION, false, false); + script->set_constant("SI_PETROLOGY", SI_PETROLOGY, false, false); + script->set_constant("SI_PETROLOGY_OPTION", SI_PETROLOGY_OPTION, false, false); + script->set_constant("SI_CURSED_SOIL", SI_CURSED_SOIL, false, false); + script->set_constant("SI_CURSED_SOIL_OPTION", SI_CURSED_SOIL_OPTION, false, false); + script->set_constant("SI_UPHEAVAL", SI_UPHEAVAL, false, false); + script->set_constant("SI_UPHEAVAL_OPTION", SI_UPHEAVAL_OPTION, false, false); + script->set_constant("SI_TIDAL_WEAPON", SI_TIDAL_WEAPON, false, false); + script->set_constant("SI_TIDAL_WEAPON_OPTION", SI_TIDAL_WEAPON_OPTION, false, false); + script->set_constant("SI_ROCK_CRUSHER", SI_ROCK_CRUSHER, false, false); + script->set_constant("SI_ROCK_CRUSHER_ATK", SI_ROCK_CRUSHER_ATK, false, false); + script->set_constant("SI_FIRE_INSIGNIA", SI_FIRE_INSIGNIA, false, false); + script->set_constant("SI_WATER_INSIGNIA", SI_WATER_INSIGNIA, false, false); + script->set_constant("SI_WIND_INSIGNIA", SI_WIND_INSIGNIA, false, false); + script->set_constant("SI_EARTH_INSIGNIA", SI_EARTH_INSIGNIA, false, false); + script->set_constant("SI_EQUIPED_FLOOR", SI_EQUIPED_FLOOR, false, false); + script->set_constant("SI_GUARDIAN_RECALL", SI_GUARDIAN_RECALL, false, false); + script->set_constant("SI_MORA_BUFF", SI_MORA_BUFF, false, false); + script->set_constant("SI_REUSE_LIMIT_G", SI_REUSE_LIMIT_G, false, false); + script->set_constant("SI_REUSE_LIMIT_H", SI_REUSE_LIMIT_H, false, false); + script->set_constant("SI_NEEDLE_OF_PARALYZE", SI_NEEDLE_OF_PARALYZE, false, false); + script->set_constant("SI_PAIN_KILLER", SI_PAIN_KILLER, false, false); + script->set_constant("SI_G_LIFEPOTION", SI_G_LIFEPOTION, false, false); + script->set_constant("SI_VITALIZE_POTION", SI_VITALIZE_POTION, false, false); + script->set_constant("SI_LIGHT_OF_REGENE", SI_LIGHT_OF_REGENE, false, false); + script->set_constant("SI_OVERED_BOOST", SI_OVERED_BOOST, false, false); + script->set_constant("SI_SILENT_BREEZE", SI_SILENT_BREEZE, false, false); + script->set_constant("SI_ODINS_POWER", SI_ODINS_POWER, false, false); + script->set_constant("SI_STYLE_CHANGE", SI_STYLE_CHANGE, false, false); + script->set_constant("SI_SONIC_CLAW_POSTDELAY", SI_SONIC_CLAW_POSTDELAY, false, false); + // 586 + // 587 + // 588 + // 589 + // 590 + // 591 + // 592 + // 593 + // 594 + // 595 + script->set_constant("SI_SILVERVEIN_RUSH_POSTDELAY", SI_SILVERVEIN_RUSH_POSTDELAY, false, false); + script->set_constant("SI_MIDNIGHT_FRENZY_POSTDELAY", SI_MIDNIGHT_FRENZY_POSTDELAY, false, false); + script->set_constant("SI_GOLDENE_FERSE", SI_GOLDENE_FERSE, false, false); + script->set_constant("SI_ANGRIFFS_MODUS", SI_ANGRIFFS_MODUS, false, false); + + script->set_constant("SI_TINDER_BREAKER", SI_TINDER_BREAKER, false, false); + script->set_constant("SI_TINDER_BREAKER_POSTDELAY", SI_TINDER_BREAKER_POSTDELAY, false, false); + script->set_constant("SI_CBC", SI_CBC, false, false); + script->set_constant("SI_CBC_POSTDELAY", SI_CBC_POSTDELAY, false, false); + script->set_constant("SI_EQC", SI_EQC, false, false); + script->set_constant("SI_MAGMA_FLOW", SI_MAGMA_FLOW, false, false); + script->set_constant("SI_GRANITIC_ARMOR", SI_GRANITIC_ARMOR, false, false); + script->set_constant("SI_PYROCLASTIC", SI_PYROCLASTIC, false, false); + script->set_constant("SI_VOLCANIC_ASH", SI_VOLCANIC_ASH, false, false); + script->set_constant("SI_SPIRITS_SAVEINFO1", SI_SPIRITS_SAVEINFO1, false, false); + script->set_constant("SI_SPIRITS_SAVEINFO2", SI_SPIRITS_SAVEINFO2, false, false); + script->set_constant("SI_MAGIC_CANDY", SI_MAGIC_CANDY, false, false); + script->set_constant("SI_SEARCH_STORE_INFO", SI_SEARCH_STORE_INFO, false, false); + script->set_constant("SI_ALL_RIDING", SI_ALL_RIDING, false, false); + script->set_constant("SI_ALL_RIDING_REUSE_LIMIT", SI_ALL_RIDING_REUSE_LIMIT, false, false); + script->set_constant("SI_MACRO", SI_MACRO, false, false); + script->set_constant("SI_MACRO_POSTDELAY", SI_MACRO_POSTDELAY, false, false); + script->set_constant("SI_BEER_BOTTLE_CAP", SI_BEER_BOTTLE_CAP, false, false); + script->set_constant("SI_OVERLAPEXPUP", SI_OVERLAPEXPUP, false, false); + script->set_constant("SI_PC_IZ_DUN05", SI_PC_IZ_DUN05, false, false); + script->set_constant("SI_CRUSHSTRIKE", SI_CRUSHSTRIKE, false, false); + script->set_constant("SI_MONSTER_TRANSFORM", SI_MONSTER_TRANSFORM, false, false); + script->set_constant("SI_SIT", SI_SIT, false, false); + script->set_constant("SI_ONAIR", SI_ONAIR, false, false); + script->set_constant("SI_MTF_ASPD", SI_MTF_ASPD, false, false); + script->set_constant("SI_MTF_RANGEATK", SI_MTF_RANGEATK, false, false); + script->set_constant("SI_MTF_MATK", SI_MTF_MATK, false, false); + script->set_constant("SI_MTF_MLEATKED", SI_MTF_MLEATKED, false, false); + script->set_constant("SI_MTF_CRIDAMAGE", SI_MTF_CRIDAMAGE, false, false); + script->set_constant("SI_REUSE_LIMIT_MTF", SI_REUSE_LIMIT_MTF, false, false); + script->set_constant("SI_MACRO_PERMIT", SI_MACRO_PERMIT, false, false); + script->set_constant("SI_MACRO_PLAY", SI_MACRO_PLAY, false, false); + script->set_constant("SI_SKF_CAST", SI_SKF_CAST, false, false); + script->set_constant("SI_SKF_ASPD", SI_SKF_ASPD, false, false); + script->set_constant("SI_SKF_ATK", SI_SKF_ATK, false, false); + script->set_constant("SI_SKF_MATK", SI_SKF_MATK, false, false); + script->set_constant("SI_REWARD_PLUSONLYJOBEXP", SI_REWARD_PLUSONLYJOBEXP, false, false); + script->set_constant("SI_HANDICAPSTATE_NORECOVER", SI_HANDICAPSTATE_NORECOVER, false, false); + script->set_constant("SI_SET_NUM_DEF", SI_SET_NUM_DEF, false, false); + script->set_constant("SI_SET_NUM_MDEF", SI_SET_NUM_MDEF, false, false); + script->set_constant("SI_SET_PER_DEF", SI_SET_PER_DEF, false, false); + script->set_constant("SI_SET_PER_MDEF", SI_SET_PER_MDEF, false, false); + script->set_constant("SI_PARTYBOOKING_SEARCH_DEALY", SI_PARTYBOOKING_SEARCH_DEALY, false, false); + script->set_constant("SI_PARTYBOOKING_REGISTER_DEALY", SI_PARTYBOOKING_REGISTER_DEALY, false, false); + script->set_constant("SI_PERIOD_TIME_CHECK_DETECT_SKILL", SI_PERIOD_TIME_CHECK_DETECT_SKILL, false, false); + script->set_constant("SI_KO_JYUMONJIKIRI", SI_KO_JYUMONJIKIRI, false, false); + script->set_constant("SI_MEIKYOUSISUI", SI_MEIKYOUSISUI, false, false); + script->set_constant("SI_ATTHASTE_CASH", SI_ATTHASTE_CASH, false, false); + script->set_constant("SI_EQUIPPED_DIVINE_ARMOR", SI_EQUIPPED_DIVINE_ARMOR, false, false); + script->set_constant("SI_EQUIPPED_HOLY_ARMOR", SI_EQUIPPED_HOLY_ARMOR, false, false); + + script->set_constant("SI_2011RWC", SI_2011RWC, false, false); + script->set_constant("SI_KYOUGAKU", SI_KYOUGAKU, false, false); + script->set_constant("SI_IZAYOI", SI_IZAYOI, false, false); + script->set_constant("SI_ZENKAI", SI_ZENKAI, false, false); + script->set_constant("SI_KG_KAGEHUMI", SI_KG_KAGEHUMI, false, false); + script->set_constant("SI_KYOMU", SI_KYOMU, false, false); + script->set_constant("SI_KAGEMUSYA", SI_KAGEMUSYA, false, false); + script->set_constant("SI_ZANGETSU", SI_ZANGETSU, false, false); + script->set_constant("SI_PHI_DEMON", SI_PHI_DEMON, false, false); + script->set_constant("SI_GENSOU", SI_GENSOU, false, false); + script->set_constant("SI_AKAITSUKI", SI_AKAITSUKI, false, false); + script->set_constant("SI_TETANY", SI_TETANY, false, false); + script->set_constant("SI_GM_BATTLE", SI_GM_BATTLE, false, false); + script->set_constant("SI_GM_BATTLE2", SI_GM_BATTLE2, false, false); + script->set_constant("SI_2011RWC_SCROLL", SI_2011RWC_SCROLL, false, false); + script->set_constant("SI_ACTIVE_MONSTER_TRANSFORM", SI_ACTIVE_MONSTER_TRANSFORM, false, false); + script->set_constant("SI_MYSTICPOWDER", SI_MYSTICPOWDER, false, false); + script->set_constant("SI_ECLAGE_RECALL", SI_ECLAGE_RECALL, false, false); + script->set_constant("SI_ENTRY_QUEUE_APPLY_DELAY", SI_ENTRY_QUEUE_APPLY_DELAY, false, false); + script->set_constant("SI_REUSE_LIMIT_ECL", SI_REUSE_LIMIT_ECL, false, false); + script->set_constant("SI_M_LIFEPOTION", SI_M_LIFEPOTION, false, false); + script->set_constant("SI_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT", SI_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT, false, false); + script->set_constant("SI_UNKNOWN_NAME", SI_UNKNOWN_NAME, false, false); + script->set_constant("SI_ON_PUSH_CART", SI_ON_PUSH_CART, false, false); + script->set_constant("SI_HAT_EFFECT", SI_HAT_EFFECT, false, false); + script->set_constant("SI_FLOWER_LEAF", SI_FLOWER_LEAF, false, false); + script->set_constant("SI_RAY_OF_PROTECTION", SI_RAY_OF_PROTECTION, false, false); + script->set_constant("SI_GLASTHEIM_ATK", SI_GLASTHEIM_ATK, false, false); + script->set_constant("SI_GLASTHEIM_DEF", SI_GLASTHEIM_DEF, false, false); + script->set_constant("SI_GLASTHEIM_HEAL", SI_GLASTHEIM_HEAL, false, false); + script->set_constant("SI_GLASTHEIM_HIDDEN", SI_GLASTHEIM_HIDDEN, false, false); + script->set_constant("SI_GLASTHEIM_STATE", SI_GLASTHEIM_STATE, false, false); + script->set_constant("SI_GLASTHEIM_ITEMDEF", SI_GLASTHEIM_ITEMDEF, false, false); + script->set_constant("SI_GLASTHEIM_HPSP", SI_GLASTHEIM_HPSP, false, false); + script->set_constant("SI_HOMUN_SKILL_POSTDELAY", SI_HOMUN_SKILL_POSTDELAY, false, false); + script->set_constant("SI_ALMIGHTY", SI_ALMIGHTY, false, false); + script->set_constant("SI_GVG_GIANT", SI_GVG_GIANT, false, false); + script->set_constant("SI_GVG_GOLEM", SI_GVG_GOLEM, false, false); + script->set_constant("SI_GVG_STUN", SI_GVG_STUN, false, false); + script->set_constant("SI_GVG_STONE", SI_GVG_STONE, false, false); + script->set_constant("SI_GVG_FREEZ", SI_GVG_FREEZ, false, false); + script->set_constant("SI_GVG_SLEEP", SI_GVG_SLEEP, false, false); + script->set_constant("SI_GVG_CURSE", SI_GVG_CURSE, false, false); + script->set_constant("SI_GVG_SILENCE", SI_GVG_SILENCE, false, false); + script->set_constant("SI_GVG_BLIND", SI_GVG_BLIND, false, false); + script->set_constant("SI_CLIENT_ONLY_EQUIP_ARROW", SI_CLIENT_ONLY_EQUIP_ARROW, false, false); + script->set_constant("SI_CLAN_INFO", SI_CLAN_INFO, false, false); + script->set_constant("SI_JP_EVENT01", SI_JP_EVENT01, false, false); + script->set_constant("SI_JP_EVENT02", SI_JP_EVENT02, false, false); + script->set_constant("SI_JP_EVENT03", SI_JP_EVENT03, false, false); + + script->set_constant("SI_JP_EVENT04", SI_JP_EVENT04, false, false); + script->set_constant("SI_TELEPORT_FIXEDCASTINGDELAY", SI_TELEPORT_FIXEDCASTINGDELAY, false, false); + script->set_constant("SI_GEFFEN_MAGIC1", SI_GEFFEN_MAGIC1, false, false); + script->set_constant("SI_GEFFEN_MAGIC2", SI_GEFFEN_MAGIC2, false, false); + script->set_constant("SI_GEFFEN_MAGIC3", SI_GEFFEN_MAGIC3, false, false); + script->set_constant("SI_QUEST_BUFF1", SI_QUEST_BUFF1, false, false); + script->set_constant("SI_QUEST_BUFF2", SI_QUEST_BUFF2, false, false); + script->set_constant("SI_QUEST_BUFF3", SI_QUEST_BUFF3, false, false); + script->set_constant("SI_REUSE_LIMIT_RECALL", SI_REUSE_LIMIT_RECALL, false, false); + script->set_constant("SI_SAVEPOSITION", SI_SAVEPOSITION, false, false); + script->set_constant("SI_HANDICAPSTATE_ICEEXPLO", SI_HANDICAPSTATE_ICEEXPLO, false, false); + script->set_constant("SI_FENRIR_CARD", SI_FENRIR_CARD, false, false); + script->set_constant("SI_REUSE_LIMIT_ASPD_POTION", SI_REUSE_LIMIT_ASPD_POTION, false, false); + script->set_constant("SI_MAXPAIN", SI_MAXPAIN, false, false); + script->set_constant("SI_PC_STOP", SI_PC_STOP, false, false); + script->set_constant("SI_FRIGG_SONG", SI_FRIGG_SONG, false, false); + script->set_constant("SI_OFFERTORIUM", SI_OFFERTORIUM, false, false); + script->set_constant("SI_TELEKINESIS_INTENSE", SI_TELEKINESIS_INTENSE, false, false); + script->set_constant("SI_MOONSTAR", SI_MOONSTAR, false, false); + script->set_constant("SI_STRANGELIGHTS", SI_STRANGELIGHTS, false, false); + script->set_constant("SI_FULL_THROTTLE", SI_FULL_THROTTLE, false, false); + script->set_constant("SI_REBOUND", SI_REBOUND, false, false); + script->set_constant("SI_UNLIMIT", SI_UNLIMIT, false, false); + script->set_constant("SI_KINGS_GRACE", SI_KINGS_GRACE, false, false); + script->set_constant("SI_ITEM_ATKMAX", SI_ITEM_ATKMAX, false, false); + script->set_constant("SI_ITEM_ATKMIN", SI_ITEM_ATKMIN, false, false); + script->set_constant("SI_ITEM_MATKMAX", SI_ITEM_MATKMAX, false, false); + script->set_constant("SI_ITEM_MATKMIN", SI_ITEM_MATKMIN, false, false); + script->set_constant("SI_SUPER_STAR", SI_SUPER_STAR, false, false); + script->set_constant("SI_HIGH_RANKER", SI_HIGH_RANKER, false, false); + script->set_constant("SI_DARKCROW", SI_DARKCROW, false, false); + script->set_constant("SI_2013_VALENTINE1", SI_2013_VALENTINE1, false, false); + script->set_constant("SI_2013_VALENTINE2", SI_2013_VALENTINE2, false, false); + script->set_constant("SI_2013_VALENTINE3", SI_2013_VALENTINE3, false, false); + script->set_constant("SI_ILLUSIONDOPING", SI_ILLUSIONDOPING, false, false); + //script->set_constant("SI_WIDEWEB", SI_WIDEWEB, false, false); + script->set_constant("SI_CHILL", SI_CHILL, false, false); + script->set_constant("SI_BURNT", SI_BURNT, false, false); + //script->set_constant("SI_PCCAFE_PLAY_TIME", SI_PCCAFE_PLAY_TIME, false, false); + //script->set_constant("SI_TWISTED_TIME", SI_TWISTED_TIME, false, false); + script->set_constant("SI_FLASHCOMBO", SI_FLASHCOMBO, false, false); + //script->set_constant("SI_JITTER_BUFF1", SI_JITTER_BUFF1, false, false); + //script->set_constant("SI_JITTER_BUFF2", SI_JITTER_BUFF2, false, false); + //script->set_constant("SI_JITTER_BUFF3", SI_JITTER_BUFF3, false, false); + //script->set_constant("SI_JITTER_BUFF4", SI_JITTER_BUFF4, false, false); + //script->set_constant("SI_JITTER_BUFF5", SI_JITTER_BUFF5, false, false); + //script->set_constant("SI_JITTER_BUFF6", SI_JITTER_BUFF6, false, false); + //script->set_constant("SI_JITTER_BUFF7", SI_JITTER_BUFF7, false, false); + //script->set_constant("SI_JITTER_BUFF8", SI_JITTER_BUFF8, false, false); + //script->set_constant("SI_JITTER_BUFF9", SI_JITTER_BUFF9, false, false); + + //script->set_constant("SI_JITTER_BUFF10", SI_JITTER_BUFF10, false, false); + script->set_constant("SI_CUP_OF_BOZA", SI_CUP_OF_BOZA, false, false); + script->set_constant("SI_B_TRAP", SI_B_TRAP, false, false); + script->set_constant("SI_E_CHAIN", SI_E_CHAIN, false, false); + script->set_constant("SI_E_QD_SHOT_READY", SI_E_QD_SHOT_READY, false, false); + script->set_constant("SI_C_MARKER", SI_C_MARKER, false, false); + script->set_constant("SI_H_MINE", SI_H_MINE, false, false); + script->set_constant("SI_H_MINE_SPLASH", SI_H_MINE_SPLASH, false, false); + script->set_constant("SI_P_ALTER", SI_P_ALTER, false, false); + script->set_constant("SI_HEAT_BARREL", SI_HEAT_BARREL, false, false); + script->set_constant("SI_ANTI_M_BLAST", SI_ANTI_M_BLAST, false, false); + script->set_constant("SI_SLUGSHOT", SI_SLUGSHOT, false, false); + script->set_constant("SI_SWORDCLAN", SI_SWORDCLAN, false, false); + script->set_constant("SI_ARCWANDCLAN", SI_ARCWANDCLAN, false, false); + script->set_constant("SI_GOLDENMACECLAN", SI_GOLDENMACECLAN, false, false); + script->set_constant("SI_CROSSBOWCLAN", SI_CROSSBOWCLAN, false, false); + script->set_constant("SI_PACKING_ENVELOPE1", SI_PACKING_ENVELOPE1, false, false); + script->set_constant("SI_PACKING_ENVELOPE2", SI_PACKING_ENVELOPE2, false, false); + script->set_constant("SI_PACKING_ENVELOPE3", SI_PACKING_ENVELOPE3, false, false); + script->set_constant("SI_PACKING_ENVELOPE4", SI_PACKING_ENVELOPE4, false, false); + script->set_constant("SI_PACKING_ENVELOPE5", SI_PACKING_ENVELOPE5, false, false); + script->set_constant("SI_PACKING_ENVELOPE6", SI_PACKING_ENVELOPE6, false, false); + script->set_constant("SI_PACKING_ENVELOPE7", SI_PACKING_ENVELOPE7, false, false); + script->set_constant("SI_PACKING_ENVELOPE8", SI_PACKING_ENVELOPE8, false, false); + script->set_constant("SI_PACKING_ENVELOPE9", SI_PACKING_ENVELOPE9, false, false); + script->set_constant("SI_PACKING_ENVELOPE10", SI_PACKING_ENVELOPE10, false, false); + script->set_constant("SI_GLASTHEIM_TRANS", SI_GLASTHEIM_TRANS, false, false); + //script->set_constant("SI_ZONGZI_POUCH_TRANS", SI_ZONGZI_POUCH_TRANS, false, false); + script->set_constant("SI_HEAT_BARREL_AFTER", SI_HEAT_BARREL_AFTER, false, false); + script->set_constant("SI_DECORATION_OF_MUSIC", SI_DECORATION_OF_MUSIC, false, false); + //script->set_constant("SI_OVERSEAEXPUP", SI_OVERSEAEXPUP, false, false); + //script->set_constant("SI_CLOWN_N_GYPSY_CARD", SI_CLOWN_N_GYPSY_CARD, false, false); + //script->set_constant("SI_OPEN_NPC_MARKET", SI_OPEN_NPC_MARKET, false, false); + //script->set_constant("SI_BEEF_RIB_STEW", SI_BEEF_RIB_STEW, false, false); + //script->set_constant("SI_PORK_RIB_STEW", SI_PORK_RIB_STEW, false, false); + //script->set_constant("SI_CHUSEOK_MONDAY", SI_CHUSEOK_MONDAY, false, false); + //script->set_constant("SI_CHUSEOK_TUESDAY", SI_CHUSEOK_TUESDAY, false, false); + //script->set_constant("SI_CHUSEOK_WEDNESDAY", SI_CHUSEOK_WEDNESDAY, false, false); + //script->set_constant("SI_CHUSEOK_THURSDAY", SI_CHUSEOK_THURSDAY, false, false); + //script->set_constant("SI_CHUSEOK_FRIDAY", SI_CHUSEOK_FRIDAY, false, false); + //script->set_constant("SI_CHUSEOK_WEEKEND", SI_CHUSEOK_WEEKEND, false, false); + //script->set_constant("SI_ALL_LIGHTGUARD", SI_ALL_LIGHTGUARD, false, false); + //script->set_constant("SI_ALL_LIGHTGUARD_COOL_TIME", SI_ALL_LIGHTGUARD_COOL_TIME, false, false); + script->set_constant("SI_MTF_MHP", SI_MTF_MHP, false, false); + script->set_constant("SI_MTF_MSP", SI_MTF_MSP, false, false); + script->set_constant("SI_MTF_PUMPKIN", SI_MTF_PUMPKIN, false, false); + script->set_constant("SI_MTF_HITFLEE", SI_MTF_HITFLEE, false, false); + //script->set_constant("SI_MTF_CRIDAMAGE2", SI_MTF_CRIDAMAGE2, false, false); + //script->set_constant("SI_MTF_SPDRAIN", SI_MTF_SPDRAIN, false, false); + //script->set_constant("SI_ACUO_MINT_GUM", SI_ACUO_MINT_GUM, false, false); + + //script->set_constant("SI_S_HEALPOTION", SI_S_HEALPOTION, false, false); + //script->set_constant("SI_REUSE_LIMIT_S_HEAL_POTION", SI_REUSE_LIMIT_S_HEAL_POTION, false, false); + //script->set_constant("SI_PLAYTIME_STATISTICS", SI_PLAYTIME_STATISTICS, false, false); + //script->set_constant("SI_GN_CHANGEMATERIAL_OPERATOR", SI_GN_CHANGEMATERIAL_OPERATOR, false, false); + //script->set_constant("SI_GN_MIX_COOKING_OPERATOR", SI_GN_MIX_COOKING_OPERATOR, false, false); + //script->set_constant("SI_GN_MAKEBOMB_OPERATOR", SI_GN_MAKEBOMB_OPERATOR, false, false); + //script->set_constant("SI_GN_S_PHARMACY_OPERATOR", SI_GN_S_PHARMACY_OPERATOR, false, false); + //script->set_constant("SI_SO_EL_ANALYSIS_DISASSEMBLY_OPERATOR", SI_SO_EL_ANALYSIS_DISASSEMBLY_OPERATOR, false, false); + //script->set_constant("SI_SO_EL_ANALYSIS_COMBINATION_OPERATOR", SI_SO_EL_ANALYSIS_COMBINATION_OPERATOR, false, false); + //script->set_constant("SI_NC_MAGICDECOY_OPERATOR", SI_NC_MAGICDECOY_OPERATOR, false, false); + //script->set_constant("SI_GUILD_STORAGE", SI_GUILD_STORAGE, false, false); + //script->set_constant("SI_GC_POISONINGWEAPON_OPERATOR", SI_GC_POISONINGWEAPON_OPERATOR, false, false); + //script->set_constant("SI_WS_WEAPONREFINE_OPERATOR", SI_WS_WEAPONREFINE_OPERATOR, false, false); + //script->set_constant("SI_BS_REPAIRWEAPON_OPERATOR", SI_BS_REPAIRWEAPON_OPERATOR, false, false); + //script->set_constant("SI_GET_MAILBOX", SI_GET_MAILBOX, false, false); + //script->set_constant("SI_JUMPINGCLAN", SI_JUMPINGCLAN, false, false); + //script->set_constant("SI_JP_OTP", SI_JP_OTP, false, false); + //script->set_constant("SI_HANDICAPTOLERANCE_LEVELGAP", SI_HANDICAPTOLERANCE_LEVELGAP, false, false); + //script->set_constant("SI_MTF_RANGEATK2", SI_MTF_RANGEATK2, false, false); + //script->set_constant("SI_MTF_ASPD2", SI_MTF_ASPD2, false, false); + //script->set_constant("SI_MTF_MATK2", SI_MTF_MATK2, false, false); + //script->set_constant("SI_SHOW_NPCHPBAR", SI_SHOW_NPCHPBAR, false, false); + script->set_constant("SI_FLOWERSMOKE", SI_FLOWERSMOKE, false, false); + script->set_constant("SI_FSTONE", SI_FSTONE, false, false); + //script->set_constant("SI_DAILYSENDMAILCNT", SI_DAILYSENDMAILCNT, false, false); + //script->set_constant("SI_QSCARABA", SI_QSCARABA, false, false); + script->set_constant("SI_LJOSALFAR", SI_LJOSALFAR, false, false); + //script->set_constant("SI_PAD_READER_KNIGHT", SI_PAD_READER_KNIGHT, false, false); + //script->set_constant("SI_PAD_READER_CRUSADER", SI_PAD_READER_CRUSADER, false, false); + //script->set_constant("SI_PAD_READER_BLACKSMITH", SI_PAD_READER_BLACKSMITH, false, false); + //script->set_constant("SI_PAD_READER_ALCHEMIST", SI_PAD_READER_ALCHEMIST, false, false); + //script->set_constant("SI_PAD_READER_ASSASSIN", SI_PAD_READER_ASSASSIN, false, false); + //script->set_constant("SI_PAD_READER_ROGUE", SI_PAD_READER_ROGUE, false, false); + //script->set_constant("SI_PAD_READER_WIZARD", SI_PAD_READER_WIZARD, false, false); + //script->set_constant("SI_PAD_READER_SAGE", SI_PAD_READER_SAGE, false, false); + //script->set_constant("SI_PAD_READER_PRIEST", SI_PAD_READER_PRIEST, false, false); + //script->set_constant("SI_PAD_READER_MONK", SI_PAD_READER_MONK, false, false); + //script->set_constant("SI_PAD_READER_HUNTER", SI_PAD_READER_HUNTER, false, false); + //script->set_constant("SI_PAD_READER_BARD", SI_PAD_READER_BARD, false, false); + //script->set_constant("SI_PAD_READER_DANCER", SI_PAD_READER_DANCER, false, false); + //script->set_constant("SI_PAD_READER_TAEKWON", SI_PAD_READER_TAEKWON, false, false); + //script->set_constant("SI_PAD_READER_NINJA", SI_PAD_READER_NINJA, false, false); + //script->set_constant("SI_PAD_READER_GUNSLINGER", SI_PAD_READER_GUNSLINGER, false, false); + //script->set_constant("SI_PAD_READER_SUPERNOVICE", SI_PAD_READER_SUPERNOVICE, false, false); + //script->set_constant("SI_ESSENCE_OF_TIME", SI_ESSENCE_OF_TIME, false, false); + //script->set_constant("SI_MINIGAME_ROULETTE", SI_MINIGAME_ROULETTE, false, false); + //script->set_constant("SI_MINIGAME_GOLD_POINT", SI_MINIGAME_GOLD_POINT, false, false); + //script->set_constant("SI_MINIGAME_SILVER_POINT", SI_MINIGAME_SILVER_POINT, false, false); + //script->set_constant("SI_MINIGAME_BRONZE_POINT", SI_MINIGAME_BRONZE_POINT, false, false); + script->set_constant("SI_HAPPINESS_STAR", SI_HAPPINESS_STAR, false, false); + + //script->set_constant("SI_SUMMEREVENT01", SI_SUMMEREVENT01, false, false); + //script->set_constant("SI_SUMMEREVENT02", SI_SUMMEREVENT02, false, false); + //script->set_constant("SI_SUMMEREVENT03", SI_SUMMEREVENT03, false, false); + //script->set_constant("SI_SUMMEREVENT04", SI_SUMMEREVENT04, false, false); + //script->set_constant("SI_SUMMEREVENT05", SI_SUMMEREVENT05, false, false); + //script->set_constant("SI_MINIGAME_ROULETTE_BONUS_ITEM", SI_MINIGAME_ROULETTE_BONUS_ITEM, false, false); + //script->set_constant("SI_DRESS_UP", SI_DRESS_UP, false, false); + script->set_constant("SI_MAPLE_FALLS", SI_MAPLE_FALLS, false, false); + //script->set_constant("SI_ALL_NIFLHEIM_RECALL", SI_ALL_NIFLHEIM_RECALL, false, false); + // 859 + //script->set_constant("SI_MTF_MARIONETTE", SI_MTF_MARIONETTE, false, false); + //script->set_constant("SI_MTF_LUDE", SI_MTF_LUDE, false, false); + //script->set_constant("SI_MTF_CRUISER", SI_MTF_CRUISER, false, false); + script->set_constant("SI_MERMAID_LONGING", SI_MERMAID_LONGING, false, false); + script->set_constant("SI_MAGICAL_FEATHER", SI_MAGICAL_FEATHER, false, false); + //script->set_constant("SI_DRACULA_CARD", SI_DRACULA_CARD, false, false); + // 866 + //script->set_constant("SI_LIMIT_POWER_BOOSTER", SI_LIMIT_POWER_BOOSTER, false, false); + // 868 + // 869 + // 870 + // 871 + script->set_constant("SI_TIME_ACCESSORY", SI_TIME_ACCESSORY, false, false); + //script->set_constant("SI_EP16_DEF", SI_EP16_DEF, false, false); + //script->set_constant("SI_NORMAL_ATKED_SP", SI_NORMAL_ATKED_SP, false, false); + //script->set_constant("SI_BODYSTATE_STONECURSE", SI_BODYSTATE_STONECURSE, false, false); + //script->set_constant("SI_BODYSTATE_FREEZING", SI_BODYSTATE_FREEZING, false, false); + //script->set_constant("SI_BODYSTATE_STUN", SI_BODYSTATE_STUN, false, false); + //script->set_constant("SI_BODYSTATE_SLEEP", SI_BODYSTATE_SLEEP, false, false); + //script->set_constant("SI_BODYSTATE_UNDEAD", SI_BODYSTATE_UNDEAD, false, false); + //script->set_constant("SI_BODYSTATE_STONECURSE_ING", SI_BODYSTATE_STONECURSE_ING, false, false); + //script->set_constant("SI_BODYSTATE_BURNNING", SI_BODYSTATE_BURNNING, false, false); + //script->set_constant("SI_BODYSTATE_IMPRISON", SI_BODYSTATE_IMPRISON, false, false); + //script->set_constant("SI_HEALTHSTATE_POISON", SI_HEALTHSTATE_POISON, false, false); + //script->set_constant("SI_HEALTHSTATE_CURSE", SI_HEALTHSTATE_CURSE, false, false); + //script->set_constant("SI_HEALTHSTATE_SILENCE", SI_HEALTHSTATE_SILENCE, false, false); + //script->set_constant("SI_HEALTHSTATE_CONFUSION", SI_HEALTHSTATE_CONFUSION, false, false); + //script->set_constant("SI_HEALTHSTATE_BLIND", SI_HEALTHSTATE_BLIND, false, false); + //script->set_constant("SI_HEALTHSTATE_ANGELUS", SI_HEALTHSTATE_ANGELUS, false, false); + //script->set_constant("SI_HEALTHSTATE_BLOODING", SI_HEALTHSTATE_BLOODING, false, false); + //script->set_constant("SI_HEALTHSTATE_HEAVYPOISON", SI_HEALTHSTATE_HEAVYPOISON, false, false); + //script->set_constant("SI_HEALTHSTATE_FEAR", SI_HEALTHSTATE_FEAR, false, false); + //script->set_constant("SI_CHERRY_BLOSSOM_CAKE", SI_CHERRY_BLOSSOM_CAKE, false, false); + script->set_constant("SI_SU_STOOP", SI_SU_STOOP, false, false); + script->set_constant("SI_CATNIPPOWDER", SI_CATNIPPOWDER, false, false); + script->set_constant("SI_BLOSSOM_FLUTTERING", SI_BLOSSOM_FLUTTERING, false, false); + script->set_constant("SI_SV_ROOTTWIST", SI_SV_ROOTTWIST, false, false); + //script->set_constant("SI_ATTACK_PROPERTY_NOTHING", SI_ATTACK_PROPERTY_NOTHING, false, false); + //script->set_constant("SI_ATTACK_PROPERTY_WATER", SI_ATTACK_PROPERTY_WATER, false, false); + //script->set_constant("SI_ATTACK_PROPERTY_GROUND", SI_ATTACK_PROPERTY_GROUND, false, false); + + //script->set_constant("SI_ATTACK_PROPERTY_FIRE", SI_ATTACK_PROPERTY_FIRE, false, false); + //script->set_constant("SI_ATTACK_PROPERTY_WIND", SI_ATTACK_PROPERTY_WIND, false, false); + //script->set_constant("SI_ATTACK_PROPERTY_POISON", SI_ATTACK_PROPERTY_POISON, false, false); + //script->set_constant("SI_ATTACK_PROPERTY_SAINT", SI_ATTACK_PROPERTY_SAINT, false, false); + //script->set_constant("SI_ATTACK_PROPERTY_DARKNESS", SI_ATTACK_PROPERTY_DARKNESS, false, false); + //script->set_constant("SI_ATTACK_PROPERTY_TELEKINESIS", SI_ATTACK_PROPERTY_TELEKINESIS, false, false); + //script->set_constant("SI_ATTACK_PROPERTY_UNDEAD", SI_ATTACK_PROPERTY_UNDEAD, false, false); + //script->set_constant("SI_RESIST_PROPERTY_NOTHING", SI_RESIST_PROPERTY_NOTHING, false, false); + //script->set_constant("SI_RESIST_PROPERTY_WATER", SI_RESIST_PROPERTY_WATER, false, false); + //script->set_constant("SI_RESIST_PROPERTY_GROUND", SI_RESIST_PROPERTY_GROUND, false, false); + //script->set_constant("SI_RESIST_PROPERTY_FIRE", SI_RESIST_PROPERTY_FIRE, false, false); + //script->set_constant("SI_RESIST_PROPERTY_WIND", SI_RESIST_PROPERTY_WIND, false, false); + //script->set_constant("SI_RESIST_PROPERTY_POISON", SI_RESIST_PROPERTY_POISON, false, false); + //script->set_constant("SI_RESIST_PROPERTY_SAINT", SI_RESIST_PROPERTY_SAINT, false, false); + //script->set_constant("SI_RESIST_PROPERTY_DARKNESS", SI_RESIST_PROPERTY_DARKNESS, false, false); + //script->set_constant("SI_RESIST_PROPERTY_TELEKINESIS", SI_RESIST_PROPERTY_TELEKINESIS, false, false); + //script->set_constant("SI_RESIST_PROPERTY_UNDEAD", SI_RESIST_PROPERTY_UNDEAD, false, false); + script->set_constant("SI_BITESCAR", SI_BITESCAR, false, false); + script->set_constant("SI_ARCLOUSEDASH", SI_ARCLOUSEDASH, false, false); + script->set_constant("SI_TUNAPARTY", SI_TUNAPARTY, false, false); + script->set_constant("SI_SHRIMP", SI_SHRIMP, false, false); + script->set_constant("SI_FRESHSHRIMP", SI_FRESHSHRIMP, false, false); + //script->set_constant("SI_PERIOD_RECEIVEITEM", SI_PERIOD_RECEIVEITEM, false, false); + //script->set_constant("SI_PERIOD_PLUSEXP", SI_PERIOD_PLUSEXP, false, false); + //script->set_constant("SI_PERIOD_PLUSJOBEXP", SI_PERIOD_PLUSJOBEXP, false, false); + //script->set_constant("SI_RUNEHELM", SI_RUNEHELM, false, false); + //script->set_constant("SI_HELM_VERKANA", SI_HELM_VERKANA, false, false); + //script->set_constant("SI_HELM_RHYDO", SI_HELM_RHYDO, false, false); + //script->set_constant("SI_HELM_TURISUS", SI_HELM_TURISUS, false, false); + //script->set_constant("SI_HELM_HAGALAS", SI_HELM_HAGALAS, false, false); + //script->set_constant("SI_HELM_ISIA", SI_HELM_ISIA, false, false); + //script->set_constant("SI_HELM_ASIR", SI_HELM_ASIR, false, false); + //script->set_constant("SI_HELM_URJ", SI_HELM_URJ, false, false); + script->set_constant("SI_SUHIDE", SI_SUHIDE, false, false); + // 934 + //script->set_constant("SI_DORAM_BUF_01", SI_DORAM_BUF_01, false, false); + //script->set_constant("SI_DORAM_BUF_02", SI_DORAM_BUF_02, false, false); + script->set_constant("SI_SPRITEMABLE", SI_SPRITEMABLE, false, false); + //script->set_constant("SI_AID_PERIOD_RECEIVEITEM", SI_AID_PERIOD_RECEIVEITEM, false, false); + //script->set_constant("SI_AID_PERIOD_PLUSEXP", SI_AID_PERIOD_PLUSEXP, false, false); + //script->set_constant("SI_AID_PERIOD_PLUSJOBEXP", SI_AID_PERIOD_PLUSJOBEXP, false, false); + //script->set_constant("SI_AID_PERIOD_DEADPENALTY", SI_AID_PERIOD_DEADPENALTY, false, false); + //script->set_constant("SI_AID_PERIOD_ADDSTOREITEMCOUNT", SI_AID_PERIOD_ADDSTOREITEMCOUNT, false, false); + // 943 + // 944 + // 945 + // 946 + // 947 + // 948 + // 949 + //script->set_constant("SI_HISS", SI_HISS, false, false); + // 951 + //script->set_constant("SI_NYANGGRASS", SI_NYANGGRASS, false, false); + //script->set_constant("SI_CHATTERING", SI_CHATTERING, false, false); + // 954 + // 955 + // 956 + // 957 + // 958 + // 959 + // 960 + //script->set_constant("SI_GROOMING", SI_GROOMING, false, false); + //script->set_constant("SI_PROTECTIONOFSHRIMP", SI_PROTECTIONOFSHRIMP, false, false); + //script->set_constant("SI_EP16_2_BUFF_SS", SI_EP16_2_BUFF_SS, false, false); + //script->set_constant("SI_EP16_2_BUFF_SC", SI_EP16_2_BUFF_SC, false, false); + //script->set_constant("SI_EP16_2_BUFF_AC", SI_EP16_2_BUFF_AC, false, false); + //script->set_constant("SI_GS_MAGICAL_BULLET", SI_GS_MAGICAL_BULLET, false, false); + // 967 + // 968 + // 969 + // 970 + // 971 + // 972 + // 973 + // 974 + // 975 + //script->set_constant("SI_FALLEN_ANGEL", SI_FALLEN_ANGEL, false, false); + // 977 + // 978 + //script->set_constant("SI_BLAZE_BEAD", SI_BLAZE_BEAD, false, false); + //script->set_constant("SI_FROZEN_BEAD", SI_FROZEN_BEAD, false, false); + //script->set_constant("SI_BREEZE_BEAD", SI_BREEZE_BEAD, false, false); + // 982 + //script->set_constant("SI_AID_PERIOD_RECEIVEITEM_2ND", SI_AID_PERIOD_RECEIVEITEM_2ND, false, false); + //script->set_constant("SI_AID_PERIOD_PLUSEXP_2ND", SI_AID_PERIOD_PLUSEXP_2ND, false, false); + //script->set_constant("SI_AID_PERIOD_PLUSJOBEXP_2ND", SI_AID_PERIOD_PLUSJOBEXP_2ND, false, false); + //script->set_constant("SI_PRONTERA_JP", SI_PRONTERA_JP, false, false); + // 987 + //script->set_constant("SI_GLOOM_CARD", SI_GLOOM_CARD, false, false); + //script->set_constant("SI_PHARAOH_CARD", SI_PHARAOH_CARD, false, false); + //script->set_constant("SI_KIEL_CARD", SI_KIEL_CARD, false, false); + // 991 + //script->set_constant("SI_CHEERUP", SI_CHEERUP, false, false); + // 993 + // 994 + //script->set_constant("SI_S_MANAPOTION", SI_S_MANAPOTION, false, false); + //script->set_constant("SI_M_DEFSCROLL", SI_M_DEFSCROLL, false, false); + // 997 + // 998 + // 999 + //script->set_constant("SI_AS_RAGGED_GOLEM_CARD", SI_AS_RAGGED_GOLEM_CARD, false, false); + //script->set_constant("SI_LHZ_DUN_N1", SI_LHZ_DUN_N1, false, false); + //script->set_constant("SI_LHZ_DUN_N2", SI_LHZ_DUN_N2, false, false); + //script->set_constant("SI_LHZ_DUN_N3", SI_LHZ_DUN_N3, false, false); + //script->set_constant("SI_LHZ_DUN_N4", SI_LHZ_DUN_N4, false, false); + + script->set_constant("SI_MAX", SI_MAX, false, false); diff --git a/src/map/script.c b/src/map/script.c index d7a65f554..fc304d4ff 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -24923,6 +24923,7 @@ void script_hardcoded_constants(void) script->set_constant("RENEWAL_ASPD", 0, false, false); #endif script->constdb_comment(NULL); +#include "constants.inc" } /** -- cgit v1.2.3-70-g09d2 From fc1684c82d92de81e5688e33a8386cde3c2407db Mon Sep 17 00:00:00 2001 From: Murilo Pereti Tavares Date: Thu, 25 Jan 2018 01:15:08 -0200 Subject: Implementation of Official Clan System All official features work including the autokick for inactive members And the system is completely customizable. --- conf/clans.conf | 48 ++ conf/map/logs.conf | 5 +- conf/messages.conf | 6 +- db/clans.conf | 141 ++++ db/constants.conf | 5 + db/re/map_zone_db.conf | 19 + db/sc_config.txt | 3 + doc/atcommands.txt | 37 ++ doc/script_commands.txt | 36 + npc/re/other/clans.txt | 581 ++++++++++++++++ npc/re/scripts.conf | 2 + sql-files/logs.sql | 2 +- sql-files/main.sql | 4 + sql-files/upgrades/2017-06-04--15-04.sql | 24 + sql-files/upgrades/2017-06-04--15-05.sql | 23 + sql-files/upgrades/index.txt | 2 + src/char/HPMchar.c | 1 + src/char/Makefile.in | 4 +- src/char/char.c | 13 +- src/char/int_clan.c | 181 +++++ src/char/int_clan.h | 39 ++ src/char/inter.c | 4 +- src/char/mapif.c | 6 + src/char/mapif.h | 3 + src/common/HPMi.h | 5 + src/common/mmo.h | 57 +- src/map/HPMmap.c | 32 +- src/map/Makefile.in | 4 +- src/map/atcommand.c | 275 ++++++-- src/map/battle.c | 32 +- src/map/clan.c | 1071 ++++++++++++++++++++++++++++++ src/map/clan.h | 85 +++ src/map/clif.c | 183 +++++ src/map/clif.h | 8 + src/map/guild.c | 5 + src/map/intif.c | 86 ++- src/map/intif.h | 5 + src/map/log.c | 22 +- src/map/log.h | 1 + src/map/map.c | 18 + src/map/map.h | 3 + src/map/mob.h | 1 + src/map/npc.c | 49 ++ src/map/npc.h | 2 + src/map/packets.h | 15 + src/map/packets_struct.h | 36 + src/map/pc.c | 7 + src/map/pc.h | 1 + src/map/script.c | 145 +++- src/map/skill.c | 2 + src/map/skill.h | 1 + src/map/status.c | 21 + src/map/status.h | 3 + src/map/unit.c | 2 + src/plugins/HPMHooking.c | 2 + vcproj-11/char-server.vcxproj | 2 + vcproj-11/char-server.vcxproj.filters | 6 + vcproj-11/map-server.vcxproj | 2 + vcproj-11/map-server.vcxproj.filters | 6 + vcproj-12/char-server.vcxproj | 2 + vcproj-12/char-server.vcxproj.filters | 6 + vcproj-12/map-server.vcxproj | 2 + vcproj-12/map-server.vcxproj.filters | 6 + vcproj-14/char-server.vcxproj | 2 + vcproj-14/char-server.vcxproj.filters | 6 + vcproj-14/map-server.vcxproj | 2 + vcproj-14/map-server.vcxproj.filters | 6 + 67 files changed, 3309 insertions(+), 107 deletions(-) create mode 100644 conf/clans.conf create mode 100644 db/clans.conf create mode 100644 npc/re/other/clans.txt create mode 100644 sql-files/upgrades/2017-06-04--15-04.sql create mode 100644 sql-files/upgrades/2017-06-04--15-05.sql create mode 100644 src/char/int_clan.c create mode 100644 src/char/int_clan.h create mode 100644 src/map/clan.c create mode 100644 src/map/clan.h diff --git a/conf/clans.conf b/conf/clans.conf new file mode 100644 index 000000000..85ef280fe --- /dev/null +++ b/conf/clans.conf @@ -0,0 +1,48 @@ +//================= Hercules Configuration ================================ +//= _ _ _ +//= | | | | | | +//= | |_| | ___ _ __ ___ _ _| | ___ ___ +//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __| +//= | | | | __/ | | (__| |_| | | __/\__ \ +//= \_| |_/\___|_| \___|\__,_|_|\___||___/ +//================= License =============================================== +//= This file is part of Hercules. +//= http://herc.ws - http://github.com/HerculesWS/Hercules +//= +//= Copyright (C) 2017 Hercules Dev Team +//= +//= Hercules is free software: you can redistribute it and/or modify +//= it under the terms of the GNU General Public License as published by +//= the Free Software Foundation, either version 3 of the License, or +//= (at your option) any later version. +//= +//= This program is distributed in the hope that it will be useful, +//= but WITHOUT ANY WARRANTY; without even the implied warranty of +//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +//= GNU General Public License for more details. +//= +//= You should have received a copy of the GNU General Public License +//= along with this program. If not, see . +//========================================================================= +//= Clan System local configuration file. +//========================================================================= + +clan_configuration: { + + // Maximum players for each clan + MaxMembers: 500 + + // Maximum alliances/oppositions for each clan + MaxRelations: 6 + + // how many hours player must be inactive to be kicked? + // Disabled: 0 + // Official: 336 (2 weeks) + InactivityKickTime: 336 + + // Checks each clan member every 'InactivityCheckTime' hour(s) (default 24h, minimum value of 1h) + InactivityCheckTime: 24 + + // Clan Database + @include "db/clans.conf" +} diff --git a/conf/map/logs.conf b/conf/map/logs.conf index 4f3a8a4db..e2dc7fbdd 100644 --- a/conf/map/logs.conf +++ b/conf/map/logs.conf @@ -164,13 +164,14 @@ map_log: { // 0x04 - Log Party messages // 0x08 - Log Guild messages // 0x10 - Log Main chat messages + // 0x20 - Log Clan messages // Example: // log_chat: 0x5 = logs both Whisper & Party messages // log_chat: 0x8 = logs only Guild messages - // log_chat: 0x1f = logs everything + // log_chat: 0x2f = logs everything // FIXME: This isn't fully functional, as of now it's only checking // if the log is active or not [Panikon] - log_chat: 0x1f + log_chat: 0x2f // Disable chat logging when WoE is running? (Note 1) log_chat_woe_disable: false diff --git a/conf/messages.conf b/conf/messages.conf index 78f0c6aa9..b5a675b25 100644 --- a/conf/messages.conf +++ b/conf/messages.conf @@ -151,7 +151,11 @@ 131: Unable to spawn clone. 132: Slave clone spawned. 133: Unable to spawn slave clone. -//134-142 FREE (possibly for other clone types) +//134-138 FREE (possibly for other clone types) +139: CvC ON | +140: You can't join in a clan if you're in a guild. +141: CvC is already Off. +142: CvC is already On. 143: Commands are disabled in this map. 144: Invalid e-mail. If your email hasn't been set, use a@a.com. 145: Invalid new e-mail. Please enter a real e-mail address. diff --git a/db/clans.conf b/db/clans.conf new file mode 100644 index 000000000..93257f470 --- /dev/null +++ b/db/clans.conf @@ -0,0 +1,141 @@ +//================= Hercules Database ===================================== +//= _ _ _ +//= | | | | | | +//= | |_| | ___ _ __ ___ _ _| | ___ ___ +//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __| +//= | | | | __/ | | (__| |_| | | __/\__ \ +//= \_| |_/\___|_| \___|\__,_|_|\___||___/ +//================= License =============================================== +//= This file is part of Hercules. +//= http://herc.ws - http://github.com/HerculesWS/Hercules +//= +//= Copyright (C) 2017 Hercules Dev Team +//= +//= Hercules is free software: you can redistribute it and/or modify +//= it under the terms of the GNU General Public License as published by +//= the Free Software Foundation, either version 3 of the License, or +//= (at your option) any later version. +//= +//= This program is distributed in the hope that it will be useful, +//= but WITHOUT ANY WARRANTY; without even the implied warranty of +//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +//= GNU General Public License for more details. +//= +//= You should have received a copy of the GNU General Public License +//= along with this program. If not, see . +//========================================================================= +//= Clan System Database File. +//========================================================================= + +clans: ( + /************************************************************************** + ************* Entry structure ******************************************** + ************************************************************************** + { + Id: ID (int) + Const: "Const Name" (string) + Name: "Clan Name" (string) + Leader: "Leader Name" (string) + Map: "Map Name" (string) + MaxMembers: Max (int, optional, overrides MaxMembers on conf/clans.conf) + KickTime: Hours (int, optional, overrides InactivityKickTime) + CheckTime: Hours (int, optional, overrides InactivityCheckTime) + Buff: { + Icon: State Icon ID/Constant (int, you can find all ids on your lua folder: stateicon/efstids.lub or /src/map/constants.inc.h) + Script: <" (optional) + Script (it can be multi-line) + "> + } + Allies: [ + "CLAN_NAME_CONSTANT", (string) + ] + Antagonists: [ + "CLAN_NAME_CONSTANT", (string) + ] + }, + **************************************************************************/ + { + Id: 1 + Const: "SWORDCLAN" + Name: "Sword Clan" + Leader: "Raffam Oranpere" + Map: "prontera" + Buff: { + Icon: "SI_SWORDCLAN" + Script: <" + bonus(bStr, 1); + bonus(bVit, 1); + bonus(bMaxHP, 30); + bonus(bMaxSP, 10); + "> + } + Allies: [ + "GOLDENMACECLAN", + ] + }, + { + Id: 2 + Const: "ARCWANDCLAN" + Name: "Arc Wand Clan" + Leader: "Devon Aire" + Map: "geffen" + Buff: { + Icon: "SI_ARCWANDCLAN" + Script: <" + bonus(bInt, 1); + bonus(bDex, 1); + bonus(bMaxHP, 30); + bonus(bMaxSP, 10); + "> + } + Allies: [ + "GOLDENMACECLAN", + ] + Antagonists: [ + "CROSSBOWCLAN", + ] + }, + { + Id: 3 + Const: "GOLDENMACECLAN" + Name: "Golden Mace Clan" + Leader: "Berman Aire" + Map: "prontera" + Buff: { + Icon: "SI_GOLDENMACECLAN" + Script: <" + bonus(bInt, 1); + bonus(bLuk, 1); + bonus(bMaxHP, 30); + bonus(bMaxSP, 10); + "> + } + Allies: [ + "SWORDCLAN", + "ARCWANDCLAN", + "CROSSBOWCLAN", + ] + }, + { + Id: 4 + Const: "CROSSBOWCLAN" + Name: "Crossbow Clan" + Leader: "Shaam Rumi" + Map: "payon" + Buff: { + Icon: "SI_CROSSBOWCLAN" + Script: <" + bonus(bDex, 1); + bonus(bAgi, 1); + bonus(bMaxHP, 30); + bonus(bMaxSP, 10); + "> + } + Allies: [ + "GOLDENMACECLAN", + ] + Antagonists: [ + "ARCWANDCLAN", + ] + }, +) diff --git a/db/constants.conf b/db/constants.conf index eda877671..8c3336f79 100644 --- a/db/constants.conf +++ b/db/constants.conf @@ -1401,6 +1401,9 @@ constants_db: { // Summer 2 Costume SC_DRESS_UP: 652 + // Clan System + SC_CLAN_INFO: 654 + comment__: "Emotes" e_gasp: 0 e_what: 1 @@ -3720,6 +3723,7 @@ constants_db: { PC_PARTY: 1 PC_GUILD: 2 PC_MAP: 3 + PC_CLAN: 4 comment__: "strnpcinfo" NPC_NAME: 0 @@ -3734,6 +3738,7 @@ constants_db: { CHAR_ID_GUILD: 2 CHAR_ID_ACCOUNT: 3 CHAR_ID_BG: 4 + CHAR_ID_CLAN: 5 comment__: "sc_start" SCFLAG_NONE: 0x00 diff --git a/db/re/map_zone_db.conf b/db/re/map_zone_db.conf index 133cc5337..42391a6f0 100644 --- a/db/re/map_zone_db.conf +++ b/db/re/map_zone_db.conf @@ -176,6 +176,25 @@ zones: ( "nocashshop", ) }, +{ + /* CvC zone is applied to all maps with a cvc mapflag */ + name: "CvC" /* changing this name requires MAP_ZONE_CVC_NAME to also be changed in src/map/map.h file */ + + disabled_skills: { + BS_GREED: "PLAYER" + CG_HERMODE: "PLAYER" + } + + disabled_items: { + Greed_Scroll: true + C_Beginner_Cap: true + } + + /* cashshop disabled in cvc maps */ + mapflags: ( + "nocashshop", + ) +}, { /* PK Mode zone is only used when server is on pk_mode (battle.conf), it applies to all pvp maps that don't have their own zone */ diff --git a/db/sc_config.txt b/db/sc_config.txt index 797a2578b..2648f7bae 100644 --- a/db/sc_config.txt +++ b/db/sc_config.txt @@ -496,6 +496,9 @@ SC_BLOSSOM_FLUTTERING, 463 SC_SPRITEMABLE, 205 SC_BITESCAR, 4 +// Clan System +SC_CLAN_INFO, 463 + // Cant Clear SC_ALL_RIDING, 397 diff --git a/doc/atcommands.txt b/doc/atcommands.txt index fdafb6c90..18d3de4e4 100644 --- a/doc/atcommands.txt +++ b/doc/atcommands.txt @@ -1455,3 +1455,40 @@ Sets the intimacy level of your homunculus, with 1000 being "Loyal". Sets the hunger level of your homunculus, with 100 being "Stuffed". --------------------------------------- + +@cvcon + +Set the mapflag cvc on the map (Turn on Clans vs Clans mode) + +--------------------------------------- + +@cvcoff + +Unset the mapflag cvc on the map (Turn off Clans vs Clans mode) + +--------------------------------------- + +@claninfo + +Lists all informations of all clans + +--------------------------------------- + +@joinclan + +Joins the Clan with the given ID if it exists. + +--------------------------------------- + +@leaveclan + +Leaves the Clan if any. + +--------------------------------------- + +@reloadclans + +Reloads the 'conf/clans.conf' file. +Obs: it will reload 'db/clans.conf' too since it's included inside 'conf/clans.conf' + +--------------------------------------- diff --git a/doc/script_commands.txt b/doc/script_commands.txt index a91a212e7..e14e80444 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -2381,6 +2381,7 @@ the invoking character. Whatever it returns is determined by type. (1) PC_PARTY - The name of the party they're in if any. (2) PC_GUILD - The name of the guild they're in if any. (3) PC_MAP - The name of the map the character is in. +(4) PC_CLAN - The name of the clan they're in if any. If is passed, it will return the value of the specified player instead the attached player. If the player is not found, it will return @@ -2522,6 +2523,7 @@ Type is the kind of associated ID number required: (2) CHAR_ID_GUILD - Guild ID number. (3) CHAR_ID_ACCOUNT - Account ID number. (4) CHAR_ID_BG - Battle ground ID +(5) CHAR_ID_CLAN - Clan ID number. For most purposes other than printing it, a number is better to have than a name (people do horrifying things to their character names). @@ -9952,3 +9954,37 @@ Changes the name of a unit. Supported Types - [ MOB | HOM | PET ]. returns 1 on success, 0 on failure. + +--------------------------------------- +//===================================== +13 - Clan System Related Commands +//===================================== +--------------------------------------- + +*join_clan({,}) + +Joins a player into the given clan. +If no RID is given, will run with the current attached player. + +returns true on success, false on failure. + +--------------------------------------- + +*clan_leave({}) + +Removes a player from its clan. +If no RID is given, will run with the current attached player. + +returns true on success, false on failure. + +--------------------------------------- + +*clan_master() + +Enables the Emblem of the given Clan to the current NPC + +--------------------------------------- +//===================================== +13 - End of Clan System Related Commands +//===================================== +--------------------------------------- \ No newline at end of file diff --git a/npc/re/other/clans.txt b/npc/re/other/clans.txt new file mode 100644 index 000000000..1260cdcd1 --- /dev/null +++ b/npc/re/other/clans.txt @@ -0,0 +1,581 @@ +//================= Hercules Script ======================================= +//= _ _ _ +//= | | | | | | +//= | |_| | ___ _ __ ___ _ _| | ___ ___ +//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __| +//= | | | | __/ | | (__| |_| | | __/\__ \ +//= \_| |_/\___|_| \___|\__,_|_|\___||___/ +//================= License =============================================== +//= This file is part of Hercules. +//= http://herc.ws - http://github.com/HerculesWS/Hercules +//= +//= Copyright (C) 2017 Hercules Dev Team +//= Copyright (C) Ridley +//= +//= Hercules is free software: you can redistribute it and/or modify +//= it under the terms of the GNU General Public License as published by +//= the Free Software Foundation, either version 3 of the License, or +//= (at your option) any later version. +//= +//= This program is distributed in the hope that it will be useful, +//= but WITHOUT ANY WARRANTY; without even the implied warranty of +//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +//= GNU General Public License for more details. +//= +//= You should have received a copy of the GNU General Public License +//= along with this program. If not, see . +//========================================================================= +//= Clan System +//================= Description =========================================== +//= Join a Clan instead of a guild +//= Reference: http://ragnarok.wikia.com/wiki/Clans +//= Todo: Clan Quests +//= Note: Official npcs can have also a way to stop players joining clans +//= that already reached their maximum amount of members. Maybe it +//= can be added here after a confirmation. +//================= Current Version ======================================= +//= 1.0 +//========================================================================= + +prontera,138,183,7 script Clan Helper#clan 4_F_KID2,{ + mes("[Clan Helper]"); + mes("Do you want to build connections without being in a guild?"); + next(); + mes("[Clan Helper]"); + mes("Can't find the perfect guild for yourself?"); + next(); + mes("[Clan Helper]"); + mes("You can join or leave clan freely! Just join!"); + next(); + mes("[Clan Helper]"); + mes("Now, come on in and meet the masters of the Kingdom's best Clans!"); + close(); +} + +//= Clan Leaders +//================= Crossbow Clan ========================================= +prt_in,39,114,4 script Sham Rumi#clan 4_F_SHAM,{ + mes("[Sham Rumi]"); + mes("Hi, there! I'm Sham, master of ^3131FF[Crossbow Clan]^000000"); + mes("What can I do for you?"); + next(); + switch (select("Introducing Clan", "Join.", "Leave.")) { + case 1: + switch (select("Clans are", "About the Crossbow Clan", "Cancel.")) { + case 1: + mes("[Sham Rumi]"); + mes("The Clan established by the Rune-Midgarts Kingdom to..."); + mes("Laperm, why are our ^3131FFclans^000000 made?"); + next(); + mes("[Laperm Oranpere]"); + mes("Did you sleep in class? Gosh."); + mes("The Clans help lone adventurers connect with each other and share information."); + next(); + mes("[Sham Rumi]"); + mes("A-ha, got it! Thank you, Captain!"); + mes("You heard that too, right?"); + next(); + mes("[Sham Rumi]"); + mes("Run by the Kingdom itself, the Clans are not allowed to participate in the Siege, but the good news is that the members are given some ^3131FFstat bonuses^000000."); + next(); + mes("[Sham Rumi]"); + mes("In case you wonder if the ^3131FFCrossbow Clan^000000 only recruits Archers, no, it doesn't."); + mes("All the Clans accept all classes. You can choose the one that suits your needs best."); + next(); + mes("[Sham Rumi]"); + mes("That should cover everything there is to know."); + mes("Berman, let's go hang out in Glast Heim."); + next(); + mes("[Debon Aire]"); + mes("You..."); + next(); + mes("[Sham Rumi]"); + mes("Ooh, scary! You're so protective of your brother."); + close(); + case 2: + mes("[Sham Rumi]"); + mes("The ^3131FFCrossbow Clan^000000 is ideal for Ranged classes."); + next(); + mes("[Sham Rumi]"); + mes("Eh, let me check the Clan manual. Ah, and we offer stat bonuses to new members: ^FF0000^000000."); + next(); + mes("[Sham Rumi]"); + mes("The Clans are not allowed to participate in the Siege; you should join a private guild instead for Siege."); + mes("The Clans are for adventurers that hate being tied down."); + next(); + mes("[Sham Rumi]"); + mes("Do you have a question?"); + close(); + case 3: + close(); + } + case 2: + mes("[Sham Rumi]"); + mes("Oh, yeah? Good choice!"); + mes("Let's check the Clan policy then take admission procedures."); + next(); + mes("[Sham Rumi]"); + mes("^3131FFClansmen^000000 cannot participate in the Siege."); + mes("As our new member, you'll receive the following stat bonuses: ^FF0000^000000."); + mes("Do you agree?"); + next(); + if (select("Yes.", "No.") == 2) + callsub(L_Nope); + mes("[Sham Rumi]"); + mes("Join and leave the clans anytime, but if you don't show up at clan for ^FF0000more than 2 weeks^000000, you'll be ^FF0000expelled^000000."); + mes("Do you promise you'll maintain good standing?"); + next(); + if (select("Yes.", "No.") == 2) + callsub(L_Nope); + mes("[Sham Rumi]"); + mes("Good, write your name here."); + next(); + input(.@name$); + mes("[Sham Rumi]"); + mesf("^3131FF%s^000000..!", strcharinfo(PC_NAME)); + mes("Ugh, your penmanship needs work. Let me process your application."); + next(); + mes("[Sham Rumi]"); + if (strcharinfo(PC_GUILD) != "") { + mes("Did you finish things up with your old guild?"); + close(); + } + if (getcharid(CHAR_ID_CLAN)) { + mes("Eh, you're already in a clan. Hey, this isn't funny."); + close(); + } + clan_join(CROSSBOWCLAN); + mes("Welcome to the ^3131FFCrossbow Clan^000000!"); + next(); + mes("[Sham Rumi]"); + mes("You can review Clan info with ^3131FFCtrl+G^000000."); + next(); + mes("[Sham Rumi]"); + mes("Don't pick fights with other clansmen. Be social."); + mes("If you need help, you can always whisper me, okay? See you around!"); + close(); + case 3: + mes("[Sham Rumi]"); + mes("Why, did you find a better clan?"); + mes("I'm disappointed, but it's your call. Let me process your withdrawal."); + next(); + if (select("Continue.", "Cancel.") == 2) + close(); + mes("[Sham Rumi]"); + if (!getcharid(CHAR_ID_CLAN)) { + mes("I can't let you leave--you're not even in my clan!"); + close(); + } else if (getcharid(CHAR_ID_CLAN) != CROSSBOWCLAN) { + mes("Sorry, but I don't meddle with other clans' business."); + close(); + } + clan_leave(); + mes("It's done."); + mes("If you ever miss us, don't hesitate to come back, all right?"); + close(); + } + +L_Nope: + mes("[Sham Rumi]"); + mes("Ah, do you need time to think about this? No problem."); + close(); + +OnInit: + clan_master(CROSSBOWCLAN); + end; +} + +//================= Goldenmace Clan ======================================= +prt_in,37,114,4 script Berman Aire 4_M_BIRMAN,{ + mes("[Berman Aire]"); + mes("Nice to meet you. I'm Berman Aire, master of ^3131FF[Goldenmace Clan]^000000."); + mes("I'm also the older brother of Debon Aire here. Debon looks tough, but he's a sweetheart."); + next(); + switch (select("Introducing Clan", "Join.", "Leave.")) { + case 1: + switch (select("Clans are", "About the Crossbow Clan", "Cancel.")) { + case 1: + mes("[Berman Aire]"); + mes("The ^3131FFClans^000000 are established by the Kingdom to help adventurers connect and share information."); + next(); + mes("[Berman Aire]"); + mes("Because the Kingdom runs the clan, no Sieges, but at least the members are given ^3131FFstat bonuses^000000."); + mes("The stat bonuses are small, but can be very useful for beginning adventurers."); + next(); + mes("[Berman Aire]"); + mes("We're named the ^3131FFGolden Mace Clan^000000, but we don't discriminate against applicants based on their classes."); + mes("The name is just to help you easily choose your clan."); + next(); + mes("[Sham Rumi]"); + mes("Berman, enough with the explanation. Let's go hang out in Glast Heim."); + next(); + mes("[Debon Aire]"); + mes("... Hey."); + next(); + mes("[Sham Rumi]"); + mes("Ooh, you're scaring me."); + mes("Berman, call me when you can!~"); + next(); + mes("[Berman Aire]"); + mes("Hah hah, I apologize for their bickering."); + next(); + mes("[Berman Aire]"); + mes("Do you have a question?"); + mes("If you're tired of traveling alone, join us! You can join and leave the Clans anytime you want."); + close(); + case 2: + mes("[Berman Aire]"); + mes("The ^3131FFGolden Mace Clan^000000 mainly supports supportive classes."); + mes("We offer ^FF0000^000000 to new members."); + next(); + mes("[Berman Aire]"); + mes("As I told you earlier, Clans cannot join the Siege because they already belong to the Kingdom."); + mes("If you want to be in the Siege, then I recommend you join a regular guild."); + next(); + mes("[Berman Aire]"); + mes("Do you understand about the Clans now?"); + close(); + case 3: + close(); + } + case 2: + mes("[Berman Aire]"); + mes("Great!"); + mes("Let's check the Clan policy then take admission procedures."); + next(); + mes("[Berman Aire]"); + mes("^3131FFClansmen^000000 cannot participate in the Siege."); + mes("As our new member, you'll receive the following stat bonuses: ^FF0000^000000."); + mes("Do you agree?"); + next(); + if (select("Yes.", "No.") == 2) + callsub(L_Nope); + mes("[Berman Aire]"); + mes("Join and leave the clans anytime, but if you don't show up at clan for ^FF0000more than 2 weeks^000000, you'll be ^FF0000expelled^000000."); + mes("Do you agree to maintain good standing in Clan?"); + next(); + if (select("Yes.", "No.") == 2) + callsub(L_Nope); + mes("[Berman Aire]"); + mes("Now, please write your name here."); + next(); + input(.@name$); + mes("[Berman Aire]"); + mesf("^3131FF%s^000000! What a good name!", strcharinfo(PC_NAME)); + mes("Okay, then..."); + next(); + mes("[Berman Aire]"); + if (strcharinfo(PC_GUILD) != "") { + mes("Oh, no."); + mes("In order to join, you first have to leave the current guild."); + close(); + } + if (getcharid(CHAR_ID_CLAN)) { + mes("You're already in a clan."); + mes("You're just confused, right?"); + close(); + } + clan_join(GOLDENMACECLAN); + mes("Welcome to the ^3131FFGolden Mace Clan^000000!"); + next(); + mes("[Berman Aire]"); + mes("You can review Clan info with ^3131FFCtrl+G^000000."); + next(); + mes("[Berman Aire]"); + mes("Please remember the few precautions I gave you, and enjoy your Clan activities!"); + close(); + case 3: + mes("[Berman Aire]"); + mes("With meeting, there is parting."); + mes("I hope you enjoyed your time in ^3131FFGolden Mace Clan^000000."); + mes("Now, should I process your withdrawal?"); + next(); + if (select("Continue.", "Cancel.") == 2) + close(); + mes("[Berman Aire]"); + if (!getcharid(CHAR_ID_CLAN)) { + mes("You can't leave the clan without joining it first."); + close(); + } else if (getcharid(CHAR_ID_CLAN) != GOLDENMACECLAN) { + mes("I'm sorry, but I can't remove you from another clan.."); + close(); + } + clan_leave(); + mes("It's processed."); + mes("Come back anytime to ^3131FFGolden Mace Clan^000000. I'll be here."); + close(); + } + +L_Nope: + mes("[Berman Aire]"); + mes("I suggest you to think it over."); + close(); + +OnInit: + clan_master(GOLDENMACECLAN); + end; +} + +//================= Arc Wand Clan ========================================= +prt_in,35,114,4 script Debon Aire 4_M_DEBON,{ + mes("[Debon Aire]"); + mes("I'm Debon, master of ^3131FF[Arc Wand Clan]^000000."); + next(); + switch (select("Introducing Clan", "Join.", "Leave.")) { + case 1: + switch (select("Clans are::About the Crossbow Clan:Cancel.")) { + case 1: + mes("[Debon Aire]"); + mes("The ^3131FFClans^000000 are ran by the Kingdom, not privately like others."); + mes("And I manage one of them."); + next(); + mes("[Debon Aire]"); + mes("..."); + mes("What's with that look? You got a problem?"); + next(); + mes("[Berman Aire]"); + mes("Brother, you're scaring the potential member, be gentle."); + next(); + mes("[Debon Aire]"); + mes("..."); + next(); + mes("[Debon Aire]"); + mes("Join if seeking a place to fit in. We give ^3131FFfree bonus stat^000000. But no Siege."); + next(); + mes("[Debon Aire]"); + mes("Most members are offensive mage classes as the name ^3131FFArc Wand Clan^000000 suggests, but that's no requirement."); + next(); + mes("[Debon Aire]"); + mes("...Hey, Sham Rumi."); + mes("Stop hitting on my brother, and go work."); + next(); + mes("[Sham Rumi]"); + mes("Whatever!"); + next(); + mes("[Debon Aire]"); + mes("...Hmpf!"); + mes("Listen, Crossbow Clan's master is an evil."); + next(); + mes("[Sham Rumi]"); + mes("Get over me, Decon! Don't spread rumors!"); + next(); + mes("[Berman Aire]"); + mes("Haha. stop it. You two are making a scene."); + mes("Come on, back to work, guys."); + close(); + case 2: + mes("[Debon Aire]"); + mes("The ^3131FFArc Wand Clan^000000 mainly supports offensive mage classes."); + mes("We offer ^FF0000^000000 to new members. Don't ask for more; it's the Kingdom's rule."); + next(); + mes("[Debon Aire]"); + mes("^3131FFClansmen^000000 can't participate in the Siege."); + mes("If you like the Siege, then go join a regular guild."); + next(); + mes("[Debon Aire]"); + mes("That is all. No questions."); + close(); + case 3: + close(); + } + case 2: + mes("[Debon Aire]"); + mes("..."); + mes("Let's check the Clan policy then take admission procedures."); + next(); + mes("[Debon Aire]"); + mes("^3131FFClansmen^000000 cannot participate in the Siege."); + mes("New members are given these stat bonuses: ^FF0000^000000."); + mes("You with me so far?"); + next(); + if (select("Yes.", "No.") == 2) + callsub(L_Nope); + mes("[Debon Aire]"); + mes("Join and leave the clans anytime, but if you don't show up at clan for ^FF0000more than 2 weeks^000000, you'll be ^FF0000expelled^000000."); + mes("Do you agree?"); + next(); + if (select("Yes.", "No.") == 2) + callsub(L_Nope); + mes("[Debon Aire]"); + mes("Sign your name here."); + next(); + input(.@name$); + mes("[Debon Aire]"); + mesf("^3131FF%s^000000.....", strcharinfo(PC_NAME)); + mes("Good, let me invite you in."); + next(); + mes("[Debon Aire]"); + if (strcharinfo(PC_GUILD) != "") { + mes("Leave your guild first to join mine, duh."); + close(); + } + if (getcharid(CHAR_ID_CLAN)) { + mes("You're already in a clan. You joking?!"); + mes("Oh, I can be funny, too--FIRE PILLAR!"); + close(); + } + clan_join(ARCWANDCLAN); + mes("You have joined the ^3131FFArc Wand Clan^000000."); + next(); + mes("[Debon Aire]"); + mes("You can review Clan info with ^3131FFCtrl+G^000000."); + mes("So don't bother me later."); + next(); + mes("[Debon Aire]"); + mes("That's all. Visit often or be expelled. Dismissed."); + close(); + case 3: + mes("[Debon Aire]"); + mes("Want to leave, huh?"); + mes("I understand it it's about Siege. If not, why are..Never mind.."); + mes("I'll process your withdrawal."); + next(); + if (select("Continue.","Cancel.") == 2) + close(); + mes("[Debon Aire]"); + if (!getcharid(CHAR_ID_CLAN)) { + mes("Naughty children deserve a good Jupitel Thunder."); + close(); + } else if (getcharid(CHAR_ID_CLAN) != ARCWANDCLAN) { + mes("You're barking up the wrong tree. Go to your clan master."); + close(); + } + clan_leave(); + mes("You are withdrawn from the clan."); + mes("Now leave. I don't feel like talking anymore."); + close(); + } + +L_Nope: + mes("[Debon Aire]"); + mes("Gosh, listen to the policy again."); + close(); + +OnInit: + clan_master(ARCWANDCLAN); + end; +} + +//================= Sword Clan ============================================ +prt_in,33,114,4 script Laperm Oranpere 4_F_LAPERM,{ + mes("[Laperm Oranpere]"); + mes("Hi! I'm Laperm, master of ^3131FF[Sword Clan]^000000, one the Rune-Midgarts Kingdom."); + next(); + switch (select("Introducing Clan", "Join.", "Leave.")) { + case 1: + switch (select("Clans are", "About the Crossbow Clan", "Cancel.")) { + case 1: + mes("[Laperm Oranpere]"); + mes("The ^3131FFClans^000000 are a type of guild ran by the Kingdom."); + mes("They don't participate in the Siege, so members are free to join/leave anytime."); + next(); + mes("[Laperm Oranpere]"); + mes("I wish we could join the Siege. I'd love flying over on my dragon and burning everyone in my way!"); + mes("Oops, too thrilled!"); + next(); + mes("[Laperm Oranpere]"); + mes("Join us, if no clan suits your taste."); + mes("New members are given ^3131FFfree stat bonus^000000."); + next(); + mes("[Laperm Oranpere]"); + mes("Melee stats are offered as the name ^3131FFSword Clan^000000 suggests, but not all members are Melee classes."); + mes("Don't feel pressured, just count on me!"); + next(); + mes("[Laperm Oranpere]"); + mes("Difference in variety creates the fun"); + mes("These odd bunches never bore me in the party."); + next(); + mes("[Laperm Oranpere]"); + mes("And who knows you'll meet your soul mate in the clan? Hahah!"); + close(); + case 2: + mes("[Laperm Oranpere]"); + mes("The ^3131FFSword Clan^000000 mainly supports Melee adventurers."); + mes("Join for free ^FF0000^000000!"); + next(); + mes("[Laperm Oranpere]"); + mes("Remember, no Siege participation."); + mes("You should contact other guilds for Siege."); + next(); + mes("[Laperm Oranpere]"); + mes("A question?"); + mes("Excited to join me? Hahah!"); + close(); + case 3: + close(); + } + case 2: + mes("[Laperm Oranpere]"); + mes("Oh, you'll join? Good choice!"); + mes("Let's check the Clan policy then take admission procedures."); + next(); + mes("[Laperm Oranpere]"); + mes("^3131FFClansmen^000000 cannot participate in the Siege."); + mes("New members are given these stat bonuses: ^FF0000^000000."); + mes("You with me so far?"); + next(); + if (select("Yes.", "No.") == 2) + callsub(L_Nope); + mes("[Laperm Oranpere]"); + mes("Join and leave the clans anytime, but if you don't show up at clan for ^FF0000longer than 2 weeks^000000, you'll be ^FF0000expelled^000000."); + mes("Clan masters exsit for reason, like I."); + mes("Understood?"); + next(); + if (select("Yes.", "No.") == 2) + callsub(L_Nope); + mes("[Laperm Oranpere]"); + mes("Great, sign name here on the register."); + next(); + input(.@name$); + mes("[Laperm Oranpere]"); + mesf("So, you're ^3131FF%s^000000! Nice name!", strcharinfo(PC_NAME)); + mes("Let me register you."); + next(); + mes("[Laperm Oranpere]"); + if (strcharinfo(PC_GUILD) != "") { + mes("Come back to join after you leave the current guild."); + close(); + } + if (getcharid(CHAR_ID_CLAN)) { + mes("[Laperm Oranpere]"); + mes("Eh?"); + mes("Oh, you're in Clan."); + mes("Don't mess with me, it's not cool!"); + close(); + } + clan_join(SWORDCLAN); + mes("Welcome to ^3131FFSword Clan^000000!"); + mes("You can review Clan info with ^3131FFCtrl+G^000000."); + mes("At your service!"); + close(); + case 3: + mes("[Laperm Oranpere]"); + mes("You want to leave?"); + mes("No problem. I hope you'll find more suitable clan."); + mes("Ready for withdrawal?"); + next(); + if (select("Continue.", "Cancel.") == 2) + close(); + mes("[Laperm Oranpere]"); + if (!getcharid(CHAR_ID_CLAN)) { + mes("Wait, you're not with us! Grr, don't make me breathe fire at you!"); + close(); + } else if (getcharid(CHAR_ID_CLAN) != SWORDCLAN) { + mes("Hey, talk to your guild master if you want to leave."); + close(); + } + clan_leave(); + mes("Okay, it's done. But let's not be strangers, okay?"); + mes("It was nice having you!"); + close(); + } + +L_Nope: + mes("[Laperm Oranpere]"); + mes("Uh, oh. Let's go back to beginning."); + close(); + +OnInit: + clan_master(SWORDCLAN); + end; +} diff --git a/npc/re/scripts.conf b/npc/re/scripts.conf index e64052f33..c26e907ad 100644 --- a/npc/re/scripts.conf +++ b/npc/re/scripts.conf @@ -134,6 +134,8 @@ "npc/re/other/resetskill.txt", "npc/re/other/stone_change.txt", "npc/re/other/turbo_track.txt", +// - Clan System +"npc/re/other/clans.txt", //================= Quests ================================================ // - Eden Group ------------------------------------------------- diff --git a/sql-files/logs.sql b/sql-files/logs.sql index c75fc37d2..6edf385a2 100644 --- a/sql-files/logs.sql +++ b/sql-files/logs.sql @@ -77,7 +77,7 @@ CREATE TABLE IF NOT EXISTS `branchlog` ( CREATE TABLE IF NOT EXISTS `chatlog` ( `id` BIGINT(20) NOT NULL AUTO_INCREMENT, `time` DATETIME NULL, - `type` ENUM('O','W','P','G','M') NOT NULL DEFAULT 'O', + `type` ENUM('O','W','P','G','M','C') NOT NULL DEFAULT 'O', `type_id` INT(11) NOT NULL DEFAULT '0', `src_charid` INT(11) NOT NULL DEFAULT '0', `src_accountid` INT(11) NOT NULL DEFAULT '0', diff --git a/sql-files/main.sql b/sql-files/main.sql index feda8a4cd..12607531b 100644 --- a/sql-files/main.sql +++ b/sql-files/main.sql @@ -183,6 +183,7 @@ CREATE TABLE IF NOT EXISTS `char` ( `manner` SMALLINT(6) NOT NULL DEFAULT '0', `party_id` INT(11) UNSIGNED NOT NULL DEFAULT '0', `guild_id` INT(11) UNSIGNED NOT NULL DEFAULT '0', + `clan_id` INT(11) UNSIGNED NOT NULL DEFAULT '0', `pet_id` INT(11) UNSIGNED NOT NULL DEFAULT '0', `homun_id` INT(11) UNSIGNED NOT NULL DEFAULT '0', `elemental_id` INT(11) UNSIGNED NOT NULL DEFAULT '0', @@ -196,6 +197,7 @@ CREATE TABLE IF NOT EXISTS `char` ( `head_mid` SMALLINT(6) UNSIGNED NOT NULL DEFAULT '0', `head_bottom` SMALLINT(6) UNSIGNED NOT NULL DEFAULT '0', `robe` SMALLINT(6) UNSIGNED NOT NULL DEFAULT '0', + `last_login` BIGINT(20) NULL DEFAULT '0', `last_map` VARCHAR(11) NOT NULL DEFAULT '', `last_x` SMALLINT(4) UNSIGNED NOT NULL DEFAULT '53', `last_y` SMALLINT(4) UNSIGNED NOT NULL DEFAULT '111', @@ -884,6 +886,8 @@ INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1477434595); -- 2016-10-2 INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1488454834); -- 2017-03-02--11-40.sql INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1488744559); -- 2017-03-05--08-09.sql INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1489588190); -- 2017-03-15--14-29.sql +INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1496588640); -- 2017-06-04--15-04.sql +INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1496588700); -- 2017-06-04--15-05.sql INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1509835214); -- 2017-11-04--10-39.sql -- -- Table structure for table `storage` diff --git a/sql-files/upgrades/2017-06-04--15-04.sql b/sql-files/upgrades/2017-06-04--15-04.sql new file mode 100644 index 000000000..0805d054b --- /dev/null +++ b/sql-files/upgrades/2017-06-04--15-04.sql @@ -0,0 +1,24 @@ +#1496588640 + +-- This file is part of Hercules. +-- http://herc.ws - http://github.com/HerculesWS/Hercules +-- +-- Copyright (C) 2017 Hercules Dev Team +-- +-- Hercules is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . + +ALTER TABLE `char` ADD COLUMN `clan_id` INT(11) UNSIGNED NOT NULL DEFAULT '0' AFTER `guild_id`; +ALTER TABLE `char` ADD COLUMN `last_login` BIGINT(20) NULL DEFAULT '0' AFTER `robe`; + +INSERT INTO `sql_updates` (`timestamp`, `ignored`) VALUES (1496588640 , 'No'); diff --git a/sql-files/upgrades/2017-06-04--15-05.sql b/sql-files/upgrades/2017-06-04--15-05.sql new file mode 100644 index 000000000..550197a15 --- /dev/null +++ b/sql-files/upgrades/2017-06-04--15-05.sql @@ -0,0 +1,23 @@ +#1496588700 + +-- This file is part of Hercules. +-- http://herc.ws - http://github.com/HerculesWS/Hercules +-- +-- Copyright (C) 2017 Hercules Dev Team +-- +-- Hercules is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . + +ALTER TABLE `chatlog` MODIFY COLUMN `type` enum('O','W','P','G','M','C') NOT NULL DEFAULT 'O' AFTER `time`; + +INSERT INTO `sql_updates` (`timestamp`, `ignored`) VALUES (1496588700 , 'No'); diff --git a/sql-files/upgrades/index.txt b/sql-files/upgrades/index.txt index 11cb36a79..2b1409aba 100644 --- a/sql-files/upgrades/index.txt +++ b/sql-files/upgrades/index.txt @@ -40,4 +40,6 @@ 2017-03-02--11-40.sql 2017-03-05--08-09.sql 2017-03-15--14-29.sql +2017-06-04--15-04.sql +2017-06-04--15-05.sql 2017-11-04--10-39.sql diff --git a/src/char/HPMchar.c b/src/char/HPMchar.c index 3a74f443d..43a94604d 100644 --- a/src/char/HPMchar.c +++ b/src/char/HPMchar.c @@ -28,6 +28,7 @@ #include "char/geoip.h" #include "char/inter.h" #include "char/int_auction.h" +#include "char/int_clan.h" #include "char/int_elemental.h" #include "char/int_guild.h" #include "char/int_homun.h" diff --git a/src/char/Makefile.in b/src/char/Makefile.in index 1a7d067a4..fed7ec030 100644 --- a/src/char/Makefile.in +++ b/src/char/Makefile.in @@ -40,11 +40,11 @@ MT19937AR_D = $(THIRDPARTY_D)/mt19937ar MT19937AR_OBJ = $(MT19937AR_D)/mt19937ar.o MT19937AR_H = $(MT19937AR_D)/mt19937ar.h -CHAR_C = char.c HPMchar.c loginif.c mapif.c geoip.c inter.c int_auction.c int_elemental.c int_guild.c \ +CHAR_C = char.c HPMchar.c loginif.c mapif.c geoip.c inter.c int_auction.c int_clan.c int_elemental.c int_guild.c \ int_homun.c int_mail.c int_mercenary.c int_party.c int_pet.c \ int_quest.c int_rodex.c int_storage.c pincode.c CHAR_OBJ = $(addprefix obj_sql/, $(patsubst %.c,%.o,$(CHAR_C))) -CHAR_H = char.h HPMchar.h loginif.h mapif.h geoip.h inter.h int_auction.h int_elemental.h int_guild.h \ +CHAR_H = char.h HPMchar.h loginif.h mapif.h geoip.h inter.h int_auction.h int_clan.h int_elemental.h int_guild.h \ int_homun.h int_mail.h int_mercenary.h int_party.h int_pet.h \ int_quest.h int_rodex.h int_storage.h pincode.h CHAR_PH = diff --git a/src/char/char.c b/src/char/char.c index c3fcd9e0a..2532ca154 100644 --- a/src/char/char.c +++ b/src/char/char.c @@ -26,6 +26,7 @@ #include "char/HPMchar.h" #include "char/geoip.h" #include "char/int_auction.h" +#include "char/int_clan.h" #include "char/int_elemental.h" #include "char/int_guild.h" #include "char/int_homun.h" @@ -465,7 +466,8 @@ int char_mmo_char_tosql(int char_id, struct mmo_charstatus* p) (p->look.head_mid != cp->look.head_mid) || (p->look.head_bottom != cp->look.head_bottom) || (p->delete_date != cp->delete_date) || (p->rename != cp->rename) || (p->slotchange != cp->slotchange) || (p->look.robe != cp->look.robe) || (p->show_equip != cp->show_equip) || (p->allow_party != cp->allow_party) || (p->font != cp->font) || - (p->uniqueitem_counter != cp->uniqueitem_counter) || (p->hotkey_rowshift != cp->hotkey_rowshift) + (p->uniqueitem_counter != cp->uniqueitem_counter) || (p->hotkey_rowshift != cp->hotkey_rowshift) || + (p->clan_id != cp->clan_id) || (p->last_login != cp->last_login) ) { //Save status unsigned int opt = 0; @@ -483,7 +485,7 @@ int char_mmo_char_tosql(int char_id, struct mmo_charstatus* p) "`weapon`='%d',`shield`='%d',`head_top`='%d',`head_mid`='%d',`head_bottom`='%d'," "`last_map`='%s',`last_x`='%d',`last_y`='%d',`save_map`='%s',`save_x`='%d',`save_y`='%d', `rename`='%d'," "`delete_date`='%lu',`robe`='%d',`slotchange`='%d', `char_opt`='%u', `font`='%u', `uniqueitem_counter` ='%u'," - "`hotkey_rowshift`='%d'" + "`hotkey_rowshift`='%d',`clan_id`='%d',`last_login`='%"PRId64"'" " WHERE `account_id`='%d' AND `char_id` = '%d'", char_db, p->base_level, p->job_level, p->base_exp, p->job_exp, p->zeny, @@ -495,7 +497,7 @@ int char_mmo_char_tosql(int char_id, struct mmo_charstatus* p) mapindex_id2name(p->save_point.map), p->save_point.x, p->save_point.y, p->rename, (unsigned long)p->delete_date, // FIXME: platform-dependent size p->look.robe,p->slotchange,opt,p->font,p->uniqueitem_counter, - p->hotkey_rowshift, + p->hotkey_rowshift,p->clan_id,p->last_login, p->account_id, p->char_id) ) { Sql_ShowDebug(inter->sql_handle); @@ -1173,7 +1175,7 @@ int char_mmo_char_fromsql(int char_id, struct mmo_charstatus* p, bool load_every "`status_point`,`skill_point`,`option`,`karma`,`manner`,`party_id`,`guild_id`,`pet_id`,`homun_id`,`elemental_id`,`hair`," "`hair_color`,`clothes_color`,`body`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`,`last_map`,`last_x`,`last_y`," "`save_map`,`save_x`,`save_y`,`partner_id`,`father`,`mother`,`child`,`fame`,`rename`,`delete_date`,`robe`,`slotchange`," - "`char_opt`,`font`,`uniqueitem_counter`,`sex`,`hotkey_rowshift`" + "`char_opt`,`font`,`uniqueitem_counter`,`sex`,`hotkey_rowshift`,`clan_id`,`last_login`" " FROM `%s` WHERE `char_id`=? LIMIT 1", char_db) || SQL_ERROR == SQL->StmtBindParam(stmt, 0, SQLDT_INT, &char_id, sizeof char_id) || SQL_ERROR == SQL->StmtExecute(stmt) @@ -1236,6 +1238,8 @@ int char_mmo_char_fromsql(int char_id, struct mmo_charstatus* p, bool load_every || SQL_ERROR == SQL->StmtBindColumn(stmt, 56, SQLDT_UINT32, &p->uniqueitem_counter, sizeof p->uniqueitem_counter, NULL, NULL) || SQL_ERROR == SQL->StmtBindColumn(stmt, 57, SQLDT_ENUM, &sex, sizeof sex, NULL, NULL) || SQL_ERROR == SQL->StmtBindColumn(stmt, 58, SQLDT_UCHAR, &p->hotkey_rowshift, sizeof p->hotkey_rowshift, NULL, NULL) + || SQL_ERROR == SQL->StmtBindColumn(stmt, 59, SQLDT_INT, &p->clan_id, sizeof p->clan_id, NULL, NULL) + || SQL_ERROR == SQL->StmtBindColumn(stmt, 60, SQLDT_INT64, &p->last_login, sizeof p->last_login, NULL, NULL) ) { SqlStmt_ShowDebug(stmt); SQL->StmtFree(stmt); @@ -6424,6 +6428,7 @@ void char_load_defaults(void) loginif_defaults(); mapif_defaults(); inter_auction_defaults(); + inter_clan_defaults(); inter_elemental_defaults(); inter_guild_defaults(); inter_homunculus_defaults(); diff --git a/src/char/int_clan.c b/src/char/int_clan.c new file mode 100644 index 000000000..76a9639c5 --- /dev/null +++ b/src/char/int_clan.c @@ -0,0 +1,181 @@ +/** + * This file is part of Hercules. + * http://herc.ws - http://github.com/HerculesWS/Hercules + * + * Copyright (C) 2017 Hercules Dev Team + * + * Hercules is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#define HERCULES_CORE + +#include "config/core.h" // DBPATH +#include "int_clan.h" + +#include "char/char.h" +#include "char/inter.h" +#include "char/mapif.h" +#include "common/cbasetypes.h" +#include "common/memmgr.h" +#include "common/mmo.h" +#include "common/nullpo.h" +#include "common/showmsg.h" +#include "common/socket.h" +#include "common/sql.h" +#include "common/strlib.h" +#include "common/timer.h" + +#include +#include + +struct inter_clan_interface inter_clan_s; +struct inter_clan_interface *inter_clan; + +/** + * Kick offline members of a clan + * + * Perform the update on the DB to reset clan id to 0 + * of the members that are inactive for too long + * + * @param clan_id Id of the clan + * @param kick_interval Time needed to consider a player inactive and kick it + * @return 0 on failure, 1 on success + */ +int inter_clan_kick_inactive_members(int clan_id, int kick_interval) +{ + if (clan_id <= 0) { + ShowError("inter_clan_kick_inactive_members: Invalid clan id received '%d'\n", clan_id); + Assert_retr(0, 0); + return 0; + } else if (kick_interval <= 0) { + ShowError("inter_clan_kick_inactive_members: Invalid kick_interval received '%d'", kick_interval); + Assert_retr(0, 0); + return 0; + } + + // Kick Inactive members + if (SQL_ERROR == SQL->Query(inter->sql_handle, "UPDATE `%s` SET " + "`clan_id` = 0 WHERE `clan_id` = '%d' AND `online` = 0 AND `last_login` < %"PRId64, + char_db, clan_id, (int64)(time(NULL) - kick_interval))) + { + Sql_ShowDebug(inter->sql_handle); + return 0; + } + + return 1; +} + +/** + * Count members of a clan + * + * @param clan_id Id of the clan + * @param kick_interval Time needed to consider a player inactive and ignore it on the count + */ +int inter_clan_count_members(int clan_id, int kick_interval) +{ + struct SqlStmt *stmt; + int count = 0; + + if (clan_id <= 0) { + ShowError("inter_clan_count_members: Invalid clan id received '%d'\n", clan_id); + Assert_retr(0, 0); + return 0; + } else if (kick_interval <= 0) { + ShowError("inter_clan_count_member: Invalid kick_interval received '%d'", kick_interval); + Assert_retr(0, 0); + return 0; + } + + stmt = SQL->StmtMalloc(inter->sql_handle); + if (stmt == NULL) { + SqlStmt_ShowDebug(stmt); + return 0; + } + + // Count members + if (SQL_ERROR == SQL->StmtPrepare(stmt, "SELECT COUNT(*) FROM `%s` WHERE `clan_id` = ? AND `last_login` >= %"PRId64, char_db, (int64)(time(NULL) - kick_interval)) + || SQL_ERROR == SQL->StmtBindParam(stmt, 0, SQLDT_INT, &clan_id, sizeof(clan_id)) + || SQL_ERROR == SQL->StmtExecute(stmt) + || SQL_ERROR == SQL->StmtBindColumn(stmt, 0, SQLDT_INT, &count, sizeof(count), NULL, NULL) + ) { + SqlStmt_ShowDebug(stmt); + SQL->StmtFree(stmt); + return 0; + } + + if (SQL->StmtNumRows(stmt) > 0 && SQL_SUCCESS != SQL->StmtNextRow(stmt)) { + SqlStmt_ShowDebug(stmt); + SQL->StmtFree(stmt); + return 0; + } + + SQL->StmtFree(stmt); + return count; +} + +int mapif_parse_ClanMemberCount(int fd, int clan_id, int kick_interval) +{ + + WFIFOHEAD(fd, 10); + WFIFOW(fd, 0) = 0x3858; + WFIFOL(fd, 2) = clan_id; + WFIFOL(fd, 6) = inter_clan->count_members(clan_id, kick_interval); + WFIFOSET(fd, 10); + return 0; +} + +int mapif_parse_ClanMemberKick(int fd, int clan_id, int kick_interval) +{ + int count = 0; + + if (inter_clan->kick_inactive_members(clan_id, kick_interval) == 1) + count = inter_clan->count_members(clan_id, kick_interval); + + WFIFOHEAD(fd, 10); + WFIFOW(fd, 0) = 0x3858; + WFIFOL(fd, 2) = clan_id; + WFIFOL(fd, 6) = count; + WFIFOSET(fd, 10); + return 0; +} + +// Communication from the map server +// - Can analyzed only one by one packet +// Data packet length that you set to inter.c +//- Shouldn't do checking and packet length, RFIFOSKIP is done by the caller +// Must Return +// 1 : ok +// 0 : error +int inter_clan_parse_frommap(int fd) +{ + RFIFOHEAD(fd); + + switch(RFIFOW(fd, 0)) { + case 0x3044: mapif->parse_ClanMemberCount(fd, RFIFOL(fd, 2), RFIFOL(fd, 6)); break; + case 0x3045: mapif->parse_ClanMemberKick(fd, RFIFOL(fd, 2), RFIFOL(fd, 6)); break; + + default: + return 0; + } + + return 1; +} + +void inter_clan_defaults(void) +{ + inter_clan = &inter_clan_s; + + inter_clan->kick_inactive_members = inter_clan_kick_inactive_members; + inter_clan->count_members = inter_clan_count_members; + inter_clan->parse_frommap = inter_clan_parse_frommap; +} diff --git a/src/char/int_clan.h b/src/char/int_clan.h new file mode 100644 index 000000000..e7b44ecd3 --- /dev/null +++ b/src/char/int_clan.h @@ -0,0 +1,39 @@ +/** + * This file is part of Hercules. + * http://herc.ws - http://github.com/HerculesWS/Hercules + * + * Copyright (C) 2017 Hercules Dev Team + * + * Hercules is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#ifndef CHAR_INT_CLAN_H +#define CHAR_INT_CLAN_H + +#include "common/mmo.h" + +/** + * inter clan Interface + **/ +struct inter_clan_interface { + int (*kick_inactive_members) (int clan_id, int kick_interval); + int (*count_members) (int clan_id, int kick_interval); + int (*parse_frommap) (int fd); +}; + +#ifdef HERCULES_CORE +void inter_clan_defaults(void); +#endif // HERCULES_CORE + +HPShared struct inter_clan_interface *inter_clan; +#endif /* CHAR_INT_CLAN_H */ diff --git a/src/char/inter.c b/src/char/inter.c index 557ee5313..baa000d82 100644 --- a/src/char/inter.c +++ b/src/char/inter.c @@ -25,6 +25,7 @@ #include "char/char.h" #include "char/geoip.h" #include "char/int_auction.h" +#include "char/int_clan.h" #include "char/int_elemental.h" #include "char/int_guild.h" #include "char/int_homun.h" @@ -72,7 +73,7 @@ int inter_recv_packet_length[] = { 6,-1, 0, 0, 0, 0, 0, 0, 10,-1, 0, 0, 0, 0, 0, 0, // 3010- Account Storage [Smokexyz] -1,10,-1,14, 14,19, 6,-1, 14,14, 0, 0, 0, 0, 0, 0, // 3020- Party -1, 6,-1,-1, 55,19, 6,-1, 14,-1,-1,-1, 18,19,186,-1, // 3030- - -1, 9, 0, 0, 0, 0, 0, 0, 7, 6,10,10, 10,-1, 0, 0, // 3040- + -1, 9, 0, 0, 10,10, 0, 0, 7, 6,10,10, 10,-1, 0, 0, // 3040- Clan System(3044-3045) -1,-1,10,10, 0,-1,12, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3050- Auction System [Zephyrus], Item Bound [Mhalicot] 6,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3060- Quest system [Kevin] [Inkfish] -1,10, 6,-1, 0, 0, 0, 0, 0, 0, 0, 0, -1,10, 6,-1, // 3070- Mercenary packets [Zephyrus], Elemental packets [pakpil] @@ -1420,6 +1421,7 @@ int inter_parse_frommap(int fd) || inter_auction->parse_frommap(fd) || inter_quest->parse_frommap(fd) || inter_rodex->parse_frommap(fd) + || inter_clan->parse_frommap(fd) ) break; else diff --git a/src/char/mapif.c b/src/char/mapif.c index 9fccd691b..241edc925 100644 --- a/src/char/mapif.c +++ b/src/char/mapif.c @@ -221,6 +221,9 @@ int mapif_parse_Registry(int fd); int mapif_parse_RegistryRequest(int fd); void mapif_namechange_ack(int fd, int account_id, int char_id, int type, int flag, const char *const name); int mapif_parse_NameChangeRequest(int fd); +// Clan System +int mapif_parse_ClanMemberKick(int fd, int clan_id, int kick_interval); +int mapif_parse_ClanMemberCount(int fd, int clan_id, int kick_interval); struct mapif_interface mapif_s; struct mapif_interface *mapif; @@ -411,4 +414,7 @@ void mapif_defaults(void) { mapif->parse_RegistryRequest = mapif_parse_RegistryRequest; mapif->namechange_ack = mapif_namechange_ack; mapif->parse_NameChangeRequest = mapif_parse_NameChangeRequest; + /* Clan System */ + mapif->parse_ClanMemberKick = mapif_parse_ClanMemberKick; + mapif->parse_ClanMemberCount = mapif_parse_ClanMemberCount; } diff --git a/src/char/mapif.h b/src/char/mapif.h index a78940ba2..f03f1ad9a 100644 --- a/src/char/mapif.h +++ b/src/char/mapif.h @@ -213,6 +213,9 @@ struct mapif_interface { int (*parse_RegistryRequest) (int fd); void (*namechange_ack) (int fd, int account_id, int char_id, int type, int flag, const char *name); int (*parse_NameChangeRequest) (int fd); + // Clan System + int (*parse_ClanMemberKick) (int fd, int clan_id, int kick_interval); + int (*parse_ClanMemberCount) (int fd, int clan_id, int kick_interval); }; #ifdef HERCULES_CORE diff --git a/src/common/HPMi.h b/src/common/HPMi.h index 143c325c1..7698d3ca7 100644 --- a/src/common/HPMi.h +++ b/src/common/HPMi.h @@ -89,6 +89,7 @@ enum HPluginDataTypes { HPDT_ITEMDATA, ///< For struct item_data. HPDT_BGDATA, ///< For struct battleground_data. HPDT_AUTOTRADE_VEND, ///< For struct autotrade_vending. + HPDT_CLAN, ///< For struct clan. }; /* used in macros and conf storage */ @@ -153,6 +154,10 @@ enum HPluginConfType { #define addToATVEND(ptr,data,classid,autofree) (HPMi->addToHPData(HPDT_AUTOTRADE_VEND,HPMi->pid,&(ptr)->hdata,(data),(classid),(autofree))) #define getFromATVEND(ptr,classid) (HPMi->getFromHPData(HPDT_AUTOTRADE_VEND,HPMi->pid,(ptr)->hdata,(classid))) #define removeFromATVEND(ptr,classid) (HPMi->removeFromHPData(HPDT_AUTOTRADE_VEND,HPMi->pid,(ptr)->hdata,(classid))) +/* clan */ +#define addtoCLAN(ptr,data,classid,autofree) (HPMi->addToHPData(HPDT_CLAN,HPMi->pid,&(ptr)->hdata,(data),(classid),(autofree))) +#define getfromCLAN(ptr,classid) (HPMi->getFromHPData(HPDT_CLAN,HPMi->pid,(ptr)->hdata,(classid))) +#define removefromCLAN(ptr,classid) (HPMi->removeFromHPData(HPDT_CLAN,HPMi->pid,(ptr)->hdata,(classid))) /// HPMi->addCommand #define addAtcommand(cname,funcname) do { \ diff --git a/src/common/mmo.h b/src/common/mmo.h index 7fd4ca6ea..d7d0820b3 100644 --- a/src/common/mmo.h +++ b/src/common/mmo.h @@ -304,6 +304,7 @@ STATIC_ASSERT(MAX_ITEM_OPTIONS <= 5, "This value is limited by the client and da #define INFINITE_DURATION (-1) // Infinite duration for status changes struct hplugin_data_store; +struct script_code; enum item_types { IT_HEALING = 0, @@ -616,7 +617,7 @@ struct mmo_charstatus { short manner; // Defines how many minutes a char will be muted, each negative point is equivalent to a minute. unsigned char karma; short hair,hair_color,clothes_color,body; - int party_id,guild_id,pet_id,hom_id,mer_id,ele_id; + int party_id,guild_id,clan_id,pet_id,hom_id,mer_id,ele_id; int fame; // Mercenary Guilds Rank @@ -641,6 +642,7 @@ struct mmo_charstatus { uint32 mapip; uint16 mapport; + int64 last_login; struct point last_point,save_point,memo_point[MAX_MEMOPOINTS]; struct item inventory[MAX_INVENTORY],cart[MAX_CART]; struct s_skill skill[MAX_SKILL_DB]; @@ -818,6 +820,59 @@ struct guild_castle { int temp_guardians_max; }; +/** + * Clan Member Struct + */ +struct clan_member { + int char_id; ///< Char Id of member + short online; ///< Flag to know if the player is online or not + int64 last_login; ///< Last login of this member, used to kick if inactive for long time + struct map_session_data *sd; ///< Player data of member +}; + +/** + * Clan Buff Struct + */ +struct clan_buff { + int icon; ///< Status Icon to be shown in client (Use one of the 'SI_' constants) + struct script_code *script; ///< The script to be executed as CLan Buff +}; + +/** + * Clan Relationship Struct + */ +struct clan_relationship { + char constant[NAME_LENGTH]; ///< Unique name of the related clan + int clan_id; ///< Id of the related clan +}; + +/** + * Clan Struct + */ +struct clan { + int clan_id; ///< CLan's Id + char constant[NAME_LENGTH]; ///< Clan's Unique Name + char name[NAME_LENGTH]; ///< Clan's Name + char master[NAME_LENGTH]; ///< Name of the clan's master (used for clan information on client) + char map[MAP_NAME_LENGTH_EXT]; ///< The map of that clan (used for clan information on client) + struct clan_buff buff; ///< The buff for a clan when a member joins it + short max_member; ///< Limit of Members + short member_count; ///< Holds the amount of members in this clan, online and offline + short connect_member; ///< Members that are Online + VECTOR_DECL(struct clan_member) members; ///< Vector of Members + VECTOR_DECL(struct clan_relationship) allies; ///< Vector of Allies + VECTOR_DECL(struct clan_relationship) antagonists; ///< Vector of Antagonists + int kick_time; /// Needed inactive time to be kicked + int check_time; ///< Interval to check for inactive players + int tid; ///< Timer ID for inactivity kick + bool received; ///< Whether or not the requested data was received + int req_state; ///< Flag for knowing what to do after receiving the data from inter server + int req_count_tid; ///< Timer ID for the timer that handles the timeout of requests for interserver to count members + int req_kick_tid; ///< Timer ID for the timer that handles the timeout of requests for interserver to kick inactive members + + struct hplugin_data_store *hdata; ///< HPM Plugin Data Store +}; + struct fame_list { int id; int fame; diff --git a/src/map/HPMmap.c b/src/map/HPMmap.c index 381dbf599..17b4fd813 100644 --- a/src/map/HPMmap.c +++ b/src/map/HPMmap.c @@ -54,6 +54,7 @@ #include "map/channel.h" #include "map/chat.h" #include "map/chrif.h" +#include "map/clan.h" #include "map/clif.h" #include "map/date.h" #include "map/duel.h" @@ -114,21 +115,22 @@ unsigned int atcommand_list_items = 0; bool HPM_map_data_store_validate(enum HPluginDataTypes type, struct hplugin_data_store **storeptr, bool initialize) { switch (type) { - case HPDT_MSD: - case HPDT_NPCD: - case HPDT_MAP: - case HPDT_PARTY: - case HPDT_GUILD: - case HPDT_INSTANCE: - case HPDT_MOBDB: - case HPDT_MOBDATA: - case HPDT_ITEMDATA: - case HPDT_BGDATA: - case HPDT_AUTOTRADE_VEND: - // Initialized by the caller. - return true; - default: - break; + case HPDT_MSD: + case HPDT_NPCD: + case HPDT_MAP: + case HPDT_PARTY: + case HPDT_GUILD: + case HPDT_INSTANCE: + case HPDT_MOBDB: + case HPDT_MOBDATA: + case HPDT_ITEMDATA: + case HPDT_BGDATA: + case HPDT_AUTOTRADE_VEND: + case HPDT_CLAN: + // Initialized by the caller. + return true; + default: + break; } return false; } diff --git a/src/map/Makefile.in b/src/map/Makefile.in index 91efba0ae..e6966d9a2 100644 --- a/src/map/Makefile.in +++ b/src/map/Makefile.in @@ -41,14 +41,14 @@ MT19937AR_OBJ = $(MT19937AR_D)/mt19937ar.o MT19937AR_H = $(MT19937AR_D)/mt19937ar.h MAP_C = atcommand.c battle.c battleground.c buyingstore.c channel.c chat.c \ - chrif.c clif.c date.c duel.c elemental.c guild.c homunculus.c HPMmap.c \ + chrif.c clan.c clif.c date.c duel.c elemental.c guild.c homunculus.c HPMmap.c \ instance.c intif.c irc-bot.c itemdb.c log.c mail.c map.c mapreg_sql.c \ mercenary.c mob.c npc.c npc_chat.c party.c path.c pc.c pc_groups.c \ pet.c quest.c rodex.c script.c searchstore.c skill.c status.c storage.c \ trade.c unit.c vending.c MAP_OBJ = $(addprefix obj_sql/, $(patsubst %c,%o,$(MAP_C))) MAP_H = atcommand.h battle.h battleground.h buyingstore.h channel.h chat.h \ - chrif.h clif.h date.h duel.h elemental.h guild.h homunculus.h HPMmap.h \ + chrif.h clan.h clif.h date.h duel.h elemental.h guild.h homunculus.h HPMmap.h \ instance.h intif.h irc-bot.h itemdb.h log.h mail.h map.h mapreg.h \ mercenary.h mob.h npc.h packets.h packets_keys_main.h packets_keys_zero.h \ packets_shuffle_main.h packets_shuffle_zero.h packets_struct.h party.h \ diff --git a/src/map/atcommand.c b/src/map/atcommand.c index aa25f11d6..d0a9bb10e 100644 --- a/src/map/atcommand.c +++ b/src/map/atcommand.c @@ -28,6 +28,7 @@ #include "map/channel.h" #include "map/chat.h" #include "map/chrif.h" +#include "map/clan.h" #include "map/clif.h" #include "map/duel.h" #include "map/elemental.h" @@ -1674,6 +1675,45 @@ ACMD(gvgon) return true; } +/*========================================== + * + *------------------------------------------*/ +ACMD(cvcoff) +{ + if (!map->list[sd->bl.m].flag.cvc) { + clif->message(fd, msg_fd(fd, 141)); // CvC is already Off. + return false; + } + + map->zone_change2(sd->bl.m, map->list[sd->bl.m].prev_zone); + map->list[sd->bl.m].flag.cvc = 0; + clif->map_property_mapall(sd->bl.m, MAPPROPERTY_NOTHING); + clif->maptypeproperty2(&sd->bl, ALL_SAMEMAP); + map->foreachinmap(atcommand->stopattack, sd->bl.m, BL_CHAR, 0); + clif->message(fd, msg_fd(fd, 26)); // CvC: Off. + + return true; +} + +/*========================================== + * + *------------------------------------------*/ +ACMD(cvcon) +{ + if (map->list[sd->bl.m].flag.cvc) { + clif->message(fd, msg_fd(fd, 142)); // CvC is already On. + return false; + } + + map->zone_change2(sd->bl.m, strdb_get(map->zone_db, MAP_ZONE_CVC_NAME)); + map->list[sd->bl.m].flag.cvc = 1; + clif->map_property_mapall(sd->bl.m, MAPPROPERTY_AGITZONE); + clif->maptypeproperty2(&sd->bl, ALL_SAMEMAP); + clif->message(fd, msg_fd(fd, 27)); // CvC: On. + + return true; +} + /*========================================== * *------------------------------------------*/ @@ -3798,6 +3838,9 @@ ACMD(mapinfo) if (map->list[m_id].flag.battleground) clif->message(fd, msg_fd(fd,1045)); // Battlegrounds ON + if (map->list[m_id].flag.cvc) + clif->message(fd, msg_fd(fd, 139)); // CvC ON + strcpy(atcmd_output,msg_fd(fd,1046)); // PvP Flags: if (map->list[m_id].flag.pvp) strcat(atcmd_output, msg_fd(fd,1047)); // Pvp ON | @@ -7551,11 +7594,11 @@ ACMD(mapflag) { CHECKFLAG(noreturn); CHECKFLAG(monster_noteleport); CHECKFLAG(nosave); CHECKFLAG(nobranch); CHECKFLAG(noexppenalty); CHECKFLAG(pvp); CHECKFLAG(pvp_noparty); CHECKFLAG(pvp_noguild); CHECKFLAG(pvp_nightmaredrop); CHECKFLAG(pvp_nocalcrank); CHECKFLAG(gvg_castle); CHECKFLAG(gvg); - CHECKFLAG(gvg_dungeon); CHECKFLAG(gvg_noparty); CHECKFLAG(battleground); CHECKFLAG(nozenypenalty); - CHECKFLAG(notrade); CHECKFLAG(noskill); CHECKFLAG(nowarp); CHECKFLAG(nowarpto); - CHECKFLAG(noicewall); CHECKFLAG(snow); CHECKFLAG(clouds); CHECKFLAG(clouds2); - CHECKFLAG(fog); CHECKFLAG(fireworks); CHECKFLAG(sakura); CHECKFLAG(leaves); - CHECKFLAG(nobaseexp); + CHECKFLAG(gvg_dungeon); CHECKFLAG(gvg_noparty); CHECKFLAG(battleground); CHECKFLAG(cvc); + CHECKFLAG(nozenypenalty); CHECKFLAG(notrade); CHECKFLAG(noskill); CHECKFLAG(nowarp); + CHECKFLAG(nowarpto); CHECKFLAG(noicewall); CHECKFLAG(snow); CHECKFLAG(clouds); + CHECKFLAG(clouds2); CHECKFLAG(fog); CHECKFLAG(fireworks); CHECKFLAG(sakura); + CHECKFLAG(leaves); CHECKFLAG(nobaseexp); CHECKFLAG(nojobexp); CHECKFLAG(nomobloot); CHECKFLAG(nomvploot); CHECKFLAG(nightenabled); CHECKFLAG(nodrop); CHECKFLAG(novending); CHECKFLAG(loadevent); CHECKFLAG(nochat); CHECKFLAG(partylock); CHECKFLAG(guildlock); CHECKFLAG(src4instance); @@ -7567,48 +7610,53 @@ ACMD(mapflag) { } for (i = 0; flag_name[i]; i++) flag_name[i] = TOLOWER(flag_name[i]); //lowercase - if (strcmp( flag_name , "gvg" ) == 0) { - if( flag && !map->list[sd->bl.m].flag.gvg ) - map->zone_change2(sd->bl.m,strdb_get(map->zone_db, MAP_ZONE_GVG_NAME)); - else if ( !flag && map->list[sd->bl.m].flag.gvg ) - map->zone_change2(sd->bl.m,map->list[sd->bl.m].prev_zone); - } else if ( strcmp( flag_name , "pvp" ) == 0 ) { - if ( flag && !map->list[sd->bl.m].flag.pvp ) - map->zone_change2(sd->bl.m,strdb_get(map->zone_db, MAP_ZONE_PVP_NAME)); - else if ( !flag && map->list[sd->bl.m].flag.pvp ) - map->zone_change2(sd->bl.m,map->list[sd->bl.m].prev_zone); - } else if ( strcmp( flag_name , "battleground" ) == 0 ) { - if ( flag && !map->list[sd->bl.m].flag.battleground ) - map->zone_change2(sd->bl.m,strdb_get(map->zone_db, MAP_ZONE_BG_NAME)); - else if ( !flag && map->list[sd->bl.m].flag.battleground ) - map->zone_change2(sd->bl.m,map->list[sd->bl.m].prev_zone); + if (strcmp(flag_name, "gvg") == 0) { + if (flag && !map->list[sd->bl.m].flag.gvg) + map->zone_change2(sd->bl.m, strdb_get(map->zone_db, MAP_ZONE_GVG_NAME)); + else if (!flag && map->list[sd->bl.m].flag.gvg) + map->zone_change2(sd->bl.m, map->list[sd->bl.m].prev_zone); + } else if (strcmp(flag_name, "pvp") == 0) { + if (flag && !map->list[sd->bl.m].flag.pvp) + map->zone_change2(sd->bl.m, strdb_get(map->zone_db, MAP_ZONE_PVP_NAME)); + else if (!flag && map->list[sd->bl.m].flag.pvp) + map->zone_change2(sd->bl.m, map->list[sd->bl.m].prev_zone); + } else if (strcmp(flag_name, "battleground") == 0) { + if (flag && !map->list[sd->bl.m].flag.battleground) + map->zone_change2(sd->bl.m, strdb_get(map->zone_db, MAP_ZONE_BG_NAME)); + else if (!flag && map->list[sd->bl.m].flag.battleground) + map->zone_change2(sd->bl.m, map->list[sd->bl.m].prev_zone); + } else if (strcmp(flag_name, "cvc") == 0) { + if (flag && !map->list[sd->bl.m].flag.cvc) + map->zone_change2(sd->bl.m, strdb_get(map->zone_db, MAP_ZONE_CVC_NAME)); + else if (!flag && map->list[sd->bl.m].flag.cvc) + map->zone_change2(sd->bl.m, map->list[sd->bl.m].prev_zone); } SETFLAG(autotrade); SETFLAG(allowks); SETFLAG(nomemo); SETFLAG(noteleport); SETFLAG(noreturn); SETFLAG(monster_noteleport); SETFLAG(nosave); SETFLAG(nobranch); SETFLAG(noexppenalty); SETFLAG(pvp); SETFLAG(pvp_noparty); SETFLAG(pvp_noguild); SETFLAG(pvp_nightmaredrop); SETFLAG(pvp_nocalcrank); SETFLAG(gvg_castle); SETFLAG(gvg); - SETFLAG(gvg_dungeon); SETFLAG(gvg_noparty); SETFLAG(battleground); SETFLAG(nozenypenalty); - SETFLAG(notrade); SETFLAG(noskill); SETFLAG(nowarp); SETFLAG(nowarpto); - SETFLAG(noicewall); SETFLAG(snow); SETFLAG(clouds); SETFLAG(clouds2); - SETFLAG(fog); SETFLAG(fireworks); SETFLAG(sakura); SETFLAG(leaves); - SETFLAG(nobaseexp); - SETFLAG(nojobexp); SETFLAG(nomobloot); SETFLAG(nomvploot); SETFLAG(nightenabled); - SETFLAG(nodrop); SETFLAG(novending); SETFLAG(loadevent); - SETFLAG(nochat); SETFLAG(partylock); SETFLAG(guildlock); SETFLAG(src4instance); - SETFLAG(notomb); SETFLAG(nocashshop); SETFLAG(noviewid); - - clif->message(sd->fd,msg_fd(fd,1314)); // Invalid flag name or flag. - clif->message(sd->fd,msg_fd(fd,1312)); // Usage: "@mapflag monster_noteleport 1" (0=Off | 1=On) - clif->message(sd->fd,msg_fd(fd,1315)); // Available Flags: - clif->message(sd->fd,"----------------------------------"); - clif->message(sd->fd,"town, autotrade, allowks, nomemo, noteleport, noreturn, monster_noteleport, nosave,"); - clif->message(sd->fd,"nobranch, noexppenalty, pvp, pvp_noparty, pvp_noguild, pvp_nightmaredrop,"); - clif->message(sd->fd,"pvp_nocalcrank, gvg_castle, gvg, gvg_dungeon, gvg_noparty, battleground,"); - clif->message(sd->fd,"nozenypenalty, notrade, noskill, nowarp, nowarpto, noicewall, snow, clouds, clouds2,"); - clif->message(sd->fd,"fog, fireworks, sakura, leaves, nobaseexp, nojobexp, nomobloot,"); - clif->message(sd->fd,"nomvploot, nightenabled, nodrop, novending, loadevent, nochat, partylock,"); - clif->message(sd->fd,"guildlock, src4instance, notomb, nocashshop, noviewid"); + SETFLAG(gvg_dungeon); SETFLAG(gvg_noparty); SETFLAG(battleground); SETFLAG(cvc); + SETFLAG(nozenypenalty); SETFLAG(notrade); SETFLAG(noskill); SETFLAG(nowarp); + SETFLAG(nowarpto); SETFLAG(noicewall); SETFLAG(snow); SETFLAG(clouds); + SETFLAG(clouds2); SETFLAG(fog); SETFLAG(fireworks); SETFLAG(sakura); + SETFLAG(leaves); SETFLAG(nobaseexp); SETFLAG(nojobexp); SETFLAG(nomobloot); + SETFLAG(nomvploot); SETFLAG(nightenabled); SETFLAG(nodrop); SETFLAG(novending); + SETFLAG(loadevent); SETFLAG(nochat); SETFLAG(partylock); SETFLAG(guildlock); + SETFLAG(src4instance); SETFLAG(notomb); SETFLAG(nocashshop); SETFLAG(noviewid); + + + clif->message(sd->fd, msg_fd(fd, 1314)); // Invalid flag name or flag. + clif->message(sd->fd, msg_fd(fd, 1312)); // Usage: "@mapflag monster_noteleport 1" (0=Off | 1=On) + clif->message(sd->fd, msg_fd(fd, 1315)); // Available Flags: + clif->message(sd->fd, "----------------------------------"); + clif->message(sd->fd, "town, autotrade, allowks, nomemo, noteleport, noreturn, monster_noteleport, nosave,"); + clif->message(sd->fd, "nobranch, noexppenalty, pvp, pvp_noparty, pvp_noguild, pvp_nightmaredrop,"); + clif->message(sd->fd, "pvp_nocalcrank, gvg_castle, gvg, gvg_dungeon, gvg_noparty, battleground, cvc,"); + clif->message(sd->fd, "nozenypenalty, notrade, noskill, nowarp, nowarpto, noicewall, snow, clouds, clouds2,"); + clif->message(sd->fd, "fog, fireworks, sakura, leaves, nobaseexp, nojobexp, nomobloot,"); + clif->message(sd->fd, "nomvploot, nightenabled, nodrop, novending, loadevent, nochat, partylock,"); + clif->message(sd->fd, "guildlock, src4instance, notomb, nocashshop, noviewid"); #undef CHECKFLAG #undef SETFLAG @@ -9451,6 +9499,145 @@ ACMD(lang) { return true; } + +ACMD(claninfo) +{ + struct DBIterator *iter = db_iterator(clan->db); + struct clan *c; + int i, count; + + for (c = dbi_first(iter); dbi_exists(iter); c = dbi_next(iter)) { + safesnprintf(atcmd_output, sizeof(atcmd_output), "Clan #%d:", c->clan_id); + clif->messagecolor_self(fd, COLOR_DEFAULT, atcmd_output); + + safesnprintf(atcmd_output, sizeof(atcmd_output), "- Name: %s", c->name); + clif->messagecolor_self(fd, COLOR_DEFAULT, atcmd_output); + + safesnprintf(atcmd_output, sizeof(atcmd_output), "- Constant: %s", c->constant); + clif->messagecolor_self(fd, COLOR_DEFAULT, atcmd_output); + + safesnprintf(atcmd_output, sizeof(atcmd_output), "- Master: %s", c->master); + clif->messagecolor_self(fd, COLOR_DEFAULT, atcmd_output); + + safesnprintf(atcmd_output, sizeof(atcmd_output), "- Map: %s", c->map); + clif->messagecolor_self(fd, COLOR_DEFAULT, atcmd_output); + + safesnprintf(atcmd_output, sizeof(atcmd_output), "- Max Member: %d", c->max_member); + clif->messagecolor_self(fd, COLOR_DEFAULT, atcmd_output); + + safesnprintf(atcmd_output, sizeof(atcmd_output), "- Kick Time: %dh", c->kick_time / 3600); + clif->messagecolor_self(fd, COLOR_DEFAULT, atcmd_output); + + safesnprintf(atcmd_output, sizeof(atcmd_output), "- Check Time: %dh", c->check_time / 3600000); + clif->messagecolor_self(fd, COLOR_DEFAULT, atcmd_output); + + safesnprintf(atcmd_output, sizeof(atcmd_output), "- Connected Members: %d", c->connect_member); + clif->messagecolor_self(fd, COLOR_DEFAULT, atcmd_output); + + safesnprintf(atcmd_output, sizeof(atcmd_output), "- Total Members: %d", c->member_count); + clif->messagecolor_self(fd, COLOR_DEFAULT, atcmd_output); + + safesnprintf(atcmd_output, sizeof(atcmd_output), "- Allies: %d", VECTOR_LENGTH(c->allies)); + clif->messagecolor_self(fd, COLOR_DEFAULT, atcmd_output); + + count = 0; + for (i = 0; i < VECTOR_LENGTH(c->allies); i++) { + struct clan_relationship *ally = &VECTOR_INDEX(c->allies, i); + + if (ally == NULL) + continue; + + safesnprintf(atcmd_output, sizeof(atcmd_output), "- - Ally #%d (Id: %d): %s", i + 1, ally->clan_id, ally->constant); + clif->messagecolor_self(fd, COLOR_DEFAULT, atcmd_output); + count++; + } + + if (count == 0) { + clif->messagecolor_self(fd, COLOR_DEFAULT, "- - No Allies Found!"); + } + + safesnprintf(atcmd_output, sizeof(atcmd_output), "- Antagonists: %d", VECTOR_LENGTH(c->antagonists)); + clif->messagecolor_self(fd, COLOR_DEFAULT, atcmd_output); + + count = 0; + for (i = 0; i < VECTOR_LENGTH(c->antagonists); i++) { + struct clan_relationship *antagonist = &VECTOR_INDEX(c->antagonists, i); + + if (antagonist == NULL) + continue; + + safesnprintf(atcmd_output, sizeof(atcmd_output), "- - Antagonist #%d (Id: %d): %s", i + 1, antagonist->clan_id, antagonist->constant); + clif->messagecolor_self(fd, COLOR_DEFAULT, atcmd_output); + count++; + } + + if (count == 0) { + clif->messagecolor_self(fd, COLOR_DEFAULT, "- - No Antagonists Found!"); + } + + clif->messagecolor_self(fd, COLOR_DEFAULT, "============================"); + } + dbi_destroy(iter); + return true; +} + +/** + * Clan System: Joins in the given clan + */ +ACMD(joinclan) +{ + int clan_id; + + if (*message == '\0') { + clif->message(fd, "Please enter a Clan ID (usage: @joinclan )."); + return false; + } + if (sd->status.clan_id != 0) { + clif->messagecolor_self(fd, COLOR_RED, "You are already in a clan."); + return false; + } else if (sd->status.guild_id != 0) { + clif->messagecolor_self(fd, COLOR_RED, "You must leave your guild before enter in a clan."); + return false; + } + + clan_id = atoi(message); + if (clan_id <= 0) { + clif->messagecolor_self(fd, COLOR_RED, "Invalid Clan ID."); + return false; + } + if (!clan->join(sd, clan_id)) { + clif->messagecolor_self(fd, COLOR_RED, "The clan couldn't be joined."); + return false; + } + return true; +} + +/** + * Clan System: Leaves current clan + */ +ACMD(leaveclan) +{ + if (sd->status.clan_id == 0) { + clif->messagecolor_self(fd, COLOR_RED, "You aren't in a clan."); + return false; + } + if (!clan->leave(sd, false)) { + clif->messagecolor_self(fd, COLOR_RED, "Failed on leaving clan."); + return false; + } + return true; +} + +/** + * Clan System: Reloads clan db + */ +ACMD(reloadclans) +{ + clan->reload(); + clif->messagecolor_self(fd, COLOR_DEFAULT, "Clan configuration and database have been reloaded."); + return true; +} + /** * Fills the reference of available commands in atcommand DBMap **/ @@ -9723,6 +9910,12 @@ void atcommand_basecommands(void) { ACMD_DEF(cddebug), ACMD_DEF(lang), ACMD_DEF(bodystyle), + ACMD_DEF(cvcoff), + ACMD_DEF(cvcon), + ACMD_DEF(claninfo), + ACMD_DEF(joinclan), + ACMD_DEF(leaveclan), + ACMD_DEF(reloadclans), }; int i; diff --git a/src/map/battle.c b/src/map/battle.c index 70ebc4a08..d52d20f24 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -25,6 +25,7 @@ #include "map/battleground.h" #include "map/chrif.h" +#include "map/clan.h" #include "map/clif.h" #include "map/elemental.h" #include "map/guild.h" @@ -6774,14 +6775,17 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f return (flag&state)?1:-1; } - if( map_flag_vs(m) ) { + if (map_flag_vs(m)) { //Check rivalry settings. - int sbg_id = 0, tbg_id = 0; - if( map->list[m].flag.battleground ) { + int sbg_id = 0, tbg_id = 0, s_clan = 0, t_clan = 0; + if (map->list[m].flag.battleground) { sbg_id = bg->team_get_id(s_bl); tbg_id = bg->team_get_id(t_bl); + } else if (map->list[m].flag.cvc) { + s_clan = clan->get_id(s_bl); + t_clan = clan->get_id(t_bl); } - if( flag&(BCT_PARTY|BCT_ENEMY) ) { + if (flag & (BCT_PARTY | BCT_ENEMY)) { int s_party = status->get_party_id(s_bl); int s_guild = status->get_guild_id(s_bl); int t_guild = status->get_guild_id(t_bl); @@ -6791,10 +6795,12 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f if (s_guild != 0 && t_guild != 0 && (s_guild == t_guild || guild->isallied(s_guild, t_guild))) state |= BCT_PARTY; else - state |= flag&BCT_ENEMY ? BCT_ENEMY : BCT_PARTY; + state |= flag & BCT_ENEMY ? BCT_ENEMY : BCT_PARTY; } else if (!(map->list[m].flag.pvp && map->list[m].flag.pvp_noparty) && (!map->list[m].flag.battleground || sbg_id == tbg_id)) { state |= BCT_PARTY; + } else if (!map->list[m].flag.cvc || s_clan == t_clan) { + state |= BCT_PARTY; } else { state |= BCT_ENEMY; } @@ -6802,18 +6808,22 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f state |= BCT_ENEMY; } } - if( flag&(BCT_GUILD|BCT_ENEMY) ) { + if (flag & (BCT_GUILD | BCT_ENEMY)) { int s_guild = status->get_guild_id(s_bl); int t_guild = status->get_guild_id(t_bl); - if( !(map->list[m].flag.pvp && map->list[m].flag.pvp_noguild) + if (!(map->list[m].flag.pvp && map->list[m].flag.pvp_noguild) && s_guild && t_guild - && (s_guild == t_guild || (!(flag&BCT_SAMEGUILD) && guild->isallied(s_guild, t_guild))) - && (!map->list[m].flag.battleground || sbg_id == tbg_id) ) + && (s_guild == t_guild || (!(flag & BCT_SAMEGUILD) && guild->isallied(s_guild, t_guild))) + && (!map->list[m].flag.battleground || sbg_id == tbg_id) + && (!map->list[m].flag.cvc || s_clan == t_clan) + ) { state |= BCT_GUILD; - else + } else { state |= BCT_ENEMY; + } } - if( state&BCT_ENEMY && map->list[m].flag.battleground && sbg_id && sbg_id == tbg_id ) + + if (state & BCT_ENEMY && ((map->list[m].flag.battleground && sbg_id && sbg_id == tbg_id) || (map->list[m].flag.cvc && s_clan && s_clan == t_clan))) state &= ~BCT_ENEMY; if (state&BCT_ENEMY && battle_config.pk_mode && !map_flag_gvg(m) && s_bl->type == BL_PC && t_bl->type == BL_PC) { diff --git a/src/map/clan.c b/src/map/clan.c new file mode 100644 index 000000000..b67726b37 --- /dev/null +++ b/src/map/clan.c @@ -0,0 +1,1071 @@ +/** + * This file is part of Hercules. + * http://herc.ws - http://github.com/HerculesWS/Hercules + * + * Copyright (C) 2017 Hercules Dev Team + * + * Hercules is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#define HERCULES_CORE + +#include "config/core.h" +#include "clan.h" + +#include "map/clif.h" +#include "map/chrif.h" +#include "map/homunculus.h" +#include "map/intif.h" +#include "map/log.h" +#include "map/mercenary.h" +#include "map/mob.h" +#include "map/npc.h" +#include "map/pc.h" +#include "map/pet.h" +#include "map/script.h" +#include "map/skill.h" +#include "map/status.h" +#include "common/HPM.h" +#include "common/conf.h" +#include "common/cbasetypes.h" +#include "common/db.h" +#include "common/memmgr.h" +#include "common/mapindex.h" +#include "common/nullpo.h" +#include "common/showmsg.h" +#include "common/socket.h" +#include "common/strlib.h" +#include "common/timer.h" +#include "common/utils.h" + +#include +#include +#include + +struct clan_interface clan_s; +struct clan_interface *clan; + +/** + * Searches a Clan by clan_id + * + * @param clan_id Clan ID + * @return struct clan* + */ +struct clan *clan_search(int clan_id) +{ + if (clan_id <= 0) { + return NULL; + } + return (struct clan *)idb_get(clan->db, clan_id); +} + +/** + * Searches a Clan by clan_name or constant + * + * @param name Clan Name + * @return struct clan* + */ +struct clan *clan_searchname(const char *name) +{ + struct clan *c; + struct DBIterator *iter; + + nullpo_retr(NULL, name); + + iter = db_iterator(clan->db); + for (c = dbi_first(iter); dbi_exists(iter); c = dbi_next(iter)) { + if (strncmpi(c->name, name, NAME_LENGTH) == 0 || strncmpi(c->constant, name, NAME_LENGTH) == 0) { + break; + } + } + dbi_destroy(iter); + return c; +} + +/** + * Returns the first online character of clan + * + * @param (struct clan *) c clan structure + * @return (struct map_session_data *) + */ +struct map_session_data *clan_getonlinesd(struct clan *c) +{ + int i; + nullpo_retr(NULL, c); + + ARR_FIND(0, VECTOR_LENGTH(c->members), i, VECTOR_INDEX(c->members, i).sd != NULL); + return (i < VECTOR_LENGTH(c->members)) ? VECTOR_INDEX(c->members, i).sd : NULL; +} + +/** + * Returns the member index of given Player + * + * @param c Clan Data + * @param char_id Player's Char ID + * @return int + */ +int clan_getindex(const struct clan *c, int char_id) +{ + int i; + nullpo_retr(INDEX_NOT_FOUND, c); + + ARR_FIND(0, VECTOR_LENGTH(c->members), i, VECTOR_INDEX(c->members, i).char_id == char_id); + + if (i == VECTOR_LENGTH(c->members)) { + return INDEX_NOT_FOUND; + } + return i; +} + +/** + * Starts clan buff + */ +void clan_buff_start(struct map_session_data *sd, struct clan *c) +{ + nullpo_retv(sd); + nullpo_retv(c); + + if (c->buff.icon <= 0) { + return; + } + + clif->sc_load(&sd->bl, sd->bl.id, SELF, c->buff.icon, 0, c->clan_id, 0); + script->run(c->buff.script, 0, sd->bl.id, npc->fake_nd->bl.id); +} + +/** + * Ends clan buff + */ +void clan_buff_end(struct map_session_data *sd, struct clan *c) +{ + nullpo_retv(sd); + nullpo_retv(c); + + if (c->buff.icon <= 0) { + return; + } + + clif->sc_end(&sd->bl, sd->bl.id, SELF, c->buff.icon); +} + +/** + * Joins a Player into a Clan + * + * @param sd Player's Map Session Data + * @param clan_id Clan which will add this player + * @return bool + */ +bool clan_join(struct map_session_data *sd, int clan_id) +{ + struct clan *c; + struct clan_member m; + + nullpo_ret(sd); + + // Already joined a guild or clan + if (sd->status.guild_id > 0 || sd->guild != NULL) { + ShowError("clan_join: Player already joined in a guild. char_id: %d\n", sd->status.char_id); + return false; + } else if ( sd->status.clan_id > 0 || sd->clan != NULL) { + ShowError("clan_join: Player already joined in a clan. char_id: %d\n", sd->status.char_id); + return false; + } + + c = clan->search(clan_id); + if (c == NULL) { + ShowError("clan_join: Invalid Clan ID: %d\n", clan_id); + return false; + } + + if (!c->received) { + return false; + } + + if (clan->getindex(c, sd->status.char_id) != INDEX_NOT_FOUND) { + ShowError("clan_join: Player already joined this clan. char_id: %d clan_id: %d\n", sd->status.char_id, clan_id); + return false; + } + + if (VECTOR_LENGTH(c->members) >= c->max_member || c->member_count >= c->max_member) { + ShowError("clan_join: Clan '%s' already reached its max capacity!\n", c->name); + return false; + } + + VECTOR_ENSURE(c->members, 1, 1); + + m.sd = sd; + m.char_id = sd->status.char_id; + m.online = 1; + m.last_login = sd->status.last_login; + VECTOR_PUSH(c->members, m); + + c->connect_member++; + c->member_count++; + + sd->status.clan_id = c->clan_id; + sd->clan = c; + + sc_start2(NULL, &sd->bl, SC_CLAN_INFO, 10000, 0, c->clan_id, INFINITE_DURATION); + status_calc_pc(sd, SCO_FORCE); + + chrif->save(sd, 0); + clif->clan_basicinfo(sd); + clif->clan_onlinecount(c); + return true; +} + +/** + * Invoked when a player joins + * It assumes that clan_id is not 0 + * + * @param sd Player Data + */ +void clan_member_online(struct map_session_data *sd, bool first) +{ + struct clan *c; + int i, inactivity; + nullpo_retv(sd); + + // For invalid values we must reset it to 0 (no clan) + if (sd->status.clan_id < 0) { + ShowError("clan_member_online: Invalid clan id, changing to '0'. clan_id='%d' char_id='%d'\n", sd->status.clan_id, sd->status.char_id); + sd->status.clan_id = 0; + return; + } + + c = clan->search(sd->status.clan_id); + if (c == NULL) { + // This is a silent return because it will reset clan_id in case + // a custom clan that was removed and this is a remaining member + sd->status.clan_id = 0; + sd->clan = NULL; + if (!first) { + status_change_end(&sd->bl, SC_CLAN_INFO, INVALID_TIMER); // Remove the status + status_calc_pc(sd, SCO_FORCE); + } + clif->clan_leave(sd); + return; + } + + if (!c->received) { + return; + } + + if (c->max_member <= c->member_count || VECTOR_LENGTH(c->members) >= c->max_member) { + ShowError("Clan System: More members than the maximum allowed in clan #%d\n", c->clan_id); + return; + } + + i = clan->getindex(c, sd->status.char_id); + inactivity = (int)(time(NULL) - sd->status.last_login); + if (i == INDEX_NOT_FOUND) { + struct clan_member m; + + if (c->kick_time > 0 && inactivity > c->kick_time) { + sd->status.clan_id = 0; + sd->clan = NULL; + clan->buff_end(sd, c); + status_change_end(&sd->bl, SC_CLAN_INFO, INVALID_TIMER); + clif->clan_leave(sd); + return; + } + + VECTOR_ENSURE(c->members, 1, 1); + + m.sd = sd; + m.char_id = sd->status.char_id; + m.online = 1; + m.last_login = sd->status.last_login; + VECTOR_PUSH(c->members, m); + } else { + struct clan_member *m = &VECTOR_INDEX(c->members, i); + + + if (c->kick_time > 0 && inactivity > c->kick_time) { + if (m->online == 1) { + m->online = 0; + c->connect_member--; + c->member_count--; + } + clan->buff_end(sd, c); + sd->status.clan_id = 0; + sd->clan = NULL; + status_change_end(&sd->bl, SC_CLAN_INFO, INVALID_TIMER); + VECTOR_ERASE(c->members, i); + clif->clan_leave(sd); + return; + } + + m->online = 1; + m->last_login = sd->status.last_login; + } + + sd->clan = c; + c->connect_member++; + + sc_start2(NULL, &sd->bl, SC_CLAN_INFO, 10000, 0, c->clan_id, INFINITE_DURATION); + + if (!first) { + // When first called from pc.c we don't need to do status_calc + status_calc_pc(sd, SCO_FORCE); + } + + clif->clan_basicinfo(sd); + clif->clan_onlinecount(c); +} + +/** + * Re-join a player on its clan + */ +int clan_rejoin(struct map_session_data *sd, va_list ap) +{ + nullpo_ret(sd); + + if (sd->status.clan_id != 0) { + // Note: Even if the value is invalid (lower than zero) + // the function will fix the invalid value + clan->member_online(sd, false); + } + return 0; +} + +/** + * Removes Player from clan + */ +bool clan_leave(struct map_session_data *sd, bool first) +{ + int i; + struct clan *c; + + nullpo_ret(sd); + + c = sd->clan; + + if (c == NULL) { + return false; + } + + if (!c->received) { + return false; + } + + i = clan->getindex(c, sd->status.char_id); + if (i != INDEX_NOT_FOUND) { + VECTOR_ERASE(c->members, i); + c->connect_member--; + c->member_count--; + } + + sd->status.clan_id = 0; + sd->clan = NULL; + clan->buff_end(sd, c); + + status_change_end(&sd->bl, SC_CLAN_INFO, INVALID_TIMER); + if (!first) { + status_calc_pc(sd, SCO_FORCE); + } + + chrif->save(sd, 0); + clif->clan_onlinecount(c); + clif->clan_leave(sd); + return true; +} + +/** + * Sets a player offline + * + * @param (struct map_session_data *) sd Player Data + */ +void clan_member_offline(struct map_session_data *sd) +{ + struct clan *c; + int i; + + nullpo_retv(sd); + + c = sd->clan; + + if (c == NULL) { + return; + } + + i = clan->getindex(c, sd->status.char_id); + if (i != INDEX_NOT_FOUND && VECTOR_INDEX(c->members, i).online == 1) { + // Only if it is online, because unit->free is called twice + VECTOR_INDEX(c->members, i).online = 0; + c->connect_member--; + } + clif->clan_onlinecount(c); +} + + +/** + * Sends a message to the whole clan + */ +bool clan_send_message(struct map_session_data *sd, const char *mes) +{ + int len; + nullpo_retr(false, sd); + nullpo_retr(false, mes); + + len = (int)strlen(mes); + + if (sd->status.clan_id == 0) { + return false; + } + clan->recv_message(sd->clan, mes, len); + + // Chat logging type 'C' / Clan Chat + logs->chat(LOG_CHAT_CLAN, sd->status.clan_id, sd->status.char_id, sd->status.account_id, mapindex_id2name(sd->mapindex), sd->bl.x, sd->bl.y, NULL, mes); + + return true; +} + +/** + * Clan receive a message, will be displayed to whole clan + */ +void clan_recv_message(struct clan *c, const char *mes, int len) +{ + clif->clan_message(c, mes, len); +} + +/** + * Set constants for each clan + */ +void clan_set_constants(void) +{ + struct DBIterator *iter = db_iterator(clan->db); + struct clan *c; + + for (c = dbi_first(iter); dbi_exists(iter); c = dbi_next(iter)) { + script->set_constant2(c->constant, c->clan_id, false, false); + } + + dbi_destroy(iter); +} + +/** + * Returns the clan_id of bl + */ +int clan_get_id(const struct block_list *bl) +{ + nullpo_ret(bl); + + switch (bl->type) { + case BL_PC: { + const struct map_session_data *sd = BL_UCCAST(BL_PC, bl); + return sd->status.clan_id; + } + case BL_NPC: { + const struct npc_data *nd = BL_UCCAST(BL_NPC, bl); + return nd->clan_id; + } + case BL_PET: { + const struct pet_data *pd = BL_UCCAST(BL_PET, bl); + if (pd->msd != NULL) + return pd->msd->status.clan_id; + } + break; + case BL_MOB: { + const struct mob_data *md = BL_UCCAST(BL_MOB, bl); + const struct map_session_data *msd; + if (md->special_state.ai != AI_NONE && (msd = map->id2sd(md->master_id)) != NULL) { + return msd->status.clan_id; + } + return md->clan_id; + } + case BL_HOM: { + const struct homun_data *hd = BL_UCCAST(BL_HOM, bl); + if (hd->master != NULL) { + return hd->master->status.clan_id; + } + } + break; + case BL_MER: { + const struct mercenary_data *md = BL_UCCAST(BL_MER, bl); + if (md->master != NULL) { + return md->master->status.clan_id; + } + } + break; + case BL_SKILL: { + const struct skill_unit *su = BL_UCCAST(BL_SKILL, bl); + if (su->group != NULL) + return su->group->clan_id; + } + break; + } + + return 0; +} + +/** + * Checks every clan player and remove those who are inactive + */ +int clan_inactivity_kick(int tid, int64 tick, int id, intptr_t data) +{ + struct clan *c = NULL; + int i; + + if ((c = clan->search(id)) != NULL) { + if (!c->kick_time || c->tid != tid || tid == INVALID_TIMER || c->tid == INVALID_TIMER) { + ShowError("Timer Mismatch (Time: %d seconds) %d != %d", c->kick_time, c->tid, tid); + Assert_retr(0, 0); + return 0; + } + for (i = 0; i < VECTOR_LENGTH(c->members); i++) { + struct clan_member *m = &VECTOR_INDEX(c->members, i); + if (m->char_id <= 0 || m->online <= 0) + continue; + + if (m->online) { + struct map_session_data *sd = m->sd; + if (DIFF_TICK32(sockt->last_tick, sd->idletime) > c->kick_time) { + clan->leave(sd, false); + } + } else if ((time(NULL) - m->last_login) > c->kick_time) { + VECTOR_ERASE(c->members, i); + c->member_count--; + clif->clan_onlinecount(c); + } + } + //Perform the kick for offline members that didn't connect after a server restart + c->received = false; + intif->clan_kickoffline(c->clan_id, c->kick_time); + c->tid = timer->add(timer->gettick() + c->check_time, clan->inactivity_kick, c->clan_id, 0); + } + return 1; +} + +/** + * Timeout for the request of offline kick + */ +int clan_request_kickoffline(int tid, int64 tick, int id, intptr_t data) +{ + struct clan *c = NULL; + + if ((c = clan->search(id)) != NULL) { + if (c->req_kick_tid != tid || c->req_kick_tid == INVALID_TIMER) { + ShowError("Timer Mismatch %d != %d", c->tid, tid); + return 0; + } + + if (c->received) { + c->req_kick_tid = INVALID_TIMER; + return 1; + } + + intif->clan_kickoffline(c->clan_id, c->kick_time); + c->req_kick_tid = timer->add(timer->gettick() + clan->req_timeout, clan->request_kickoffline, c->clan_id, 0); + } + return 1; +} + +/** + * Timeout of the request for counting members + */ +int clan_request_membercount(int tid, int64 tick, int id, intptr_t data) +{ + struct clan *c = NULL; + + if ((c = clan->search(id)) != NULL) { + if (c->req_count_tid != tid || c->req_count_tid == INVALID_TIMER) { + ShowError("Timer Mismatch %d != %d", c->tid, tid); + return 0; + } + + if (c->received) { + c->req_count_tid = INVALID_TIMER; + return 1; + } + + intif->clan_membercount(c->clan_id, c->kick_time); + c->req_count_tid = timer->add(timer->gettick() + clan->req_timeout, clan->request_membercount, c->clan_id, 0); + } + return 1; +} + +/** + * Processes any (plugin-defined) additional fields for a clan entry. + * + * @param[in, out] entry The destination clan entry, already initialized (clan_id is expected to be already set). + * @param[in] t The libconfig entry. + * @param[in] n Ordinal number of the entry, to be displayed in case of validation errors. + * @param[in] source Source of the entry (file name), to be displayed in case of validation errors. + */ +void clan_read_db_additional_fields(struct clan *entry, struct config_setting_t *t, int n, const char *source) +{ + // do nothing. plugins can do own work +} + +void clan_read_buffs(struct clan *c, struct config_setting_t *buff, const char *source) +{ + struct clan_buff *b; + const char *str = NULL; + + nullpo_retv(c); + nullpo_retv(buff); + + b = &c->buff; + + if (!libconfig->setting_lookup_int(buff, "Icon", &b->icon)) { + const char *temp_str = NULL; + if (libconfig->setting_lookup_string(buff, "Icon", &temp_str)) { + if (*temp_str && !script->get_constant(temp_str, &b->icon)) { + ShowWarning("Clan %d: Invalid Buff icon value. Defaulting to SI_BLANK.\n", c->clan_id); + b->icon = -1; // SI_BLANK + } + } + } + + if (libconfig->setting_lookup_string(buff, "Script", &str)) { + b->script = *str ? script->parse(str, source, -b->icon, SCRIPT_IGNORE_EXTERNAL_BRACKETS, NULL) : NULL; + } +} + +/** + * Processes one clandb entry from the libconfig file, loading and inserting it + * into the clan database. + * + * @param settings Libconfig setting entry. It is expected to be valid and it + * won't be freed (it is care of the caller to do so if + * necessary). + * @param source Source of the entry (file name), to be displayed in case of + * validation errors. + * @return int. + */ +int clan_read_db_sub(struct config_setting_t *settings, const char *source, bool reload) +{ + int total, s, valid = 0; + + nullpo_retr(false, settings); + + total = libconfig->setting_length(settings); + + for (s = 0; s < total; s++) { + struct clan *c; + struct config_setting_t *cl, *buff, *allies, *antagonists; + const char *aName, *aLeader, *aMap, *aConst; + int max_members, kicktime = 0, kickchecktime = 0, id, i, j; + + cl = libconfig->setting_get_elem(settings, s); + + if (libconfig->setting_lookup_int(cl, "Id", &id)) { + if (id <= 0) { + ShowError("clan_read_db: Invalid Clan Id %d, skipping...\n", id); + return false; + } + + if (clan->search(id) != NULL) { + ShowError("clan_read_db: Duplicate entry for Clan Id %d, skipping...\n", id); + return false; + } + } else { + ShowError("clan_read_db: failed to find 'Id' for clan #%d\n", s); + return false; + } + + if (libconfig->setting_lookup_string(cl, "Const", &aConst)) { + if (!*aConst) { + ShowError("clan_read_db: Invalid Clan Const '%s', skipping...\n", aConst); + return false; + } + + if (strlen(aConst) > NAME_LENGTH) { + ShowError("clan_read_db: Clan Name '%s' is longer than %d characters, skipping...\n", aConst, NAME_LENGTH); + return false; + } + + if (clan->searchname(aConst) != NULL) { + ShowError("clan_read_db: Duplicate entry for Clan Const '%s', skipping...\n", aConst); + return false; + } + } else { + ShowError("clan_read_db: failed to find 'Const' for clan #%d\n", s); + return false; + } + + if (libconfig->setting_lookup_string(cl, "Name", &aName)) { + if (!*aName) { + ShowError("clan_read_db: Invalid Clan Name '%s', skipping...\n", aName); + return false; + } + + if (strlen(aName) > NAME_LENGTH) { + ShowError("clan_read_db: Clan Name '%s' is longer than %d characters, skipping...\n", aName, NAME_LENGTH); + return false; + } + + if (clan->searchname(aName) != NULL) { + ShowError("clan_read_db: Duplicate entry for Clan Name '%s', skipping...\n", aName); + return false; + } + } else { + ShowError("clan_read_db: failed to find 'Name' for clan #%d\n", s); + return false; + } + + if (!libconfig->setting_lookup_string(cl, "Leader", &aLeader)) { + ShowError("clan_read_db: failed to find 'Leader' for clan #%d\n", s); + return false; + } + + if (!libconfig->setting_lookup_string(cl, "Map", &aMap)) { + ShowError("clan_read_db: failed to find 'Map' for clan #%d\n", s); + return false; + } + + CREATE(c, struct clan, 1); + + c->clan_id = id; + safestrncpy(c->constant, aConst, NAME_LENGTH); + safestrncpy(c->name, aName, NAME_LENGTH); + safestrncpy(c->master, aLeader, NAME_LENGTH); + safestrncpy(c->map, aMap, MAP_NAME_LENGTH_EXT); + c->connect_member = 0; + c->member_count = 0; // Char server will count members for us + c->received = false; + c->req_count_tid = INVALID_TIMER; + c->req_kick_tid = INVALID_TIMER; + c->tid = INVALID_TIMER; + + if (libconfig->setting_lookup_int(cl, "MaxMembers", &max_members)) { + if (max_members > 0) { + c->max_member = max_members; + } else { + ShowError("clan_read_db: Clan #%d has invalid value for 'MaxMembers' setting, defaulting to 'clan->max'...\n", id); + c->max_member = clan->max; + } + } else { + c->max_member = clan->max; + } + + if (libconfig->setting_lookup_int(cl, "KickTime", &kicktime)) { + c->kick_time = 60 * 60 * kicktime; + } else { + c->kick_time = clan->kicktime; + } + + if (libconfig->setting_lookup_int(cl, "CheckTime", &kickchecktime)) { + c->check_time = 60 * 60 * max(1, kickchecktime) * 1000; + } else { + c->check_time = clan->checktime; + } + + if ((buff = libconfig->setting_get_member(cl, "Buff")) != NULL) { + clan->read_buffs(c, buff, source); + } + + allies = libconfig->setting_get_member(cl, "Allies"); + + if (allies != NULL) { + int a = libconfig->setting_length(allies); + + VECTOR_INIT(c->allies); + if (a > 0 && clan->max_relations > 0) { + const char *allyConst; + + if (a > clan->max_relations) { + ShowWarning("clan_read_db: Clan %d has more allies(%d) than allowed(%d), reading only the first %d...\n", c->clan_id, a, clan->max_relations, clan->max_relations); + a = clan->max_relations; + } + + VECTOR_ENSURE(c->allies, a, 1); + for (i = 0; i < a; i++) { + struct clan_relationship r; + if ((allyConst = libconfig->setting_get_string_elem(allies, i)) != NULL) { + ARR_FIND(0, VECTOR_LENGTH(c->allies), j, strcmp(VECTOR_INDEX(c->allies, j).constant, allyConst) == 0); + if (j != VECTOR_LENGTH(c->allies)) { + ShowError("clan_read_db: Duplicate entry '%s' in allies for Clan %d in '%s', skipping...\n", allyConst, c->clan_id, source); + continue; + } else if (strcmp(allyConst, c->constant) == 0) { + ShowError("clan_read_db: Clans can't be allies of themselves! Clan Id: %d, in '%s'\n", c->clan_id, source); + continue; + } + safestrncpy(r.constant, allyConst, NAME_LENGTH); + VECTOR_PUSH(c->allies, r); + } + + } + } + } + antagonists = libconfig->setting_get_member(cl, "Antagonists"); + + if (antagonists != NULL) { + int a = libconfig->setting_length(antagonists); + + VECTOR_INIT(c->antagonists); + if (a > 0 && clan->max_relations > 0) { + const char *antagonistConst; + + if (a > clan->max_relations) { + ShowWarning("clan_read_db: Clan %d has more antagonists(%d) than allowed(%d), reading only the first %d...\n", c->clan_id, a, clan->max_relations, clan->max_relations); + a = clan->max_relations; + } + + VECTOR_ENSURE(c->antagonists, a, 1); + for (i = 0; i < a; i++) { + struct clan_relationship r; + if ((antagonistConst = libconfig->setting_get_string_elem(antagonists, i)) != NULL) { + ARR_FIND(0, VECTOR_LENGTH(c->antagonists), j, strcmp(VECTOR_INDEX(c->antagonists, j).constant, antagonistConst) == 0); + if (j != VECTOR_LENGTH(c->antagonists)) { + ShowError("clan_read_db: Duplicate entry '%s' in antagonists for Clan %d in '%s', skipping...\n", antagonistConst, c->clan_id, source); + continue; + } else if (strcmp(antagonistConst, c->constant) == 0) { + ShowError("clan_read_db: Clans can't be antagonists of themselves! Clan Id: %d, in '%s'\n", c->clan_id, source); + continue; + } + safestrncpy(r.constant, antagonistConst, NAME_LENGTH); + VECTOR_PUSH(c->antagonists, r); + } + } + } + } + + clan->read_db_additional_fields(c, cl, s, source); + if (c->kick_time > 0) { + c->tid = timer->add(timer->gettick() + c->check_time, clan->inactivity_kick, c->clan_id, 0); + } + c->received = false; + c->req_state = reload ? CLAN_REQ_RELOAD : CLAN_REQ_FIRST; + c->req_count_tid = timer->add(timer->gettick() + clan->req_timeout, clan->request_membercount, c->clan_id, 0); + idb_put(clan->db, c->clan_id, c); + VECTOR_INIT(c->members); + valid++; + } + + // Validating Relations + if (valid > 0) { + struct DBIterator *iter = db_iterator(clan->db); + struct clan *c_ok, *c; + int i; + + for (c_ok = dbi_first(iter); dbi_exists(iter); c_ok = dbi_next(iter)) { + i = VECTOR_LENGTH(c_ok->allies); + while ( i > 0) { + struct clan_relationship *r; + + i--; + r = &VECTOR_INDEX(c_ok->allies, i); + if ((c = clan->searchname(r->constant)) == NULL) { + ShowError("clan_read_db: Invalid (nonexistent) Ally '%s' for clan %d in '%s', skipping ally...\n", r->constant, c_ok->clan_id, source); + VECTOR_ERASE(c_ok->allies, i); + } else { + r->clan_id = c->clan_id; + } + } + + i = VECTOR_LENGTH(c_ok->antagonists); + while ( i > 0) { + struct clan_relationship *r; + + i--; + r = &VECTOR_INDEX(c_ok->antagonists, i); + if ((c = clan->searchname(r->constant)) == NULL) { + ShowError("clan_read_db: Invalid (nonexistent) Antagonist '%s' for clan %d in '%s', skipping antagonist...", r->constant, c_ok->clan_id, source); + VECTOR_ERASE(c_ok->antagonists, i); + } else { + r->clan_id = c->clan_id; + } + } + } + dbi_destroy(iter); + } + + ShowStatus("Done reading '" CL_WHITE "%d" CL_RESET "' valid clans of '" CL_WHITE "%d" CL_RESET "' entries in '" CL_WHITE "%s" CL_RESET "'.\n", valid, total, source); + return valid; +} + +/** + * Reads Clan DB included by clan configuration file. + * + * @param settings The Settings Group from config file. + * @param source File name. + */ +void clan_read_db(struct config_setting_t *settings, const char *source, bool reload) +{ + struct config_setting_t *clans; + + nullpo_retv(settings); + + if ((clans = libconfig->setting_get_member(settings, "clans")) != NULL) { + int read; + + read = clan->read_db_sub(clans, source, reload); + if (read > 0) { + clan->set_constants(); + } + } else { + ShowError("clan_read_db: Can't find setting 'clans' in '%s'. No Clans found.\n", source); + } +} + +/** + * Reads clan config file + * + * @param bool clear Whether to clear clan->db before reading clans + */ +bool clan_config_read(bool reload) +{ + struct config_t clan_conf; + struct config_setting_t *settings = NULL; + const char *config_filename = "conf/clans.conf"; // FIXME: hardcoded name + int kicktime = 0, kickchecktime = 0; + + if (reload) { + struct DBIterator *iter = db_iterator(clan->db); + struct clan *c_clear; + + for (c_clear = dbi_first(iter); dbi_exists(iter); c_clear = dbi_next(iter)) { + if (c_clear->buff.script != NULL) { + script->free_code(c_clear->buff.script); + } + if (c_clear->tid != INVALID_TIMER) { + timer->delete(c_clear->tid, clan->inactivity_kick); + } + VECTOR_CLEAR(c_clear->allies); + VECTOR_CLEAR(c_clear->antagonists); + VECTOR_CLEAR(c_clear->members); + HPM->data_store_destroy(&c_clear->hdata); + } + dbi_destroy(iter); + clan->db->clear(clan->db, NULL); + } + + if (!libconfig->load_file(&clan_conf, config_filename)) { + return false; + } + + if ((settings = libconfig->lookup(&clan_conf, "clan_configuration")) == NULL) { + ShowError("clan_config_read: failed to find 'clan_configuration'.\n"); + return false; + } + + libconfig->setting_lookup_int(settings, "MaxMembers", &clan->max); + libconfig->setting_lookup_int(settings, "MaxRelations", &clan->max_relations); + libconfig->setting_lookup_int(settings, "InactivityKickTime", &kicktime); + if (!libconfig->setting_lookup_int(settings, "InactivityCheckTime", &kickchecktime)) { + ShowError("clan_config_read: failed to find InactivityCheckTime using official value.\n"); + kickchecktime = 24; + } + + // On config file we set the time in hours but here we use in seconds + clan->kicktime = 60 * 60 * kicktime; + clan->checktime = 60 * 60 * max(kickchecktime, 1) * 1000; + + clan->config_read_additional_settings(settings, config_filename); + clan->read_db(settings, config_filename, reload); + libconfig->destroy(&clan_conf); + return true; +} + +/** + * Processes any (plugin-defined) additional settings for clan config. + * + * @param settings The Settings Group from config file. + * @param source Source of the entry (file name), to be displayed in + * case of validation errors. + */ +void clan_config_read_additional_settings(struct config_setting_t *settings, const char *source) +{ + // do nothing. plugins can do own work +} + +/** + * Reloads Clan DB + */ +void clan_reload(void) +{ + clan->config_read(true); +} + +/** + * + */ +void do_init_clan(bool minimal) +{ + if (minimal) { + return; + } + clan->db = idb_alloc(DB_OPT_RELEASE_DATA); + clan->config_read(false); + timer->add_func_list(clan->inactivity_kick, "clan_inactivity_kick"); +} + +/** + * + */ +void do_final_clan(void) +{ + struct DBIterator *iter = db_iterator(clan->db); + struct clan *c; + + for (c = dbi_first(iter); dbi_exists(iter); c = dbi_next(iter)) { + if (c->buff.script) { + script->free_code(c->buff.script); + } + if (c->tid != INVALID_TIMER) { + timer->delete(c->tid, clan->inactivity_kick); + } + VECTOR_CLEAR(c->allies); + VECTOR_CLEAR(c->antagonists); + VECTOR_CLEAR(c->members); + HPM->data_store_destroy(&c->hdata); + } + dbi_destroy(iter); + db_destroy(clan->db); +} + +/** + * Inits Clan Defaults + */ +void clan_defaults(void) +{ + clan = &clan_s; + + clan->init = do_init_clan; + clan->final = do_final_clan; + /* */ + clan->db = NULL; + clan->max = 0; + clan->max_relations = 0; + clan->kicktime = 0; + clan->checktime = 0; + clan->req_timeout = 60; + /* */ + clan->config_read = clan_config_read; + clan->config_read_additional_settings = clan_config_read_additional_settings; + clan->read_db = clan_read_db; + clan->read_db_sub = clan_read_db_sub; + clan->read_db_additional_fields = clan_read_db_additional_fields; + clan->read_buffs = clan_read_buffs; + clan->search = clan_search; + clan->searchname = clan_searchname; + clan->getonlinesd = clan_getonlinesd; + clan->getindex = clan_getindex; + clan->join = clan_join; + clan->member_online = clan_member_online; + clan->leave = clan_leave; + clan->send_message = clan_send_message; + clan->recv_message = clan_recv_message; + clan->member_offline = clan_member_offline; + clan->set_constants = clan_set_constants; + clan->get_id = clan_get_id; + clan->buff_start = clan_buff_start; + clan->buff_end = clan_buff_end; + clan->reload = clan_reload; + clan->rejoin = clan_rejoin; + clan->inactivity_kick = clan_inactivity_kick; + clan->request_kickoffline = clan_request_kickoffline; + clan->request_membercount = clan_request_membercount; +} diff --git a/src/map/clan.h b/src/map/clan.h new file mode 100644 index 000000000..15ed52680 --- /dev/null +++ b/src/map/clan.h @@ -0,0 +1,85 @@ +/** + * This file is part of Hercules. + * http://herc.ws - http://github.com/HerculesWS/Hercules + * + * Copyright (C) 2017 Hercules Dev Team + * + * Hercules is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#ifndef MAP_CLAN_H +#define MAP_CLAN_H + +#include "map/map.h" +#include "common/hercules.h" +#include "common/db.h" +#include "common/mmo.h" + +struct map_session_data; + +enum clan_req_state { + CLAN_REQ_NONE = 0, + CLAN_REQ_FIRST = 1, + CLAN_REQ_RELOAD = 2, + CLAN_REQ_AFTER_KICK = 3, +}; + +/** + * clan Interface + **/ +struct clan_interface { + struct DBMap *db; // int clan_id -> struct clan* + + int max; + int max_relations; + int kicktime; + int checktime; + int req_timeout; + + void (*init) (bool minimal); + void (*final) (void); + + bool (*config_read) (bool reload); + void (*config_read_additional_settings) (struct config_setting_t *settings, const char *source); + void (*read_db) (struct config_setting_t *settings, const char *source, bool reload); + int (*read_db_sub) (struct config_setting_t *settings, const char *source, bool reload); + void (*read_db_additional_fields) (struct clan *entry, struct config_setting_t *t, int n, const char *source); + void (*read_buffs) (struct clan *c, struct config_setting_t *buff, const char *source); + struct clan *(*search) (int clan_id); + struct clan *(*searchname) (const char *name); + struct map_session_data *(*getonlinesd) (struct clan *c); + int (*getindex) (const struct clan *c, int char_id); + bool (*join) (struct map_session_data *sd, int clan_id); + void (*member_online) (struct map_session_data *sd, bool first); + bool (*leave) (struct map_session_data *sd, bool first); + bool (*send_message) (struct map_session_data *sd, const char *mes); + void (*recv_message) (struct clan *c, const char *mes, int len); + void (*member_offline) (struct map_session_data *sd); + void (*set_constants) (void); + int (*get_id) (const struct block_list *bl); + void (*buff_start) (struct map_session_data *sd, struct clan *c); + void (*buff_end) (struct map_session_data *sd, struct clan *c); + void (*reload) (void); + int (*rejoin) (struct map_session_data *sd, va_list ap); + int (*inactivity_kick) (int tid, int64 tick, int id, intptr_t data); + int (*request_kickoffline) (int tid, int64 tick, int id, intptr_t data); + int (*request_membercount) (int tid, int64 tick, int id, intptr_t data); +}; + +#ifdef HERCULES_CORE +void clan_defaults (void); +#endif // HERCULES_CORE + +HPShared struct clan_interface *clan; + +#endif /* MAP_CLAN_H */ diff --git a/src/map/clif.c b/src/map/clif.c index 988e821e7..dc279f7ed 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -29,6 +29,7 @@ #include "map/channel.h" #include "map/chat.h" #include "map/chrif.h" +#include "map/clan.h" #include "map/elemental.h" #include "map/guild.h" #include "map/homunculus.h" @@ -659,6 +660,22 @@ bool clif_send(const void* buf, int len, struct block_list* bl, enum send_target } break; + case CLAN: + if (sd && sd->status.clan_id) { + struct clan *c = clan->search(sd->status.clan_id); + + nullpo_retr(false, c); + + for (i = 0; i < VECTOR_LENGTH(c->members); i++) { + if ((sd = VECTOR_INDEX(c->members, i).sd) == NULL || (fd = sd->fd) <= 0) + continue; + WFIFOHEAD(fd, len); + memcpy(WFIFOP(fd, 0), buf, len); + WFIFOSET(fd, len); + } + } + break; + default: ShowError("clif_send: Unrecognized type %u\n", type); return false; @@ -1534,6 +1551,8 @@ bool clif_spawn(struct block_list *bl) clif->specialeffect(&nd->bl,423,AREA); else if (nd->size == SZ_MEDIUM) clif->specialeffect(&nd->bl,421,AREA); + if (nd->clan_id > 0) + clif->sc_load(&nd->bl, nd->bl.id, AREA, status->dbs->IconChangeTable[SC_CLAN_INFO], 0, nd->clan_id, 0); } break; case BL_PET: @@ -4388,6 +4407,8 @@ void clif_getareachar_unit(struct map_session_data* sd,struct block_list *bl) { clif->specialeffect_single(bl,423,sd->fd); else if (nd->size == SZ_MEDIUM) clif->specialeffect_single(bl,421,sd->fd); + if (nd->clan_id > 0) + clif->sc_load(&nd->bl, nd->bl.id, AREA, status->dbs->IconChangeTable[SC_CLAN_INFO], 0, nd->clan_id, 0); } break; case BL_MOB: @@ -13340,6 +13361,12 @@ bool clif_sub_guild_invite(int fd, struct map_session_data *sd, struct map_sessi return false; } + // Players in a clan can't join a guild + if (t_sd->clan != NULL) { + clif->message(fd, msg_fd(fd, 140)); // You can't join in a clan if you're in a guild. + return false; + } + guild->invite(sd,t_sd); return true; } @@ -19282,6 +19309,156 @@ const char *clif_get_bl_name(const struct block_list *bl) return name; } +/** + * Clan System: Sends the basic clan informations to client. + * 098a .W .L .24B .24B .16B .B + * .B { .24B } * alliance count { .24B } * antagonist count (ZC_CLANINFO) + */ +void clif_clan_basicinfo(struct map_session_data *sd) +{ +#if PACKETVER >= 20120716 + int len, i, fd; + struct clan *c, *ally, *antagonist; + struct PACKET_ZC_CLANINFO *packet = NULL; + + nullpo_retv(sd); + nullpo_retv(c = sd->clan); + + len = sizeof(struct PACKET_ZC_CLANINFO); + fd = sd->fd; + + WFIFOHEAD(fd, len); + packet = WFIFOP(fd, 0); + + packet->PacketType = clanBasicInfo; + packet->ClanID = c->clan_id; + + safestrncpy(packet->ClanName, c->name, NAME_LENGTH); + safestrncpy(packet->MasterName, c->master, NAME_LENGTH); + + mapindex->getmapname_ext(c->map, packet->Map); + + packet->AllyCount = VECTOR_LENGTH(c->allies); + packet->AntagonistCount = VECTOR_LENGTH(c->antagonists); + + // All allies and antagonists are assumed as valid entries + // since it only gets inside the vector after the validation + // on clan->config_read + for (i = 0; i < VECTOR_LENGTH(c->allies); i++) { + struct clan_relationship *al = &VECTOR_INDEX(c->allies, i); + + if ((ally = clan->search(al->clan_id)) != NULL) { + safestrncpy(WFIFOP(fd, len), ally->name, NAME_LENGTH); + len += NAME_LENGTH; + } + } + + for (i = 0; i < VECTOR_LENGTH(c->antagonists); i++) { + struct clan_relationship *an = &VECTOR_INDEX(c->antagonists, i); + + if ((antagonist = clan->search(an->clan_id)) != NULL) { + safestrncpy(WFIFOP(fd, len), antagonist->name, NAME_LENGTH); + len += NAME_LENGTH; + } + } + + packet->PacketLength = len; + WFIFOSET(fd, len); +#endif +} + +/** + * Clan System: Updates the online and maximum player count of a clan. + * 0988 .W .W (ZC_NOTIFY_CLAN_CONNECTINFO) + */ +void clif_clan_onlinecount(struct clan *c) +{ +#if PACKETVER >= 20120716 + struct map_session_data *sd; + struct PACKET_ZC_NOTIFY_CLAN_CONNECTINFO p; + + nullpo_retv(c); + + p.PacketType = clanOnlineCount; + p.NumConnect = c->connect_member; + p.NumTotal = c->max_member; + + if ((sd = clan->getonlinesd(c)) != NULL) { + clif->send(&p, sizeof(p), &sd->bl, CLAN); + } +#endif +} + +/** +* Clan System: Notifies the client that the player has left his clan. +* 0989 (ZC_ACK_CLAN_LEAVE) +**/ +void clif_clan_leave(struct map_session_data* sd) +{ +#if PACKETVER >= 20131223 + struct PACKET_ZC_ACK_CLAN_LEAVE p; + + nullpo_retv(sd); + + p.PacketType = clanLeave; + + clif->send(&p, sizeof(p), &sd->bl, SELF); +#endif +} + +/** + * Clan System: Sends a clan message to a player + * 098e .W .24B .?B (ZC_NOTIFY_CLAN_CHAT) + */ +void clif_clan_message(struct clan *c, const char *mes, int len) +{ +#if PACKETVER >= 20120716 + struct map_session_data *sd; + struct PACKET_ZC_NOTIFY_CLAN_CHAT *p; + unsigned int max_len = CHAT_SIZE_MAX - 5 - NAME_LENGTH; + int packet_length; + + nullpo_retv(c); + nullpo_retv(mes); + + if (len == 0) { + return; + } else if (len > max_len) { + ShowWarning("clif_clan_message: Truncated message '%s' (len=%d, max=%u, clan_id=%d).\n", mes, len, max_len, c->clan_id); + len = max_len; + } + + packet_length = sizeof(*p) + len + 1; + p = (struct PACKET_ZC_NOTIFY_CLAN_CHAT *)aMalloc(packet_length); + p->PacketType = clanMessage; + p->PacketLength = packet_length; + // p->MemberName is being ignored on the client side. + safestrncpy(p->Message, mes, len + 1); + + if ((sd = clan->getonlinesd(c)) != NULL) + clif->send(p, packet_length, &sd->bl, CLAN); + aFree(p); +#endif +} + +void clif_parse_ClanMessage(int fd, struct map_session_data *sd) __attribute__((nonnull (2))); +/** + * Clan System: Parses a clan message from a player. + * 098d .W .?B ( : ) (CZ_CLAN_CHAT) + */ +void clif_parse_ClanMessage(int fd, struct map_session_data *sd) +{ +#if PACKETVER >= 20120716 + const struct packet_chat_message *packet = RP2PTR(fd); + char message[CHAT_SIZE_MAX + NAME_LENGTH + 3 + 1]; + + if (clif->process_chat_message(sd, packet, message, sizeof(message)) == NULL) + return; + + clan->send_message(sd, message); +#endif +} + /* */ unsigned short clif_decrypt_cmd( int cmd, struct map_session_data *sd ) { if( sd ) { @@ -21006,4 +21183,10 @@ void clif_defaults(void) { clif->rodex_icon = clif_rodex_icon; clif->rodex_send_mails_all = clif_rodex_send_mails_all; clif->skill_scale = clif_skill_scale; + // -- Clan system + clif->clan_basicinfo = clif_clan_basicinfo; + clif->clan_onlinecount = clif_clan_onlinecount; + clif->clan_leave = clif_clan_leave; + clif->clan_message = clif_clan_message; + clif->pClanMessage = clif_parse_ClanMessage; } diff --git a/src/map/clif.h b/src/map/clif.h index 69567cc2c..c393c4f64 100644 --- a/src/map/clif.h +++ b/src/map/clif.h @@ -110,6 +110,8 @@ typedef enum send_target { BG_AREA_WOS, BG_QUEUE, + + CLAN, // Clan System } send_target; typedef enum broadcast_flags { @@ -1405,6 +1407,12 @@ struct clif_interface { void (*rodex_request_items) (struct map_session_data *sd, int8 opentype, int64 mail_id, int8 result); void (*rodex_icon) (int fd, bool show); void (*skill_scale) (struct block_list *bl, int src_id, int x, int y, uint16 skill_id, uint16 skill_lv, int casttime); + /* Clan System */ + void (*clan_basicinfo) (struct map_session_data *sd); + void (*clan_onlinecount) (struct clan *c); + void (*clan_leave) (struct map_session_data *sd); + void (*clan_message) (struct clan *c, const char *mes, int len); + void (*pClanMessage) (int fd, struct map_session_data* sd); }; #ifdef HERCULES_CORE diff --git a/src/map/guild.c b/src/map/guild.c index bb0484477..11609ec81 100644 --- a/src/map/guild.c +++ b/src/map/guild.c @@ -365,6 +365,11 @@ int guild_create(struct map_session_data *sd, const char *name) nullpo_ret(sd); nullpo_ret(name); + if (sd->clan != NULL) { + clif->messagecolor_self(sd->fd, COLOR_RED, "You cannot create a guild because you are in a clan."); + return 0; + } + safestrncpy(tname, name, NAME_LENGTH); trim(tname); diff --git a/src/map/intif.c b/src/map/intif.c index be6b75d96..c933ceb15 100644 --- a/src/map/intif.c +++ b/src/map/intif.c @@ -26,6 +26,7 @@ #include "map/atcommand.h" #include "map/battle.h" #include "map/chrif.h" +#include "map/clan.h" #include "map/clif.h" #include "map/elemental.h" #include "map/guild.h" @@ -744,6 +745,81 @@ int intif_party_leaderchange(int party_id,int account_id,int char_id) return 0; } +//========================= +// Clan System +//------------------------- + +/** + * Request clan member count + * + * @param clan_id Id of the clan to have members counted + * @param kick_interval Interval of the inactivity kick + */ +int intif_clan_membercount(int clan_id, int kick_interval) +{ + if (intif->CheckForCharServer() || clan_id == 0 || kick_interval <= 0) + return 0; + + WFIFOHEAD(inter_fd, 10); + WFIFOW(inter_fd, 0) = 0x3044; + WFIFOL(inter_fd, 2) = clan_id; + WFIFOL(inter_fd, 6) = kick_interval; + WFIFOSET(inter_fd, 10); + return 1; +} + +int intif_clan_kickoffline(int clan_id, int kick_interval) +{ + if (intif->CheckForCharServer() || clan_id == 0 || kick_interval <= 0) + return 0; + + WFIFOHEAD(inter_fd, 10); + WFIFOW(inter_fd, 0) = 0x3045; + WFIFOL(inter_fd, 2) = clan_id; + WFIFOL(inter_fd, 6) = kick_interval; + WFIFOSET(inter_fd, 10); + return 1; +} + +void intif_parse_RecvClanMemberAction(int fd) +{ + struct clan *c; + int clan_id = RFIFOL(fd, 2); + int count = RFIFOL(fd, 6); + + if ((c = clan->search(clan_id)) == NULL) { + ShowError("intif_parse_RecvClanMemberAction: Received invalid clan_id '%d'\n", clan_id); + return; + } + + if (count < 0) { + ShowError("intif_parse_RecvClanMemberAction: Received invalid member count value '%d'\n", count); + return; + } + + c->received = true; + if (c->req_count_tid != INVALID_TIMER) { + timer->delete(c->req_count_tid, clan->request_membercount); + c->req_count_tid = INVALID_TIMER; + } + + c->member_count = count; + switch (c->req_state) { + case CLAN_REQ_AFTER_KICK: + if (c->req_kick_tid != INVALID_TIMER) { + timer->delete(c->req_kick_tid, clan->request_kickoffline); + c->req_kick_tid = INVALID_TIMER; + } + break; + case CLAN_REQ_RELOAD: + map->foreachpc(clan->rejoin); + break; + default: + break; + } + c->req_state = CLAN_REQ_NONE; +} + // Request a Guild creation int intif_guild_create(const char *name,const struct guild_member *master) { @@ -2744,6 +2820,9 @@ int intif_parse(int fd) case 0x3896: intif->pRodexHasNew(fd); break; case 0x3897: intif->pRodexSendMail(fd); break; case 0x3898: intif->pRodexCheckName(fd); break; + + // Clan System + case 0x3858: intif->pRecvClanMemberAction(fd); break; default: ShowError("intif_parse : unknown packet %d %x\n",fd,RFIFOW(fd,0)); return 0; @@ -2765,7 +2844,7 @@ void intif_defaults(void) { 39,-1,15,15, 14,19, 7,-1, 0, 0, 0, 0, 0, 0, 0, 0, //0x3820 10,-1,15, 0, 79,19, 7,-1, 0,-1,-1,-1, 14,67,186,-1, //0x3830 -1, 0, 0,14, 0, 0, 0, 0, -1,74,-1,11, 11,-1, 0, 0, //0x3840 - -1,-1, 7, 7, 7,11, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3850 Auctions [Zephyrus] itembound[Akinari] + -1,-1, 7, 7, 7,11, 8, 0, 10, 0, 0, 0, 0, 0, 0, 0, //0x3850 Auctions [Zephyrus] itembound[Akinari] Clan System[Murilo BiO] -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3860 Quests [Kevin] [Inkfish] -1, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 3, 3, 0, //0x3870 Mercenaries [Zephyrus] / Elemental [pakpil] 12,-1, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3880 @@ -2857,6 +2936,9 @@ void intif_defaults(void) { intif->rodex_updatemail = intif_rodex_updatemail; intif->rodex_sendmail = intif_rodex_sendmail; intif->rodex_checkname = intif_rodex_checkname; + /* Clan System */ + intif->clan_kickoffline = intif_clan_kickoffline; + intif->clan_membercount = intif_clan_membercount; /* @accinfo */ intif->request_accinfo = intif_request_accinfo; /* */ @@ -2933,4 +3015,6 @@ void intif_defaults(void) { intif->pRodexHasNew = intif_parse_RodexNotifications; intif->pRodexSendMail = intif_parse_RodexSendMail; intif->pRodexCheckName = intif_parse_RodexCheckName; + /* Clan System */ + intif->pRecvClanMemberAction = intif_parse_RecvClanMemberAction; } diff --git a/src/map/intif.h b/src/map/intif.h index 4bca5f167..be8ff4181 100644 --- a/src/map/intif.h +++ b/src/map/intif.h @@ -138,6 +138,9 @@ struct intif_interface { int(*rodex_updatemail) (int64 mail_id, int8 flag); int(*rodex_sendmail) (struct rodex_message *msg); int(*rodex_checkname) (struct map_session_data *sd, const char *name); + /* Clan System */ + int (*clan_kickoffline) (int clan_id, int kick_interval); + int (*clan_membercount) (int clan_id, int kick_interval); /* @accinfo */ void (*request_accinfo) (int u_fd, int aid, int group_lv, char* query); /* */ @@ -212,6 +215,8 @@ struct intif_interface { void(*pRodexHasNew) (int fd); void(*pRodexSendMail) (int fd); void(*pRodexCheckName) (int fd); + /* Clan System */ + void (*pRecvClanMemberAction) (int fd); }; #ifdef HERCULES_CORE diff --git a/src/map/log.c b/src/map/log.c index 6419c4766..c3fec077e 100644 --- a/src/map/log.c +++ b/src/map/log.c @@ -82,13 +82,21 @@ char log_picktype2char(e_log_pick_type type) { } /// obtain log type character for chat logs -char log_chattype2char(e_log_chat_type type) { - switch( type ) { - case LOG_CHAT_GLOBAL: return 'O'; // Gl(O)bal - case LOG_CHAT_WHISPER: return 'W'; // (W)hisper - case LOG_CHAT_PARTY: return 'P'; // (P)arty - case LOG_CHAT_GUILD: return 'G'; // (G)uild - case LOG_CHAT_MAINCHAT: return 'M'; // (M)ain chat +char log_chattype2char(e_log_chat_type type) +{ + switch (type) { + case LOG_CHAT_GLOBAL: + return 'O'; // Gl(O)bal + case LOG_CHAT_WHISPER: + return 'W'; // (W)hisper + case LOG_CHAT_PARTY: + return 'P'; // (P)arty + case LOG_CHAT_GUILD: + return 'G'; // (G)uild + case LOG_CHAT_MAINCHAT: + return 'M'; // (M)ain chat + case LOG_CHAT_CLAN: + return 'C'; // (C)lan } // should not get here, fallback diff --git a/src/map/log.h b/src/map/log.h index 7ff36d126..e7eb72713 100644 --- a/src/map/log.h +++ b/src/map/log.h @@ -52,6 +52,7 @@ typedef enum e_log_chat_type { LOG_CHAT_PARTY = 0x04, LOG_CHAT_GUILD = 0x08, LOG_CHAT_MAINCHAT = 0x10, + LOG_CHAT_CLAN = 0x20, // all LOG_CHAT_ALL = 0xFF, } e_log_chat_type; diff --git a/src/map/map.c b/src/map/map.c index 306f3a99d..106224a47 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -30,6 +30,7 @@ #include "map/channel.h" #include "map/chat.h" #include "map/chrif.h" +#include "map/clan.h" #include "map/clif.h" #include "map/duel.h" #include "map/elemental.h" @@ -1904,6 +1905,9 @@ int map_quit(struct map_session_data *sd) { if( sd->bg_id && !sd->bg_queue.arena ) /* TODO: dump this chunk after bg_queue is fully enabled */ bg->team_leave(sd,BGTL_QUIT); + if (sd->status.clan_id) + clan->member_offline(sd); + if (sd->state.autotrade && core->runflag != MAPSERVER_ST_SHUTDOWN && !channel->config->closing) pc->autotrade_update(sd,PAUC_REMOVE); @@ -4815,6 +4819,15 @@ bool map_zone_mf_cache(int m, char *flag, char *params) { else if( map->list[m].flag.battleground ) map_zone_mf_cache_add(m,"battleground"); } + } else if (!strcmpi(flag,"cvc")) { + if (state && map->list[m].flag.cvc) { + ;/* nothing to do */ + } else { + if (state) + map_zone_mf_cache_add(m,"cvc\toff"); + else if (map->list[m].flag.cvc) + map_zone_mf_cache_add(m,"cvc"); + } } else if (!strcmpi(flag,"noexppenalty")) { if( state && map->list[m].flag.noexppenalty ) ;/* nothing to do */ @@ -5839,6 +5852,8 @@ void read_map_zone_db(void) { zone->merge_type = MZMT_MERGEABLE; if( (zone = strdb_get(map->zone_db, MAP_ZONE_BG_NAME)) ) zone->merge_type = MZMT_MERGEABLE; + if ((zone = strdb_get(map->zone_db, MAP_ZONE_CVC_NAME))) + zone->merge_type = MZMT_MERGEABLE; } /* not supposed to go in here but in skill_final whatever */ libconfig->destroy(&map_zone_db); @@ -5999,6 +6014,7 @@ int do_final(void) { ircbot->final();/* before channel. */ channel->final(); chrif->final(); + clan->final(); clif->final(); npc->final(); quest->final(); @@ -6185,6 +6201,7 @@ void map_load_defaults(void) { battleground_defaults(); buyingstore_defaults(); channel_defaults(); + clan_defaults(); clif_defaults(); chrif_defaults(); guild_defaults(); @@ -6517,6 +6534,7 @@ int do_init(int argc, char *argv[]) ircbot->init(minimal); script->init(minimal); itemdb->init(minimal); + clan->init(minimal); skill->init(minimal); if (!minimal) map->read_zone_db();/* read after item and skill initialization */ diff --git a/src/map/map.h b/src/map/map.h index fab8839d8..facf1d921 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -352,6 +352,7 @@ STATIC_ASSERT(((MAPID_1_1_MAX - 1) | MAPID_BASEMASK) == MAPID_BASEMASK, "First c || map->list[m].flag.gvg \ || ((map->agit_flag || map->agit2_flag) && map->list[m].flag.gvg_castle) \ || map->list[m].flag.battleground \ + || map->list[m].flag.cvc \ ) // Specifies maps that have special GvG/WoE restrictions #define map_flag_gvg(m) (map->list[m].flag.gvg || ((map->agit_flag || map->agit2_flag) && map->list[m].flag.gvg_castle)) @@ -737,6 +738,7 @@ enum map_zone_merge_type { #define MAP_ZONE_PVP_NAME "PvP" #define MAP_ZONE_GVG_NAME "GvG" #define MAP_ZONE_BG_NAME "Battlegrounds" +#define MAP_ZONE_CVC_NAME "CvC" #define MAP_ZONE_PK_NAME "PK Mode" #define MAP_ZONE_MAPFLAG_LENGTH 50 @@ -823,6 +825,7 @@ struct map_data { unsigned gvg_dungeon : 1; // Celest unsigned gvg_noparty : 1; unsigned battleground : 2; // [BattleGround System] + unsigned cvc : 1; unsigned nozenypenalty : 1; unsigned notrade : 1; unsigned noskill : 1; diff --git a/src/map/mob.h b/src/map/mob.h index 98d64873b..3d1b3aadf 100644 --- a/src/map/mob.h +++ b/src/map/mob.h @@ -208,6 +208,7 @@ struct mob_data { int target_id,attacked_id; int areanpc_id; //Required in OnTouchNPC (to avoid multiple area touchs) unsigned int bg_id; // BattleGround System + int clan_id; // Clan System int64 next_walktime, last_thinktime, last_linktime, last_pcneartime, dmgtick; short move_fail_count; diff --git a/src/map/npc.c b/src/map/npc.c index d3dfb39d2..94ab57bd9 100644 --- a/src/map/npc.c +++ b/src/map/npc.c @@ -25,6 +25,7 @@ #include "map/battle.h" #include "map/chat.h" +#include "map/clan.h" #include "map/clif.h" #include "map/guild.h" #include "map/instance.h" @@ -4144,6 +4145,11 @@ const char *npc_parse_mapflag(const char *w1, const char *w2, const char *w3, co ShowWarning("npc_parse_mapflag: You can't set PvP and GvG flags for the same map! Removing GvG flags from %s in file '%s', line '%d'.\n", map->list[m].name, filepath, strline(buffer,start-buffer)); if (retval) *retval = EXIT_FAILURE; } + if (state && map->list[m].flag.cvc) { + map->list[m].flag.cvc = 0; + ShowWarning("npc_parse_mapflag: You can't set CvC and PvP flags for the same map! Removing CvC flag from %s in file '%s', line '%d'.\n", map->list[m].name, filepath, strline(buffer, start-buffer)); + if (retval) *retval = EXIT_FAILURE; + } if( state && map->list[m].flag.battleground ) { map->list[m].flag.battleground = 0; ShowWarning("npc_parse_mapflag: You can't set PvP and BattleGround flags for the same map! Removing BattleGround flag from %s in file '%s', line '%d'.\n", map->list[m].name, filepath, strline(buffer,start-buffer)); @@ -4196,6 +4202,11 @@ const char *npc_parse_mapflag(const char *w1, const char *w2, const char *w3, co ShowWarning("npc_parse_mapflag: You can't set PvP and GvG flags for the same map! Removing PvP flag from %s in file '%s', line '%d'.\n", map->list[m].name, filepath, strline(buffer,start-buffer)); if (retval) *retval = EXIT_FAILURE; } + if (state && map->list[m].flag.cvc) { + map->list[m].flag.cvc = 0; + ShowWarning("npc_parse_mapflag: You can't set CvC and GvG flags for the same map! Removing CvC flag from %s in file '%s', line '%d'.\n", map->list[m].name, filepath, strline(buffer, start-buffer)); + if (retval) *retval = EXIT_FAILURE; + } if( state && map->list[m].flag.battleground ) { map->list[m].flag.battleground = 0; ShowWarning("npc_parse_mapflag: You can't set GvG and BattleGround flags for the same map! Removing BattleGround flag from %s in file '%s', line '%d'.\n", map->list[m].name, filepath, strline(buffer,start-buffer)); @@ -4238,11 +4249,47 @@ const char *npc_parse_mapflag(const char *w1, const char *w2, const char *w3, co ShowWarning("npc_parse_mapflag: You can't set GvG and BattleGround flags for the same map! Removing GvG flag from %s in file '%s', line '%d'.\n", map->list[m].name, filepath, strline(buffer,start-buffer)); if (retval) *retval = EXIT_FAILURE; } + if (map->list[m].flag.cvc) { + map->list[m].flag.cvc = 0; + ShowWarning("npc_parse_mapflag: You can't set CvC and BattleGround flags for the same map! Removing CvC flag from %s in file '%s', line '%d'.\n", map->list[m].name, filepath, strline(buffer, start-buffer)); + if (retval) *retval = EXIT_FAILURE; + } if( state && (zone = strdb_get(map->zone_db, MAP_ZONE_BG_NAME)) != NULL && map->list[m].zone != zone ) { map->zone_change(m,zone,start,buffer,filepath); } } + else if (!strcmpi(w3, "cvc")) { + struct map_zone_data *zone; + + map->list[m].flag.cvc = state; + if (state && (map->list[m].flag.gvg || map->list[m].flag.gvg_dungeon || map->list[m].flag.gvg_castle)) { + map->list[m].flag.gvg = 0; + map->list[m].flag.gvg_dungeon = 0; + map->list[m].flag.gvg_castle = 0; + ShowWarning("npc_parse_mapflag: You can't set GvG and CvC flags for the same map! Removing GvG flag from %s in file '%s', line '%d'.\n", map->list[m].name, filepath, strline(buffer, start-buffer)); + if (retval) { + *retval = EXIT_FAILURE; + } + } + if (state && map->list[m].flag.pvp) { + map->list[m].flag.pvp = 0; + ShowWarning("npc_parse_mapflag: You can't set PvP and CvC flags for the same map! Removing PvP flag from %s in file '%s', line '%d'.\n", map->list[m].name, filepath, strline(buffer, start-buffer)); + if (retval) { + *retval = EXIT_FAILURE; + } + } + if (state && map->list[m].flag.battleground) { + map->list[m].flag.battleground = 0; + ShowWarning("npc_parse_mapflag: You can't set CvC and BattleGround flags for the same map! Removing BattleGround flag from %s in file '%s', line '%d'.\n", map->list[m].name, filepath, strline(buffer, start-buffer)); + if (retval) { + *retval = EXIT_FAILURE; + } + } + if (state && (zone = strdb_get(map->zone_db, MAP_ZONE_CVC_NAME)) != NULL && map->list[m].zone != zone) { + map->zone_change(m, zone, start, buffer, filepath); + } + } else if (!strcmpi(w3,"noexppenalty")) map->list[m].flag.noexppenalty=state; else if (!strcmpi(w3,"nozenypenalty")) @@ -4887,6 +4934,7 @@ int npc_reload(void) { // Reprocess npc files and reload constants itemdb->name_constants(); + clan->set_constants(); npc_process_files( npc_new_min ); instance->reload(); @@ -5026,6 +5074,7 @@ int do_init_npc(bool minimal) { // Should be loaded before npc processing, otherwise labels could overwrite constant values // and lead to undefined behavior [Panikon] itemdb->name_constants(); + clan->set_constants(); if (!minimal) { npc->timer_event_ers = ers_new(sizeof(struct timer_event_data),"clif.c::timer_event_ers",ERS_OPT_NONE); diff --git a/src/map/npc.h b/src/map/npc.h index 8bb38f252..64a2b3a51 100644 --- a/src/map/npc.h +++ b/src/map/npc.h @@ -83,6 +83,8 @@ struct npc_data { uint8 dir; uint8 area_size; + int clan_id; + unsigned size : 2; struct status_data status; diff --git a/src/map/packets.h b/src/map/packets.h index 451acce47..b90413793 100644 --- a/src/map/packets.h +++ b/src/map/packets.h @@ -2179,6 +2179,12 @@ packet(0x96e,-1,clif->ackmergeitems); packet(0x0960,5,clif->pChangeDir,2,4); // CZ_CHANGE_DIRECTION #endif +//2012-07-02 +#if PACKETVER >= 20120702 +// new packets + packet(0x098a, -1); // ZC_CLANINFO +#endif + //2012-07-10 #if PACKETVER >= 20120710 packet(0x0886,2,clif->pReqCloseBuyingStore,0); // CZ_REQ_CLOSE_BUYING_STORE @@ -2218,6 +2224,15 @@ packet(0x96e,-1,clif->ackmergeitems); packet(0x0436,4,clif->pDull); // CZ_GANGSI_RANK #endif +//2012-07-16aRagExe +#if PACKETVER >= 20120716 +// new packets + packet(0x0988, 6); // ZC_NOTIFY_CLAN_CONNECTINFO + packet(0x0989, 2); // ZC_ACK_CLAN_LEAVE + packet(0x098d, -1, clif->pClanMessage, 2, 4); // CZ_CLAN_CHAT + packet(0x098e, -1); // ZC_NOTIFY_CLAN_CHAT +#endif + // 2012-09-25aRagexe #if PACKETVER >= 20120925 // new packets (not all) diff --git a/src/map/packets_struct.h b/src/map/packets_struct.h index 1105bec96..2a65eb6cf 100644 --- a/src/map/packets_struct.h +++ b/src/map/packets_struct.h @@ -349,6 +349,14 @@ enum packet_headers { partymemberinfo = 0x01e9, partyinfo = 0x00fb, #endif +#if PACKETVER >= 20120702 + clanBasicInfo = 0x098A, ///< ZC_CLANINFO +#endif +#if PACKETVER >= 20120716 + clanOnlineCount = 0x0988, ///< ZC_NOTIFY_CLAN_CONNECTINFO + clanLeave = 0x0989, ///< ZC_ACK_CLAN_LEAVE + clanMessage = 0x098E, ///< ZC_NOTIFY_CLAN_CHAT +#endif }; #if !defined(sun) && (!defined(__NETBSD__) || __NetBSD_Version__ >= 600000000) // NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute @@ -1562,6 +1570,34 @@ struct PACKET_ZC_GROUP_LIST { struct PACKET_ZC_GROUP_LIST_SUB members[]; } __attribute__((packed)); +struct PACKET_ZC_CLANINFO { + int16 PacketType; + int16 PacketLength; + uint32 ClanID; + char ClanName[NAME_LENGTH]; + char MasterName[NAME_LENGTH]; + char Map[MAP_NAME_LENGTH_EXT]; + uint8 AllyCount; + uint8 AntagonistCount; +} __attribute__((packed)); + +struct PACKET_ZC_NOTIFY_CLAN_CONNECTINFO { + int16 PacketType; + int16 NumConnect; + int16 NumTotal; +} __attribute__((packed)); + +struct PACKET_ZC_ACK_CLAN_LEAVE { + int16 PacketType; +} __attribute__((packed)); + +struct PACKET_ZC_NOTIFY_CLAN_CHAT { + int16 PacketType; + int16 PacketLength; + char MemberName[NAME_LENGTH]; + char Message[]; +} __attribute__((packed)); + #if !defined(sun) && (!defined(__NETBSD__) || __NetBSD_Version__ >= 600000000) // NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute #pragma pack(pop) #endif // not NetBSD < 6 / Solaris diff --git a/src/map/pc.c b/src/map/pc.c index 449cb25d3..c18fdee9e 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -29,6 +29,7 @@ #include "map/channel.h" #include "map/chat.h" #include "map/chrif.h" +#include "map/clan.h" #include "map/clif.h" #include "map/date.h" // is_day_of_*() #include "map/duel.h" @@ -1523,6 +1524,12 @@ int pc_reg_received(struct map_session_data *sd) status_calc_pc(sd,SCO_FIRST|SCO_FORCE); chrif->scdata_request(sd->status.account_id, sd->status.char_id); + + if (sd->status.clan_id) + clan->member_online(sd, true); + + //Auth is fully okay, update last_login + sd->status.last_login = time(NULL); // Storage Request intif->request_account_storage(sd); diff --git a/src/map/pc.h b/src/map/pc.h index df0df979d..a01152df5 100644 --- a/src/map/pc.h +++ b/src/map/pc.h @@ -443,6 +443,7 @@ END_ZEROED_BLOCK; int party_invite, party_invite_account; // for handling party invitation (holds party id and account id) int adopt_invite; // Adoption struct guild *guild;/* [Ind/Hercules] speed everything up */ + struct clan *clan; int guild_invite,guild_invite_account; int guild_emblem_id,guild_alliance,guild_alliance_account; short guild_x,guild_y; // For guildmate position display. [Skotlex] should be short [zzo] diff --git a/src/map/script.c b/src/map/script.c index fc304d4ff..36f37abb9 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -29,6 +29,7 @@ #include "map/channel.h" #include "map/chat.h" #include "map/chrif.h" +#include "map/clan.h" #include "map/clif.h" #include "map/date.h" #include "map/elemental.h" @@ -5593,6 +5594,8 @@ int script_reload(void) itemdb->name_constants(); + clan->set_constants(); + sysinfo->vcsrevision_reload(); return 0; @@ -8627,32 +8630,45 @@ BUILDIN(readparam) { * 2 : guild_id * 3 : account_id * 4 : bg_id + * 5 : clan_id *------------------------------------------*/ BUILDIN(getcharid) { - int num; + int num = script_getnum(st, 2); struct map_session_data *sd; - - num = script_getnum(st,2); - if( script_hasdata(st,3) ) - sd=map->nick2sd(script_getstr(st,3)); + + if (script_hasdata(st, 3)) + sd = map->nick2sd(script_getstr(st, 3)); else - sd=script->rid2sd(st); + sd = script->rid2sd(st); - if(sd==NULL) { - script_pushint(st,0); //return 0, according docs + if (sd == NULL) { + script_pushint(st, 0); //return 0, according docs return true; } - switch( num ) { - case 0: script_pushint(st,sd->status.char_id); break; - case 1: script_pushint(st,sd->status.party_id); break; - case 2: script_pushint(st,sd->status.guild_id); break; - case 3: script_pushint(st,sd->status.account_id); break; - case 4: script_pushint(st,sd->bg_id); break; - default: - ShowError("buildin_getcharid: invalid parameter (%d).\n", num); - script_pushint(st,0); - break; + switch (num) { + case 0: + script_pushint(st, sd->status.char_id); + break; + case 1: + script_pushint(st, sd->status.party_id); + break; + case 2: + script_pushint(st, sd->status.guild_id); + break; + case 3: + script_pushint(st, sd->status.account_id); + break; + case 4: + script_pushint(st, sd->bg_id); + break; + case 5: + script_pushint(st, sd->status.clan_id); + break; + default: + ShowError("buildin_getcharid: invalid parameter (%d).\n", num); + script_pushint(st, 0); + break; } return true; @@ -8900,10 +8916,12 @@ BUILDIN(getguildmember) * 1 : party_name or "" * 2 : guild_name or "" * 3 : map_name + * 4 : clan_name or "" * - : "" *------------------------------------------*/ BUILDIN(strcharinfo) { + struct clan *c; struct guild* g; struct party_data* p; struct map_session_data *sd; @@ -8943,6 +8961,13 @@ BUILDIN(strcharinfo) case 3: script_pushconststr(st, map->list[sd->bl.m].name); break; + case 4: + if ((c = sd->clan) != NULL) { + script_pushstrcopy(st, c->name); + } else { + script_pushconststr(st, ""); + } + break; default: ShowWarning("script:strcharinfo: unknown parameter.\n"); script_pushconststr(st, ""); @@ -23860,6 +23885,85 @@ BUILDIN(rodex_sendmail2) return true; } +/** + * Clan System: Add a player to a clan + */ +BUILDIN(clan_join) +{ + struct map_session_data *sd = NULL; + int clan_id = script_getnum(st, 2); + + if (script_hasdata(st, 3)) + sd = map->id2sd(script_getnum(st, 3)); + else + sd = map->id2sd(st->rid); + + if (sd == NULL) { + script_pushint(st, false); + return false; + } + + if (clan->join(sd, clan_id)) + script_pushint(st, true); + else + script_pushint(st, false); + + return true; +} + +/** + * Clan System: Remove a player from clan + */ +BUILDIN(clan_leave) +{ + struct map_session_data *sd = NULL; + + if (script_hasdata(st, 2)) + sd = map->id2sd(script_getnum(st, 2)); + else + sd = map->id2sd(st->rid); + + if (sd == NULL) { + script_pushint(st, false); + return false; + } + + if (clan->leave(sd, false)) + script_pushint(st, true); + else + script_pushint(st, false); + + return true; +} + +/** + * Clan System: Show clan emblem next to npc name + */ +BUILDIN(clan_master) +{ + struct npc_data *nd = map->id2nd(st->oid); + int clan_id = script_getnum(st, 2); + + if (nd == NULL) { + script_pushint(st, false); + return false; + } else if (clan_id <= 0) { + script_pushint(st, false); + ShowError("buildin_clan_master: Received Invalid Clan ID %d\n", clan_id); + return false; + } else if (clan->search(clan_id) == NULL) { + script_pushint(st, false); + ShowError("buildin_clan_master: Received Id of a nonexistent Clan. Id: %d\n", clan_id); + return false; + } + + nd->clan_id = clan_id; + clif->sc_load(&nd->bl, nd->bl.id, AREA, status->dbs->IconChangeTable[SC_CLAN_INFO], 0, clan_id, 0); + + script_pushint(st, true); + return true; +} + /** * Adds a built-in script function. * @@ -24556,6 +24660,11 @@ void script_parse_builtin(void) { /* Navigation */ BUILDIN_DEF(navigateto, "s??????"), + /* Clan System */ + BUILDIN_DEF(clan_join,"i?"), + BUILDIN_DEF(clan_leave,"?"), + BUILDIN_DEF(clan_master,"i"), + BUILDIN_DEF(channelmes, "ss"), BUILDIN_DEF(addchannelhandler, "ss"), BUILDIN_DEF(removechannelhandler, "ss"), diff --git a/src/map/skill.c b/src/map/skill.c index 4c9e83579..3d541bf76 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -26,6 +26,7 @@ #include "map/battle.h" #include "map/battleground.h" #include "map/chrif.h" +#include "map/clan.h" #include "map/clif.h" #include "map/date.h" #include "map/elemental.h" @@ -17180,6 +17181,7 @@ struct skill_unit_group* skill_initunitgroup (struct block_list* src, int count, group->party_id = status->get_party_id(src); group->guild_id = status->get_guild_id(src); group->bg_id = bg->team_get_id(src); + group->clan_id = clan->get_id(src); group->group_id = skill->get_new_group_id(); CREATE(group->unit.data, struct skill_unit, count); group->unit.count = count; diff --git a/src/map/skill.h b/src/map/skill.h index c494c0e83..bd4d82df2 100644 --- a/src/map/skill.h +++ b/src/map/skill.h @@ -1774,6 +1774,7 @@ struct skill_unit_group { int party_id; int guild_id; int bg_id; + int clan_id; int map; int target_flag; //Holds BCT_* flag for battle_check_target int bl_flag; //Holds BL_* flag for map_foreachin* functions diff --git a/src/map/status.c b/src/map/status.c index 9e578bc12..3bb511970 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -25,6 +25,7 @@ #include "map/battle.h" #include "map/chrif.h" +#include "map/clan.h" #include "map/clif.h" #include "map/elemental.h" #include "map/guild.h" @@ -1019,6 +1020,9 @@ void initChangeTables(void) // Summoner status->dbs->IconChangeTable[SC_SPRITEMABLE] = SI_SPRITEMABLE; + // Clan System + status->dbs->IconChangeTable[SC_CLAN_INFO] = SI_CLAN_INFO; + // RoDEX status->dbs->IconChangeTable[SC_DAILYSENDMAILCNT] = SI_DAILYSENDMAILCNT; @@ -1181,6 +1185,9 @@ void initChangeTables(void) status->dbs->ChangeFlagTable[SC_MVPCARD_ORCHERO] |= SCB_ALL; status->dbs->ChangeFlagTable[SC_MVPCARD_ORCLORD] |= SCB_ALL; + // Clan System + status->dbs->ChangeFlagTable[SC_CLAN_INFO] |= SCB_NONE; + // Costumes status->dbs->ChangeFlagTable[SC_DRESS_UP] |= SCB_NONE; status->dbs->ChangeFlagTable[SC_MOONSTAR] |= SCB_NONE; @@ -2685,6 +2692,12 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt) status->current_equip_option_index = -1; status->current_equip_item_index = -1; + // Clan Buffs + if (sd->status.clan_id > 0) { + struct clan *c = clan->search(sd->status.clan_id); + clan->buff_start(sd, c); + } + status->calc_pc_additional(sd, opt); if( sd->pd ) { // Pet Bonus @@ -9726,6 +9739,11 @@ void status_change_start_display(struct map_session_data *sd, enum sc_type type, case SC_ALL_RIDING: dval1 = 1; break; + case SC_CLAN_INFO: + dval1 = val1; + dval2 = val2; + dval3 = val3; + break; default: /* all others: just copy val1 */ dval1 = val1; break; @@ -9745,6 +9763,9 @@ int status_get_val_flag(enum sc_type type) { int val_flag = 0; switch (type) { + case SC_CLAN_INFO: + val_flag |= 1 | 2; + break; case SC_FIGHTINGSPIRIT: val_flag |= 1 | 2; break; diff --git a/src/map/status.h b/src/map/status.h index e9c2218e8..66e773720 100644 --- a/src/map/status.h +++ b/src/map/status.h @@ -845,6 +845,9 @@ typedef enum sc_type { // Rodex SC_DAILYSENDMAILCNT, + + // Clan System + SC_CLAN_INFO, #ifndef SC_MAX SC_MAX, //Automatically updated max, used in for's to check we are within bounds. #endif diff --git a/src/map/unit.c b/src/map/unit.c index 0b5b21caf..6e98fc093 100644 --- a/src/map/unit.c +++ b/src/map/unit.c @@ -27,6 +27,7 @@ #include "map/battleground.h" #include "map/chat.h" #include "map/chrif.h" +#include "map/clan.h" #include "map/clif.h" #include "map/duel.h" #include "map/elemental.h" @@ -2725,6 +2726,7 @@ int unit_free(struct block_list *bl, clr_type clrtype) map->foreachpc(clif->friendslist_toggle_sub, sd->status.account_id, sd->status.char_id, 0); party->send_logout(sd); guild->send_memberinfoshort(sd,0); + clan->member_offline(sd); pc->cleareventtimer(sd); pc->inventory_rental_clear(sd); pc->delspiritball(sd,sd->spiritball,1); diff --git a/src/plugins/HPMHooking.c b/src/plugins/HPMHooking.c index 6d6184402..99b4e63e7 100644 --- a/src/plugins/HPMHooking.c +++ b/src/plugins/HPMHooking.c @@ -46,6 +46,7 @@ PRAGMA_GCC5(GCC diagnostic ignored "-Wdiscarded-qualifiers") #include "char/char.h" #include "char/geoip.h" #include "char/int_auction.h" +#include "char/int_clan.h" #include "char/int_elemental.h" #include "char/int_guild.h" #include "char/int_homun.h" @@ -73,6 +74,7 @@ PRAGMA_GCC5(GCC diagnostic ignored "-Wdiscarded-qualifiers") #include "map/channel.h" #include "map/chat.h" #include "map/chrif.h" +#include "map/clan.h" #include "map/clif.h" #include "map/duel.h" #include "map/elemental.h" diff --git a/vcproj-11/char-server.vcxproj b/vcproj-11/char-server.vcxproj index 17c1ab847..593862d8a 100644 --- a/vcproj-11/char-server.vcxproj +++ b/vcproj-11/char-server.vcxproj @@ -176,6 +176,7 @@ + @@ -229,6 +230,7 @@ + diff --git a/vcproj-11/char-server.vcxproj.filters b/vcproj-11/char-server.vcxproj.filters index ba5914a89..af34d2efd 100644 --- a/vcproj-11/char-server.vcxproj.filters +++ b/vcproj-11/char-server.vcxproj.filters @@ -70,6 +70,9 @@ char + + char + char @@ -219,6 +222,9 @@ char + + char + char diff --git a/vcproj-11/map-server.vcxproj b/vcproj-11/map-server.vcxproj index c09d5293a..21cae3626 100644 --- a/vcproj-11/map-server.vcxproj +++ b/vcproj-11/map-server.vcxproj @@ -176,6 +176,7 @@ + @@ -253,6 +254,7 @@ + diff --git a/vcproj-11/map-server.vcxproj.filters b/vcproj-11/map-server.vcxproj.filters index e6b89b3e6..68117eebb 100644 --- a/vcproj-11/map-server.vcxproj.filters +++ b/vcproj-11/map-server.vcxproj.filters @@ -19,6 +19,9 @@ map + + map + map @@ -228,6 +231,9 @@ map + + map + map diff --git a/vcproj-12/char-server.vcxproj b/vcproj-12/char-server.vcxproj index 02457b05f..3baf26e37 100644 --- a/vcproj-12/char-server.vcxproj +++ b/vcproj-12/char-server.vcxproj @@ -175,6 +175,7 @@ + @@ -228,6 +229,7 @@ + diff --git a/vcproj-12/char-server.vcxproj.filters b/vcproj-12/char-server.vcxproj.filters index ba5914a89..af34d2efd 100644 --- a/vcproj-12/char-server.vcxproj.filters +++ b/vcproj-12/char-server.vcxproj.filters @@ -70,6 +70,9 @@ char + + char + char @@ -219,6 +222,9 @@ char + + char + char diff --git a/vcproj-12/map-server.vcxproj b/vcproj-12/map-server.vcxproj index 49822db0d..64219657f 100644 --- a/vcproj-12/map-server.vcxproj +++ b/vcproj-12/map-server.vcxproj @@ -176,6 +176,7 @@ + @@ -253,6 +254,7 @@ + diff --git a/vcproj-12/map-server.vcxproj.filters b/vcproj-12/map-server.vcxproj.filters index e6b89b3e6..68117eebb 100644 --- a/vcproj-12/map-server.vcxproj.filters +++ b/vcproj-12/map-server.vcxproj.filters @@ -19,6 +19,9 @@ map + + map + map @@ -228,6 +231,9 @@ map + + map + map diff --git a/vcproj-14/char-server.vcxproj b/vcproj-14/char-server.vcxproj index f2fc4682c..a766d504d 100644 --- a/vcproj-14/char-server.vcxproj +++ b/vcproj-14/char-server.vcxproj @@ -174,6 +174,7 @@ + @@ -227,6 +228,7 @@ + diff --git a/vcproj-14/char-server.vcxproj.filters b/vcproj-14/char-server.vcxproj.filters index ba5914a89..af34d2efd 100644 --- a/vcproj-14/char-server.vcxproj.filters +++ b/vcproj-14/char-server.vcxproj.filters @@ -70,6 +70,9 @@ char + + char + char @@ -219,6 +222,9 @@ char + + char + char diff --git a/vcproj-14/map-server.vcxproj b/vcproj-14/map-server.vcxproj index e20d13462..1c34a82fe 100644 --- a/vcproj-14/map-server.vcxproj +++ b/vcproj-14/map-server.vcxproj @@ -174,6 +174,7 @@ + @@ -251,6 +252,7 @@ + diff --git a/vcproj-14/map-server.vcxproj.filters b/vcproj-14/map-server.vcxproj.filters index e6b89b3e6..a920fc48b 100644 --- a/vcproj-14/map-server.vcxproj.filters +++ b/vcproj-14/map-server.vcxproj.filters @@ -208,6 +208,9 @@ map + + map + @@ -468,6 +471,9 @@ map + + map + -- cgit v1.2.3-70-g09d2 From 587dd19c0269b3c8089838a5442260a185b19ead Mon Sep 17 00:00:00 2001 From: Murilo Pereti Tavares Date: Thu, 25 Jan 2018 01:17:38 -0200 Subject: HPM Hooks Update --- src/common/HPMDataCheck.h | 18 + src/common/HPMSymbols.inc.h | 14 + src/plugins/HPMHooking/HPMHooking.Defs.inc | 84 ++ .../HPMHooking/HPMHooking_char.HPMHooksCore.inc | 21 + .../HPMHooking/HPMHooking_char.HookingPoints.inc | 6 + src/plugins/HPMHooking/HPMHooking_char.Hooks.inc | 136 +++ src/plugins/HPMHooking/HPMHooking_char.sources.inc | 1 + .../HPMHooking/HPMHooking_map.HPMHooksCore.inc | 141 ++++ .../HPMHooking/HPMHooking_map.HookingPoints.inc | 36 + src/plugins/HPMHooking/HPMHooking_map.Hooks.inc | 933 +++++++++++++++++++++ src/plugins/HPMHooking/HPMHooking_map.sources.inc | 1 + 11 files changed, 1391 insertions(+) diff --git a/src/common/HPMDataCheck.h b/src/common/HPMDataCheck.h index 97a772b6e..f2812a275 100644 --- a/src/common/HPMDataCheck.h +++ b/src/common/HPMDataCheck.h @@ -61,6 +61,11 @@ HPExport const struct s_HPMDataCheck HPMDataCheck[] = { #else #define CHAR_INT_AUCTION_H #endif // CHAR_INT_AUCTION_H + #ifdef CHAR_INT_CLAN_H + { "inter_clan_interface", sizeof(struct inter_clan_interface), SERVER_TYPE_CHAR }, + #else + #define CHAR_INT_CLAN_H + #endif // CHAR_INT_CLAN_H #ifdef CHAR_INT_ELEMENTAL_H { "inter_elemental_interface", sizeof(struct inter_elemental_interface), SERVER_TYPE_CHAR }, #else @@ -194,6 +199,10 @@ HPExport const struct s_HPMDataCheck HPMDataCheck[] = { #endif // COMMON_MEMMGR_H #ifdef COMMON_MMO_H { "auction_data", sizeof(struct auction_data), SERVER_TYPE_ALL }, + { "clan", sizeof(struct clan), SERVER_TYPE_ALL }, + { "clan_buff", sizeof(struct clan_buff), SERVER_TYPE_ALL }, + { "clan_member", sizeof(struct clan_member), SERVER_TYPE_ALL }, + { "clan_relationship", sizeof(struct clan_relationship), SERVER_TYPE_ALL }, { "fame_list", sizeof(struct fame_list), SERVER_TYPE_ALL }, { "guild", sizeof(struct guild), SERVER_TYPE_ALL }, { "guild_alliance", sizeof(struct guild_alliance), SERVER_TYPE_ALL }, @@ -394,6 +403,11 @@ HPExport const struct s_HPMDataCheck HPMDataCheck[] = { #else #define MAP_CHRIF_H #endif // MAP_CHRIF_H + #ifdef MAP_CLAN_H + { "clan_interface", sizeof(struct clan_interface), SERVER_TYPE_MAP }, + #else + #define MAP_CLAN_H + #endif // MAP_CLAN_H #ifdef MAP_CLIF_H { "cdelayed_damage", sizeof(struct cdelayed_damage), SERVER_TYPE_MAP }, { "clif_interface", sizeof(struct clif_interface), SERVER_TYPE_MAP }, @@ -565,6 +579,7 @@ HPExport const struct s_HPMDataCheck HPMDataCheck[] = { { "PACKET_CZ_REQ_REMOVE_ITEM_MAIL", sizeof(struct PACKET_CZ_REQ_REMOVE_ITEM_MAIL), SERVER_TYPE_MAP }, { "PACKET_CZ_REQ_ZENY_FROM_MAIL", sizeof(struct PACKET_CZ_REQ_ZENY_FROM_MAIL), SERVER_TYPE_MAP }, { "PACKET_CZ_SEND_MAIL", sizeof(struct PACKET_CZ_SEND_MAIL), SERVER_TYPE_MAP }, + { "PACKET_ZC_ACK_CLAN_LEAVE", sizeof(struct PACKET_ZC_ACK_CLAN_LEAVE), SERVER_TYPE_MAP }, { "PACKET_ZC_ACK_DELETE_MAIL", sizeof(struct PACKET_ZC_ACK_DELETE_MAIL), SERVER_TYPE_MAP }, { "PACKET_ZC_ACK_ITEM_FROM_MAIL", sizeof(struct PACKET_ZC_ACK_ITEM_FROM_MAIL), SERVER_TYPE_MAP }, { "PACKET_ZC_ACK_OPEN_WRITE_MAIL", sizeof(struct PACKET_ZC_ACK_OPEN_WRITE_MAIL), SERVER_TYPE_MAP }, @@ -573,9 +588,12 @@ HPExport const struct s_HPMDataCheck HPMDataCheck[] = { { "PACKET_ZC_ADD_ITEM_TO_MAIL", sizeof(struct PACKET_ZC_ADD_ITEM_TO_MAIL), SERVER_TYPE_MAP }, { "PACKET_ZC_ADD_MEMBER_TO_GROUP", sizeof(struct PACKET_ZC_ADD_MEMBER_TO_GROUP), SERVER_TYPE_MAP }, { "PACKET_ZC_CHECKNAME", sizeof(struct PACKET_ZC_CHECKNAME), SERVER_TYPE_MAP }, + { "PACKET_ZC_CLANINFO", sizeof(struct PACKET_ZC_CLANINFO), SERVER_TYPE_MAP }, { "PACKET_ZC_GROUP_LIST", sizeof(struct PACKET_ZC_GROUP_LIST), SERVER_TYPE_MAP }, { "PACKET_ZC_GROUP_LIST_SUB", sizeof(struct PACKET_ZC_GROUP_LIST_SUB), SERVER_TYPE_MAP }, { "PACKET_ZC_MAIL_LIST", sizeof(struct PACKET_ZC_MAIL_LIST), SERVER_TYPE_MAP }, + { "PACKET_ZC_NOTIFY_CLAN_CHAT", sizeof(struct PACKET_ZC_NOTIFY_CLAN_CHAT), SERVER_TYPE_MAP }, + { "PACKET_ZC_NOTIFY_CLAN_CONNECTINFO", sizeof(struct PACKET_ZC_NOTIFY_CLAN_CONNECTINFO), SERVER_TYPE_MAP }, { "PACKET_ZC_NOTIFY_UNREADMAIL", sizeof(struct PACKET_ZC_NOTIFY_UNREADMAIL), SERVER_TYPE_MAP }, { "PACKET_ZC_READ_MAIL", sizeof(struct PACKET_ZC_READ_MAIL), SERVER_TYPE_MAP }, { "PACKET_ZC_SKILL_SCALE", sizeof(struct PACKET_ZC_SKILL_SCALE), SERVER_TYPE_MAP }, diff --git a/src/common/HPMSymbols.inc.h b/src/common/HPMSymbols.inc.h index 58540ee36..6be9d547c 100644 --- a/src/common/HPMSymbols.inc.h +++ b/src/common/HPMSymbols.inc.h @@ -53,6 +53,9 @@ struct chat_interface *chat; #ifdef MAP_CHRIF_H /* chrif */ struct chrif_interface *chrif; #endif // MAP_CHRIF_H +#ifdef MAP_CLAN_H /* clan */ +struct clan_interface *clan; +#endif // MAP_CLAN_H #ifdef MAP_CLIF_H /* clif */ struct clif_interface *clif; #endif // MAP_CLIF_H @@ -98,6 +101,9 @@ struct instance_interface *instance; #ifdef CHAR_INT_AUCTION_H /* inter_auction */ struct inter_auction_interface *inter_auction; #endif // CHAR_INT_AUCTION_H +#ifdef CHAR_INT_CLAN_H /* inter_clan */ +struct inter_clan_interface *inter_clan; +#endif // CHAR_INT_CLAN_H #ifdef CHAR_INT_ELEMENTAL_H /* inter_elemental */ struct inter_elemental_interface *inter_elemental; #endif // CHAR_INT_ELEMENTAL_H @@ -315,6 +321,10 @@ HPExport const char *HPM_shared_symbols(int server_type) if ((server_type&(SERVER_TYPE_MAP)) != 0 && !HPM_SYMBOL("chrif", chrif)) return "chrif"; #endif // MAP_CHRIF_H +#ifdef MAP_CLAN_H /* clan */ + if ((server_type&(SERVER_TYPE_MAP)) != 0 && !HPM_SYMBOL("clan", clan)) + return "clan"; +#endif // MAP_CLAN_H #ifdef MAP_CLIF_H /* clif */ if ((server_type&(SERVER_TYPE_MAP)) != 0 && !HPM_SYMBOL("clif", clif)) return "clif"; @@ -375,6 +385,10 @@ HPExport const char *HPM_shared_symbols(int server_type) if ((server_type&(SERVER_TYPE_CHAR)) != 0 && !HPM_SYMBOL("inter_auction", inter_auction)) return "inter_auction"; #endif // CHAR_INT_AUCTION_H +#ifdef CHAR_INT_CLAN_H /* inter_clan */ + if ((server_type&(SERVER_TYPE_CHAR)) != 0 && !HPM_SYMBOL("inter_clan", inter_clan)) + return "inter_clan"; +#endif // CHAR_INT_CLAN_H #ifdef CHAR_INT_ELEMENTAL_H /* inter_elemental */ if ((server_type&(SERVER_TYPE_CHAR)) != 0 && !HPM_SYMBOL("inter_elemental", inter_elemental)) return "inter_elemental"; diff --git a/src/plugins/HPMHooking/HPMHooking.Defs.inc b/src/plugins/HPMHooking/HPMHooking.Defs.inc index db578e59f..c293eb1f7 100644 --- a/src/plugins/HPMHooking/HPMHooking.Defs.inc +++ b/src/plugins/HPMHooking/HPMHooking.Defs.inc @@ -867,6 +867,62 @@ typedef void (*HPMHOOK_post_chrif_save_scdata_single) (int account_id, int char_ typedef void (*HPMHOOK_pre_chrif_del_scdata_single) (int *account_id, int *char_id, short *type); typedef void (*HPMHOOK_post_chrif_del_scdata_single) (int account_id, int char_id, short type); #endif // MAP_CHRIF_H +#ifdef MAP_CLAN_H /* clan */ +typedef void (*HPMHOOK_pre_clan_init) (bool *minimal); +typedef void (*HPMHOOK_post_clan_init) (bool minimal); +typedef void (*HPMHOOK_pre_clan_final) (void); +typedef void (*HPMHOOK_post_clan_final) (void); +typedef bool (*HPMHOOK_pre_clan_config_read) (bool *reload); +typedef bool (*HPMHOOK_post_clan_config_read) (bool retVal___, bool reload); +typedef void (*HPMHOOK_pre_clan_config_read_additional_settings) (struct config_setting_t **settings, const char **source); +typedef void (*HPMHOOK_post_clan_config_read_additional_settings) (struct config_setting_t *settings, const char *source); +typedef void (*HPMHOOK_pre_clan_read_db) (struct config_setting_t **settings, const char **source, bool *reload); +typedef void (*HPMHOOK_post_clan_read_db) (struct config_setting_t *settings, const char *source, bool reload); +typedef int (*HPMHOOK_pre_clan_read_db_sub) (struct config_setting_t **settings, const char **source, bool *reload); +typedef int (*HPMHOOK_post_clan_read_db_sub) (int retVal___, struct config_setting_t *settings, const char *source, bool reload); +typedef void (*HPMHOOK_pre_clan_read_db_additional_fields) (struct clan **entry, struct config_setting_t **t, int *n, const char **source); +typedef void (*HPMHOOK_post_clan_read_db_additional_fields) (struct clan *entry, struct config_setting_t *t, int n, const char *source); +typedef void (*HPMHOOK_pre_clan_read_buffs) (struct clan **c, struct config_setting_t **buff, const char **source); +typedef void (*HPMHOOK_post_clan_read_buffs) (struct clan *c, struct config_setting_t *buff, const char *source); +typedef struct clan* (*HPMHOOK_pre_clan_search) (int *clan_id); +typedef struct clan* (*HPMHOOK_post_clan_search) (struct clan* retVal___, int clan_id); +typedef struct clan* (*HPMHOOK_pre_clan_searchname) (const char **name); +typedef struct clan* (*HPMHOOK_post_clan_searchname) (struct clan* retVal___, const char *name); +typedef struct map_session_data* (*HPMHOOK_pre_clan_getonlinesd) (struct clan **c); +typedef struct map_session_data* (*HPMHOOK_post_clan_getonlinesd) (struct map_session_data* retVal___, struct clan *c); +typedef int (*HPMHOOK_pre_clan_getindex) (const struct clan **c, int *char_id); +typedef int (*HPMHOOK_post_clan_getindex) (int retVal___, const struct clan *c, int char_id); +typedef bool (*HPMHOOK_pre_clan_join) (struct map_session_data **sd, int *clan_id); +typedef bool (*HPMHOOK_post_clan_join) (bool retVal___, struct map_session_data *sd, int clan_id); +typedef void (*HPMHOOK_pre_clan_member_online) (struct map_session_data **sd, bool *first); +typedef void (*HPMHOOK_post_clan_member_online) (struct map_session_data *sd, bool first); +typedef bool (*HPMHOOK_pre_clan_leave) (struct map_session_data **sd, bool *first); +typedef bool (*HPMHOOK_post_clan_leave) (bool retVal___, struct map_session_data *sd, bool first); +typedef bool (*HPMHOOK_pre_clan_send_message) (struct map_session_data **sd, const char **mes); +typedef bool (*HPMHOOK_post_clan_send_message) (bool retVal___, struct map_session_data *sd, const char *mes); +typedef void (*HPMHOOK_pre_clan_recv_message) (struct clan **c, const char **mes, int *len); +typedef void (*HPMHOOK_post_clan_recv_message) (struct clan *c, const char *mes, int len); +typedef void (*HPMHOOK_pre_clan_member_offline) (struct map_session_data **sd); +typedef void (*HPMHOOK_post_clan_member_offline) (struct map_session_data *sd); +typedef void (*HPMHOOK_pre_clan_set_constants) (void); +typedef void (*HPMHOOK_post_clan_set_constants) (void); +typedef int (*HPMHOOK_pre_clan_get_id) (const struct block_list **bl); +typedef int (*HPMHOOK_post_clan_get_id) (int retVal___, const struct block_list *bl); +typedef void (*HPMHOOK_pre_clan_buff_start) (struct map_session_data **sd, struct clan **c); +typedef void (*HPMHOOK_post_clan_buff_start) (struct map_session_data *sd, struct clan *c); +typedef void (*HPMHOOK_pre_clan_buff_end) (struct map_session_data **sd, struct clan **c); +typedef void (*HPMHOOK_post_clan_buff_end) (struct map_session_data *sd, struct clan *c); +typedef void (*HPMHOOK_pre_clan_reload) (void); +typedef void (*HPMHOOK_post_clan_reload) (void); +typedef int (*HPMHOOK_pre_clan_rejoin) (struct map_session_data **sd, va_list ap); +typedef int (*HPMHOOK_post_clan_rejoin) (int retVal___, struct map_session_data *sd, va_list ap); +typedef int (*HPMHOOK_pre_clan_inactivity_kick) (int *tid, int64 *tick, int *id, intptr_t *data); +typedef int (*HPMHOOK_post_clan_inactivity_kick) (int retVal___, int tid, int64 tick, int id, intptr_t data); +typedef int (*HPMHOOK_pre_clan_request_kickoffline) (int *tid, int64 *tick, int *id, intptr_t *data); +typedef int (*HPMHOOK_post_clan_request_kickoffline) (int retVal___, int tid, int64 tick, int id, intptr_t data); +typedef int (*HPMHOOK_pre_clan_request_membercount) (int *tid, int64 *tick, int *id, intptr_t *data); +typedef int (*HPMHOOK_post_clan_request_membercount) (int retVal___, int tid, int64 tick, int id, intptr_t data); +#endif // MAP_CLAN_H #ifdef MAP_CLIF_H /* clif */ typedef int (*HPMHOOK_pre_clif_init) (bool *minimal); typedef int (*HPMHOOK_post_clif_init) (int retVal___, bool minimal); @@ -2298,6 +2354,16 @@ typedef void (*HPMHOOK_pre_clif_rodex_icon) (int *fd, bool *show); typedef void (*HPMHOOK_post_clif_rodex_icon) (int fd, bool show); typedef void (*HPMHOOK_pre_clif_skill_scale) (struct block_list **bl, int *src_id, int *x, int *y, uint16 *skill_id, uint16 *skill_lv, int *casttime); typedef void (*HPMHOOK_post_clif_skill_scale) (struct block_list *bl, int src_id, int x, int y, uint16 skill_id, uint16 skill_lv, int casttime); +typedef void (*HPMHOOK_pre_clif_clan_basicinfo) (struct map_session_data **sd); +typedef void (*HPMHOOK_post_clif_clan_basicinfo) (struct map_session_data *sd); +typedef void (*HPMHOOK_pre_clif_clan_onlinecount) (struct clan **c); +typedef void (*HPMHOOK_post_clif_clan_onlinecount) (struct clan *c); +typedef void (*HPMHOOK_pre_clif_clan_leave) (struct map_session_data **sd); +typedef void (*HPMHOOK_post_clif_clan_leave) (struct map_session_data *sd); +typedef void (*HPMHOOK_pre_clif_clan_message) (struct clan **c, const char **mes, int *len); +typedef void (*HPMHOOK_post_clif_clan_message) (struct clan *c, const char *mes, int len); +typedef void (*HPMHOOK_pre_clif_pClanMessage) (int *fd, struct map_session_data **sd); +typedef void (*HPMHOOK_post_clif_pClanMessage) (int fd, struct map_session_data *sd); #endif // MAP_CLIF_H #ifdef COMMON_CORE_H /* cmdline */ typedef void (*HPMHOOK_pre_cmdline_init) (void); @@ -2845,6 +2911,14 @@ typedef int (*HPMHOOK_post_inter_auction_sql_init) (int retVal___); typedef void (*HPMHOOK_pre_inter_auction_sql_final) (void); typedef void (*HPMHOOK_post_inter_auction_sql_final) (void); #endif // CHAR_INT_AUCTION_H +#ifdef CHAR_INT_CLAN_H /* inter_clan */ +typedef int (*HPMHOOK_pre_inter_clan_kick_inactive_members) (int *clan_id, int *kick_interval); +typedef int (*HPMHOOK_post_inter_clan_kick_inactive_members) (int retVal___, int clan_id, int kick_interval); +typedef int (*HPMHOOK_pre_inter_clan_count_members) (int *clan_id, int *kick_interval); +typedef int (*HPMHOOK_post_inter_clan_count_members) (int retVal___, int clan_id, int kick_interval); +typedef int (*HPMHOOK_pre_inter_clan_parse_frommap) (int *fd); +typedef int (*HPMHOOK_post_inter_clan_parse_frommap) (int retVal___, int fd); +#endif // CHAR_INT_CLAN_H #ifdef CHAR_INT_ELEMENTAL_H /* inter_elemental */ typedef void (*HPMHOOK_pre_inter_elemental_sql_init) (void); typedef void (*HPMHOOK_post_inter_elemental_sql_init) (void); @@ -3208,6 +3282,10 @@ typedef int (*HPMHOOK_pre_intif_rodex_sendmail) (struct rodex_message **msg); typedef int (*HPMHOOK_post_intif_rodex_sendmail) (int retVal___, struct rodex_message *msg); typedef int (*HPMHOOK_pre_intif_rodex_checkname) (struct map_session_data **sd, const char **name); typedef int (*HPMHOOK_post_intif_rodex_checkname) (int retVal___, struct map_session_data *sd, const char *name); +typedef int (*HPMHOOK_pre_intif_clan_kickoffline) (int *clan_id, int *kick_interval); +typedef int (*HPMHOOK_post_intif_clan_kickoffline) (int retVal___, int clan_id, int kick_interval); +typedef int (*HPMHOOK_pre_intif_clan_membercount) (int *clan_id, int *kick_interval); +typedef int (*HPMHOOK_post_intif_clan_membercount) (int retVal___, int clan_id, int kick_interval); typedef void (*HPMHOOK_pre_intif_request_accinfo) (int *u_fd, int *aid, int *group_lv, char **query); typedef void (*HPMHOOK_post_intif_request_accinfo) (int u_fd, int aid, int group_lv, char *query); typedef int (*HPMHOOK_pre_intif_CheckForCharServer) (void); @@ -3348,6 +3426,8 @@ typedef void (*HPMHOOK_pre_intif_pRodexSendMail) (int *fd); typedef void (*HPMHOOK_post_intif_pRodexSendMail) (int fd); typedef void (*HPMHOOK_pre_intif_pRodexCheckName) (int *fd); typedef void (*HPMHOOK_post_intif_pRodexCheckName) (int fd); +typedef void (*HPMHOOK_pre_intif_pRecvClanMemberAction) (int *fd); +typedef void (*HPMHOOK_post_intif_pRecvClanMemberAction) (int fd); #endif // MAP_INTIF_H #ifdef MAP_IRC_BOT_H /* ircbot */ typedef void (*HPMHOOK_pre_ircbot_init) (bool *minimal); @@ -4566,6 +4646,10 @@ typedef void (*HPMHOOK_pre_mapif_namechange_ack) (int *fd, int *account_id, int typedef void (*HPMHOOK_post_mapif_namechange_ack) (int fd, int account_id, int char_id, int type, int flag, const char *name); typedef int (*HPMHOOK_pre_mapif_parse_NameChangeRequest) (int *fd); typedef int (*HPMHOOK_post_mapif_parse_NameChangeRequest) (int retVal___, int fd); +typedef int (*HPMHOOK_pre_mapif_parse_ClanMemberKick) (int *fd, int *clan_id, int *kick_interval); +typedef int (*HPMHOOK_post_mapif_parse_ClanMemberKick) (int retVal___, int fd, int clan_id, int kick_interval); +typedef int (*HPMHOOK_pre_mapif_parse_ClanMemberCount) (int *fd, int *clan_id, int *kick_interval); +typedef int (*HPMHOOK_post_mapif_parse_ClanMemberCount) (int retVal___, int fd, int clan_id, int kick_interval); #endif // CHAR_MAPIF_H #ifdef COMMON_MAPINDEX_H /* mapindex */ typedef int (*HPMHOOK_pre_mapindex_init) (void); diff --git a/src/plugins/HPMHooking/HPMHooking_char.HPMHooksCore.inc b/src/plugins/HPMHooking/HPMHooking_char.HPMHooksCore.inc index d7e6f524d..d0b4ac5ce 100644 --- a/src/plugins/HPMHooking/HPMHooking_char.HPMHooksCore.inc +++ b/src/plugins/HPMHooking/HPMHooking_char.HPMHooksCore.inc @@ -466,6 +466,12 @@ struct { struct HPMHookPoint *HP_inter_auction_sql_init_post; struct HPMHookPoint *HP_inter_auction_sql_final_pre; struct HPMHookPoint *HP_inter_auction_sql_final_post; + struct HPMHookPoint *HP_inter_clan_kick_inactive_members_pre; + struct HPMHookPoint *HP_inter_clan_kick_inactive_members_post; + struct HPMHookPoint *HP_inter_clan_count_members_pre; + struct HPMHookPoint *HP_inter_clan_count_members_post; + struct HPMHookPoint *HP_inter_clan_parse_frommap_pre; + struct HPMHookPoint *HP_inter_clan_parse_frommap_post; struct HPMHookPoint *HP_inter_elemental_sql_init_pre; struct HPMHookPoint *HP_inter_elemental_sql_init_post; struct HPMHookPoint *HP_inter_elemental_sql_final_pre; @@ -1184,6 +1190,10 @@ struct { struct HPMHookPoint *HP_mapif_namechange_ack_post; struct HPMHookPoint *HP_mapif_parse_NameChangeRequest_pre; struct HPMHookPoint *HP_mapif_parse_NameChangeRequest_post; + struct HPMHookPoint *HP_mapif_parse_ClanMemberKick_pre; + struct HPMHookPoint *HP_mapif_parse_ClanMemberKick_post; + struct HPMHookPoint *HP_mapif_parse_ClanMemberCount_pre; + struct HPMHookPoint *HP_mapif_parse_ClanMemberCount_post; struct HPMHookPoint *HP_mapindex_init_pre; struct HPMHookPoint *HP_mapindex_init_post; struct HPMHookPoint *HP_mapindex_final_pre; @@ -1985,6 +1995,12 @@ struct { int HP_inter_auction_sql_init_post; int HP_inter_auction_sql_final_pre; int HP_inter_auction_sql_final_post; + int HP_inter_clan_kick_inactive_members_pre; + int HP_inter_clan_kick_inactive_members_post; + int HP_inter_clan_count_members_pre; + int HP_inter_clan_count_members_post; + int HP_inter_clan_parse_frommap_pre; + int HP_inter_clan_parse_frommap_post; int HP_inter_elemental_sql_init_pre; int HP_inter_elemental_sql_init_post; int HP_inter_elemental_sql_final_pre; @@ -2703,6 +2719,10 @@ struct { int HP_mapif_namechange_ack_post; int HP_mapif_parse_NameChangeRequest_pre; int HP_mapif_parse_NameChangeRequest_post; + int HP_mapif_parse_ClanMemberKick_pre; + int HP_mapif_parse_ClanMemberKick_post; + int HP_mapif_parse_ClanMemberCount_pre; + int HP_mapif_parse_ClanMemberCount_post; int HP_mapindex_init_pre; int HP_mapindex_init_post; int HP_mapindex_final_pre; @@ -3073,6 +3093,7 @@ struct { struct des_interface des; struct geoip_interface geoip; struct inter_auction_interface inter_auction; + struct inter_clan_interface inter_clan; struct inter_elemental_interface inter_elemental; struct inter_guild_interface inter_guild; struct inter_homunculus_interface inter_homunculus; diff --git a/src/plugins/HPMHooking/HPMHooking_char.HookingPoints.inc b/src/plugins/HPMHooking/HPMHooking_char.HookingPoints.inc index 14dc89804..36a115e1b 100644 --- a/src/plugins/HPMHooking/HPMHooking_char.HookingPoints.inc +++ b/src/plugins/HPMHooking/HPMHooking_char.HookingPoints.inc @@ -255,6 +255,10 @@ struct HookingPointData HookingPoints[] = { { HP_POP(inter_auction->parse_frommap, HP_inter_auction_parse_frommap) }, { HP_POP(inter_auction->sql_init, HP_inter_auction_sql_init) }, { HP_POP(inter_auction->sql_final, HP_inter_auction_sql_final) }, +/* inter_clan_interface */ + { HP_POP(inter_clan->kick_inactive_members, HP_inter_clan_kick_inactive_members) }, + { HP_POP(inter_clan->count_members, HP_inter_clan_count_members) }, + { HP_POP(inter_clan->parse_frommap, HP_inter_clan_parse_frommap) }, /* inter_elemental_interface */ { HP_POP(inter_elemental->sql_init, HP_inter_elemental_sql_init) }, { HP_POP(inter_elemental->sql_final, HP_inter_elemental_sql_final) }, @@ -628,6 +632,8 @@ struct HookingPointData HookingPoints[] = { { HP_POP(mapif->parse_RegistryRequest, HP_mapif_parse_RegistryRequest) }, { HP_POP(mapif->namechange_ack, HP_mapif_namechange_ack) }, { HP_POP(mapif->parse_NameChangeRequest, HP_mapif_parse_NameChangeRequest) }, + { HP_POP(mapif->parse_ClanMemberKick, HP_mapif_parse_ClanMemberKick) }, + { HP_POP(mapif->parse_ClanMemberCount, HP_mapif_parse_ClanMemberCount) }, /* mapindex_interface */ { HP_POP(mapindex->init, HP_mapindex_init) }, { HP_POP(mapindex->final, HP_mapindex_final) }, diff --git a/src/plugins/HPMHooking/HPMHooking_char.Hooks.inc b/src/plugins/HPMHooking/HPMHooking_char.Hooks.inc index 1836bf6ba..cfd6caee1 100644 --- a/src/plugins/HPMHooking/HPMHooking_char.Hooks.inc +++ b/src/plugins/HPMHooking/HPMHooking_char.Hooks.inc @@ -5879,6 +5879,88 @@ void HP_inter_auction_sql_final(void) { } return; } +/* inter_clan_interface */ +int HP_inter_clan_kick_inactive_members(int clan_id, int kick_interval) { + int hIndex = 0; + int retVal___ = 0; + if (HPMHooks.count.HP_inter_clan_kick_inactive_members_pre > 0) { + int (*preHookFunc) (int *clan_id, int *kick_interval); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_inter_clan_kick_inactive_members_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_inter_clan_kick_inactive_members_pre[hIndex].func; + retVal___ = preHookFunc(&clan_id, &kick_interval); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.inter_clan.kick_inactive_members(clan_id, kick_interval); + } + if (HPMHooks.count.HP_inter_clan_kick_inactive_members_post > 0) { + int (*postHookFunc) (int retVal___, int clan_id, int kick_interval); + for (hIndex = 0; hIndex < HPMHooks.count.HP_inter_clan_kick_inactive_members_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_inter_clan_kick_inactive_members_post[hIndex].func; + retVal___ = postHookFunc(retVal___, clan_id, kick_interval); + } + } + return retVal___; +} +int HP_inter_clan_count_members(int clan_id, int kick_interval) { + int hIndex = 0; + int retVal___ = 0; + if (HPMHooks.count.HP_inter_clan_count_members_pre > 0) { + int (*preHookFunc) (int *clan_id, int *kick_interval); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_inter_clan_count_members_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_inter_clan_count_members_pre[hIndex].func; + retVal___ = preHookFunc(&clan_id, &kick_interval); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.inter_clan.count_members(clan_id, kick_interval); + } + if (HPMHooks.count.HP_inter_clan_count_members_post > 0) { + int (*postHookFunc) (int retVal___, int clan_id, int kick_interval); + for (hIndex = 0; hIndex < HPMHooks.count.HP_inter_clan_count_members_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_inter_clan_count_members_post[hIndex].func; + retVal___ = postHookFunc(retVal___, clan_id, kick_interval); + } + } + return retVal___; +} +int HP_inter_clan_parse_frommap(int fd) { + int hIndex = 0; + int retVal___ = 0; + if (HPMHooks.count.HP_inter_clan_parse_frommap_pre > 0) { + int (*preHookFunc) (int *fd); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_inter_clan_parse_frommap_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_inter_clan_parse_frommap_pre[hIndex].func; + retVal___ = preHookFunc(&fd); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.inter_clan.parse_frommap(fd); + } + if (HPMHooks.count.HP_inter_clan_parse_frommap_post > 0) { + int (*postHookFunc) (int retVal___, int fd); + for (hIndex = 0; hIndex < HPMHooks.count.HP_inter_clan_parse_frommap_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_inter_clan_parse_frommap_post[hIndex].func; + retVal___ = postHookFunc(retVal___, fd); + } + } + return retVal___; +} /* inter_elemental_interface */ void HP_inter_elemental_sql_init(void) { int hIndex = 0; @@ -15500,6 +15582,60 @@ int HP_mapif_parse_NameChangeRequest(int fd) { } return retVal___; } +int HP_mapif_parse_ClanMemberKick(int fd, int clan_id, int kick_interval) { + int hIndex = 0; + int retVal___ = 0; + if (HPMHooks.count.HP_mapif_parse_ClanMemberKick_pre > 0) { + int (*preHookFunc) (int *fd, int *clan_id, int *kick_interval); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_mapif_parse_ClanMemberKick_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_mapif_parse_ClanMemberKick_pre[hIndex].func; + retVal___ = preHookFunc(&fd, &clan_id, &kick_interval); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.mapif.parse_ClanMemberKick(fd, clan_id, kick_interval); + } + if (HPMHooks.count.HP_mapif_parse_ClanMemberKick_post > 0) { + int (*postHookFunc) (int retVal___, int fd, int clan_id, int kick_interval); + for (hIndex = 0; hIndex < HPMHooks.count.HP_mapif_parse_ClanMemberKick_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_mapif_parse_ClanMemberKick_post[hIndex].func; + retVal___ = postHookFunc(retVal___, fd, clan_id, kick_interval); + } + } + return retVal___; +} +int HP_mapif_parse_ClanMemberCount(int fd, int clan_id, int kick_interval) { + int hIndex = 0; + int retVal___ = 0; + if (HPMHooks.count.HP_mapif_parse_ClanMemberCount_pre > 0) { + int (*preHookFunc) (int *fd, int *clan_id, int *kick_interval); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_mapif_parse_ClanMemberCount_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_mapif_parse_ClanMemberCount_pre[hIndex].func; + retVal___ = preHookFunc(&fd, &clan_id, &kick_interval); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.mapif.parse_ClanMemberCount(fd, clan_id, kick_interval); + } + if (HPMHooks.count.HP_mapif_parse_ClanMemberCount_post > 0) { + int (*postHookFunc) (int retVal___, int fd, int clan_id, int kick_interval); + for (hIndex = 0; hIndex < HPMHooks.count.HP_mapif_parse_ClanMemberCount_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_mapif_parse_ClanMemberCount_post[hIndex].func; + retVal___ = postHookFunc(retVal___, fd, clan_id, kick_interval); + } + } + return retVal___; +} /* mapindex_interface */ int HP_mapindex_init(void) { int hIndex = 0; diff --git a/src/plugins/HPMHooking/HPMHooking_char.sources.inc b/src/plugins/HPMHooking/HPMHooking_char.sources.inc index 8b2f1b071..9ba9e129e 100644 --- a/src/plugins/HPMHooking/HPMHooking_char.sources.inc +++ b/src/plugins/HPMHooking/HPMHooking_char.sources.inc @@ -34,6 +34,7 @@ HPMHooks.source.DB = *DB; HPMHooks.source.des = *des; HPMHooks.source.geoip = *geoip; HPMHooks.source.inter_auction = *inter_auction; +HPMHooks.source.inter_clan = *inter_clan; HPMHooks.source.inter_elemental = *inter_elemental; HPMHooks.source.inter_guild = *inter_guild; HPMHooks.source.inter_homunculus = *inter_homunculus; diff --git a/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc b/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc index f057b34d8..7e9d5589b 100644 --- a/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc +++ b/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc @@ -504,6 +504,60 @@ struct { struct HPMHookPoint *HP_chrif_save_scdata_single_post; struct HPMHookPoint *HP_chrif_del_scdata_single_pre; struct HPMHookPoint *HP_chrif_del_scdata_single_post; + struct HPMHookPoint *HP_clan_init_pre; + struct HPMHookPoint *HP_clan_init_post; + struct HPMHookPoint *HP_clan_final_pre; + struct HPMHookPoint *HP_clan_final_post; + struct HPMHookPoint *HP_clan_config_read_pre; + struct HPMHookPoint *HP_clan_config_read_post; + struct HPMHookPoint *HP_clan_config_read_additional_settings_pre; + struct HPMHookPoint *HP_clan_config_read_additional_settings_post; + struct HPMHookPoint *HP_clan_read_db_pre; + struct HPMHookPoint *HP_clan_read_db_post; + struct HPMHookPoint *HP_clan_read_db_sub_pre; + struct HPMHookPoint *HP_clan_read_db_sub_post; + struct HPMHookPoint *HP_clan_read_db_additional_fields_pre; + struct HPMHookPoint *HP_clan_read_db_additional_fields_post; + struct HPMHookPoint *HP_clan_read_buffs_pre; + struct HPMHookPoint *HP_clan_read_buffs_post; + struct HPMHookPoint *HP_clan_search_pre; + struct HPMHookPoint *HP_clan_search_post; + struct HPMHookPoint *HP_clan_searchname_pre; + struct HPMHookPoint *HP_clan_searchname_post; + struct HPMHookPoint *HP_clan_getonlinesd_pre; + struct HPMHookPoint *HP_clan_getonlinesd_post; + struct HPMHookPoint *HP_clan_getindex_pre; + struct HPMHookPoint *HP_clan_getindex_post; + struct HPMHookPoint *HP_clan_join_pre; + struct HPMHookPoint *HP_clan_join_post; + struct HPMHookPoint *HP_clan_member_online_pre; + struct HPMHookPoint *HP_clan_member_online_post; + struct HPMHookPoint *HP_clan_leave_pre; + struct HPMHookPoint *HP_clan_leave_post; + struct HPMHookPoint *HP_clan_send_message_pre; + struct HPMHookPoint *HP_clan_send_message_post; + struct HPMHookPoint *HP_clan_recv_message_pre; + struct HPMHookPoint *HP_clan_recv_message_post; + struct HPMHookPoint *HP_clan_member_offline_pre; + struct HPMHookPoint *HP_clan_member_offline_post; + struct HPMHookPoint *HP_clan_set_constants_pre; + struct HPMHookPoint *HP_clan_set_constants_post; + struct HPMHookPoint *HP_clan_get_id_pre; + struct HPMHookPoint *HP_clan_get_id_post; + struct HPMHookPoint *HP_clan_buff_start_pre; + struct HPMHookPoint *HP_clan_buff_start_post; + struct HPMHookPoint *HP_clan_buff_end_pre; + struct HPMHookPoint *HP_clan_buff_end_post; + struct HPMHookPoint *HP_clan_reload_pre; + struct HPMHookPoint *HP_clan_reload_post; + struct HPMHookPoint *HP_clan_rejoin_pre; + struct HPMHookPoint *HP_clan_rejoin_post; + struct HPMHookPoint *HP_clan_inactivity_kick_pre; + struct HPMHookPoint *HP_clan_inactivity_kick_post; + struct HPMHookPoint *HP_clan_request_kickoffline_pre; + struct HPMHookPoint *HP_clan_request_kickoffline_post; + struct HPMHookPoint *HP_clan_request_membercount_pre; + struct HPMHookPoint *HP_clan_request_membercount_post; struct HPMHookPoint *HP_clif_init_pre; struct HPMHookPoint *HP_clif_init_post; struct HPMHookPoint *HP_clif_final_pre; @@ -1934,6 +1988,16 @@ struct { struct HPMHookPoint *HP_clif_rodex_icon_post; struct HPMHookPoint *HP_clif_skill_scale_pre; struct HPMHookPoint *HP_clif_skill_scale_post; + struct HPMHookPoint *HP_clif_clan_basicinfo_pre; + struct HPMHookPoint *HP_clif_clan_basicinfo_post; + struct HPMHookPoint *HP_clif_clan_onlinecount_pre; + struct HPMHookPoint *HP_clif_clan_onlinecount_post; + struct HPMHookPoint *HP_clif_clan_leave_pre; + struct HPMHookPoint *HP_clif_clan_leave_post; + struct HPMHookPoint *HP_clif_clan_message_pre; + struct HPMHookPoint *HP_clif_clan_message_post; + struct HPMHookPoint *HP_clif_pClanMessage_pre; + struct HPMHookPoint *HP_clif_pClanMessage_post; struct HPMHookPoint *HP_cmdline_init_pre; struct HPMHookPoint *HP_cmdline_init_post; struct HPMHookPoint *HP_cmdline_final_pre; @@ -2576,6 +2640,10 @@ struct { struct HPMHookPoint *HP_intif_rodex_sendmail_post; struct HPMHookPoint *HP_intif_rodex_checkname_pre; struct HPMHookPoint *HP_intif_rodex_checkname_post; + struct HPMHookPoint *HP_intif_clan_kickoffline_pre; + struct HPMHookPoint *HP_intif_clan_kickoffline_post; + struct HPMHookPoint *HP_intif_clan_membercount_pre; + struct HPMHookPoint *HP_intif_clan_membercount_post; struct HPMHookPoint *HP_intif_request_accinfo_pre; struct HPMHookPoint *HP_intif_request_accinfo_post; struct HPMHookPoint *HP_intif_CheckForCharServer_pre; @@ -2716,6 +2784,8 @@ struct { struct HPMHookPoint *HP_intif_pRodexSendMail_post; struct HPMHookPoint *HP_intif_pRodexCheckName_pre; struct HPMHookPoint *HP_intif_pRodexCheckName_post; + struct HPMHookPoint *HP_intif_pRecvClanMemberAction_pre; + struct HPMHookPoint *HP_intif_pRecvClanMemberAction_post; struct HPMHookPoint *HP_ircbot_init_pre; struct HPMHookPoint *HP_ircbot_init_post; struct HPMHookPoint *HP_ircbot_final_pre; @@ -6713,6 +6783,60 @@ struct { int HP_chrif_save_scdata_single_post; int HP_chrif_del_scdata_single_pre; int HP_chrif_del_scdata_single_post; + int HP_clan_init_pre; + int HP_clan_init_post; + int HP_clan_final_pre; + int HP_clan_final_post; + int HP_clan_config_read_pre; + int HP_clan_config_read_post; + int HP_clan_config_read_additional_settings_pre; + int HP_clan_config_read_additional_settings_post; + int HP_clan_read_db_pre; + int HP_clan_read_db_post; + int HP_clan_read_db_sub_pre; + int HP_clan_read_db_sub_post; + int HP_clan_read_db_additional_fields_pre; + int HP_clan_read_db_additional_fields_post; + int HP_clan_read_buffs_pre; + int HP_clan_read_buffs_post; + int HP_clan_search_pre; + int HP_clan_search_post; + int HP_clan_searchname_pre; + int HP_clan_searchname_post; + int HP_clan_getonlinesd_pre; + int HP_clan_getonlinesd_post; + int HP_clan_getindex_pre; + int HP_clan_getindex_post; + int HP_clan_join_pre; + int HP_clan_join_post; + int HP_clan_member_online_pre; + int HP_clan_member_online_post; + int HP_clan_leave_pre; + int HP_clan_leave_post; + int HP_clan_send_message_pre; + int HP_clan_send_message_post; + int HP_clan_recv_message_pre; + int HP_clan_recv_message_post; + int HP_clan_member_offline_pre; + int HP_clan_member_offline_post; + int HP_clan_set_constants_pre; + int HP_clan_set_constants_post; + int HP_clan_get_id_pre; + int HP_clan_get_id_post; + int HP_clan_buff_start_pre; + int HP_clan_buff_start_post; + int HP_clan_buff_end_pre; + int HP_clan_buff_end_post; + int HP_clan_reload_pre; + int HP_clan_reload_post; + int HP_clan_rejoin_pre; + int HP_clan_rejoin_post; + int HP_clan_inactivity_kick_pre; + int HP_clan_inactivity_kick_post; + int HP_clan_request_kickoffline_pre; + int HP_clan_request_kickoffline_post; + int HP_clan_request_membercount_pre; + int HP_clan_request_membercount_post; int HP_clif_init_pre; int HP_clif_init_post; int HP_clif_final_pre; @@ -8143,6 +8267,16 @@ struct { int HP_clif_rodex_icon_post; int HP_clif_skill_scale_pre; int HP_clif_skill_scale_post; + int HP_clif_clan_basicinfo_pre; + int HP_clif_clan_basicinfo_post; + int HP_clif_clan_onlinecount_pre; + int HP_clif_clan_onlinecount_post; + int HP_clif_clan_leave_pre; + int HP_clif_clan_leave_post; + int HP_clif_clan_message_pre; + int HP_clif_clan_message_post; + int HP_clif_pClanMessage_pre; + int HP_clif_pClanMessage_post; int HP_cmdline_init_pre; int HP_cmdline_init_post; int HP_cmdline_final_pre; @@ -8785,6 +8919,10 @@ struct { int HP_intif_rodex_sendmail_post; int HP_intif_rodex_checkname_pre; int HP_intif_rodex_checkname_post; + int HP_intif_clan_kickoffline_pre; + int HP_intif_clan_kickoffline_post; + int HP_intif_clan_membercount_pre; + int HP_intif_clan_membercount_post; int HP_intif_request_accinfo_pre; int HP_intif_request_accinfo_post; int HP_intif_CheckForCharServer_pre; @@ -8925,6 +9063,8 @@ struct { int HP_intif_pRodexSendMail_post; int HP_intif_pRodexCheckName_pre; int HP_intif_pRodexCheckName_post; + int HP_intif_pRecvClanMemberAction_pre; + int HP_intif_pRecvClanMemberAction_post; int HP_ircbot_init_pre; int HP_ircbot_init_post; int HP_ircbot_final_pre; @@ -12452,6 +12592,7 @@ struct { struct channel_interface channel; struct chat_interface chat; struct chrif_interface chrif; + struct clan_interface clan; struct clif_interface clif; struct cmdline_interface cmdline; struct console_interface console; diff --git a/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc b/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc index 6a27f3d94..f023731aa 100644 --- a/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc +++ b/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc @@ -273,6 +273,34 @@ struct HookingPointData HookingPoints[] = { { HP_POP(chrif->parse, HP_chrif_parse) }, { HP_POP(chrif->save_scdata_single, HP_chrif_save_scdata_single) }, { HP_POP(chrif->del_scdata_single, HP_chrif_del_scdata_single) }, +/* clan_interface */ + { HP_POP(clan->init, HP_clan_init) }, + { HP_POP(clan->final, HP_clan_final) }, + { HP_POP(clan->config_read, HP_clan_config_read) }, + { HP_POP(clan->config_read_additional_settings, HP_clan_config_read_additional_settings) }, + { HP_POP(clan->read_db, HP_clan_read_db) }, + { HP_POP(clan->read_db_sub, HP_clan_read_db_sub) }, + { HP_POP(clan->read_db_additional_fields, HP_clan_read_db_additional_fields) }, + { HP_POP(clan->read_buffs, HP_clan_read_buffs) }, + { HP_POP(clan->search, HP_clan_search) }, + { HP_POP(clan->searchname, HP_clan_searchname) }, + { HP_POP(clan->getonlinesd, HP_clan_getonlinesd) }, + { HP_POP(clan->getindex, HP_clan_getindex) }, + { HP_POP(clan->join, HP_clan_join) }, + { HP_POP(clan->member_online, HP_clan_member_online) }, + { HP_POP(clan->leave, HP_clan_leave) }, + { HP_POP(clan->send_message, HP_clan_send_message) }, + { HP_POP(clan->recv_message, HP_clan_recv_message) }, + { HP_POP(clan->member_offline, HP_clan_member_offline) }, + { HP_POP(clan->set_constants, HP_clan_set_constants) }, + { HP_POP(clan->get_id, HP_clan_get_id) }, + { HP_POP(clan->buff_start, HP_clan_buff_start) }, + { HP_POP(clan->buff_end, HP_clan_buff_end) }, + { HP_POP(clan->reload, HP_clan_reload) }, + { HP_POP(clan->rejoin, HP_clan_rejoin) }, + { HP_POP(clan->inactivity_kick, HP_clan_inactivity_kick) }, + { HP_POP(clan->request_kickoffline, HP_clan_request_kickoffline) }, + { HP_POP(clan->request_membercount, HP_clan_request_membercount) }, /* clif_interface */ { HP_POP(clif->init, HP_clif_init) }, { HP_POP(clif->final, HP_clif_final) }, @@ -989,6 +1017,11 @@ struct HookingPointData HookingPoints[] = { { HP_POP(clif->rodex_request_items, HP_clif_rodex_request_items) }, { HP_POP(clif->rodex_icon, HP_clif_rodex_icon) }, { HP_POP(clif->skill_scale, HP_clif_skill_scale) }, + { HP_POP(clif->clan_basicinfo, HP_clif_clan_basicinfo) }, + { HP_POP(clif->clan_onlinecount, HP_clif_clan_onlinecount) }, + { HP_POP(clif->clan_leave, HP_clif_clan_leave) }, + { HP_POP(clif->clan_message, HP_clif_clan_message) }, + { HP_POP(clif->pClanMessage, HP_clif_pClanMessage) }, /* cmdline_interface */ { HP_POP(cmdline->init, HP_cmdline_init) }, { HP_POP(cmdline->final, HP_cmdline_final) }, @@ -1323,6 +1356,8 @@ struct HookingPointData HookingPoints[] = { { HP_POP(intif->rodex_updatemail, HP_intif_rodex_updatemail) }, { HP_POP(intif->rodex_sendmail, HP_intif_rodex_sendmail) }, { HP_POP(intif->rodex_checkname, HP_intif_rodex_checkname) }, + { HP_POP(intif->clan_kickoffline, HP_intif_clan_kickoffline) }, + { HP_POP(intif->clan_membercount, HP_intif_clan_membercount) }, { HP_POP(intif->request_accinfo, HP_intif_request_accinfo) }, { HP_POP(intif->CheckForCharServer, HP_intif_CheckForCharServer) }, { HP_POP(intif->pWisMessage, HP_intif_pWisMessage) }, @@ -1393,6 +1428,7 @@ struct HookingPointData HookingPoints[] = { { HP_POP(intif->pRodexHasNew, HP_intif_pRodexHasNew) }, { HP_POP(intif->pRodexSendMail, HP_intif_pRodexSendMail) }, { HP_POP(intif->pRodexCheckName, HP_intif_pRodexCheckName) }, + { HP_POP(intif->pRecvClanMemberAction, HP_intif_pRecvClanMemberAction) }, /* irc_bot_interface */ { HP_POP(ircbot->init, HP_ircbot_init) }, { HP_POP(ircbot->final, HP_ircbot_final) }, diff --git a/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc b/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc index 5b0ae00a7..467c57dd9 100644 --- a/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc +++ b/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc @@ -6495,6 +6495,729 @@ void HP_chrif_del_scdata_single(int account_id, int char_id, short type) { } return; } +/* clan_interface */ +void HP_clan_init(bool minimal) { + int hIndex = 0; + if (HPMHooks.count.HP_clan_init_pre > 0) { + void (*preHookFunc) (bool *minimal); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_init_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_clan_init_pre[hIndex].func; + preHookFunc(&minimal); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.clan.init(minimal); + } + if (HPMHooks.count.HP_clan_init_post > 0) { + void (*postHookFunc) (bool minimal); + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_init_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_clan_init_post[hIndex].func; + postHookFunc(minimal); + } + } + return; +} +void HP_clan_final(void) { + int hIndex = 0; + if (HPMHooks.count.HP_clan_final_pre > 0) { + void (*preHookFunc) (void); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_final_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_clan_final_pre[hIndex].func; + preHookFunc(); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.clan.final(); + } + if (HPMHooks.count.HP_clan_final_post > 0) { + void (*postHookFunc) (void); + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_final_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_clan_final_post[hIndex].func; + postHookFunc(); + } + } + return; +} +bool HP_clan_config_read(bool reload) { + int hIndex = 0; + bool retVal___ = false; + if (HPMHooks.count.HP_clan_config_read_pre > 0) { + bool (*preHookFunc) (bool *reload); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_config_read_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_clan_config_read_pre[hIndex].func; + retVal___ = preHookFunc(&reload); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.clan.config_read(reload); + } + if (HPMHooks.count.HP_clan_config_read_post > 0) { + bool (*postHookFunc) (bool retVal___, bool reload); + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_config_read_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_clan_config_read_post[hIndex].func; + retVal___ = postHookFunc(retVal___, reload); + } + } + return retVal___; +} +void HP_clan_config_read_additional_settings(struct config_setting_t *settings, const char *source) { + int hIndex = 0; + if (HPMHooks.count.HP_clan_config_read_additional_settings_pre > 0) { + void (*preHookFunc) (struct config_setting_t **settings, const char **source); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_config_read_additional_settings_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_clan_config_read_additional_settings_pre[hIndex].func; + preHookFunc(&settings, &source); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.clan.config_read_additional_settings(settings, source); + } + if (HPMHooks.count.HP_clan_config_read_additional_settings_post > 0) { + void (*postHookFunc) (struct config_setting_t *settings, const char *source); + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_config_read_additional_settings_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_clan_config_read_additional_settings_post[hIndex].func; + postHookFunc(settings, source); + } + } + return; +} +void HP_clan_read_db(struct config_setting_t *settings, const char *source, bool reload) { + int hIndex = 0; + if (HPMHooks.count.HP_clan_read_db_pre > 0) { + void (*preHookFunc) (struct config_setting_t **settings, const char **source, bool *reload); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_read_db_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_clan_read_db_pre[hIndex].func; + preHookFunc(&settings, &source, &reload); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.clan.read_db(settings, source, reload); + } + if (HPMHooks.count.HP_clan_read_db_post > 0) { + void (*postHookFunc) (struct config_setting_t *settings, const char *source, bool reload); + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_read_db_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_clan_read_db_post[hIndex].func; + postHookFunc(settings, source, reload); + } + } + return; +} +int HP_clan_read_db_sub(struct config_setting_t *settings, const char *source, bool reload) { + int hIndex = 0; + int retVal___ = 0; + if (HPMHooks.count.HP_clan_read_db_sub_pre > 0) { + int (*preHookFunc) (struct config_setting_t **settings, const char **source, bool *reload); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_read_db_sub_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_clan_read_db_sub_pre[hIndex].func; + retVal___ = preHookFunc(&settings, &source, &reload); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.clan.read_db_sub(settings, source, reload); + } + if (HPMHooks.count.HP_clan_read_db_sub_post > 0) { + int (*postHookFunc) (int retVal___, struct config_setting_t *settings, const char *source, bool reload); + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_read_db_sub_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_clan_read_db_sub_post[hIndex].func; + retVal___ = postHookFunc(retVal___, settings, source, reload); + } + } + return retVal___; +} +void HP_clan_read_db_additional_fields(struct clan *entry, struct config_setting_t *t, int n, const char *source) { + int hIndex = 0; + if (HPMHooks.count.HP_clan_read_db_additional_fields_pre > 0) { + void (*preHookFunc) (struct clan **entry, struct config_setting_t **t, int *n, const char **source); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_read_db_additional_fields_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_clan_read_db_additional_fields_pre[hIndex].func; + preHookFunc(&entry, &t, &n, &source); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.clan.read_db_additional_fields(entry, t, n, source); + } + if (HPMHooks.count.HP_clan_read_db_additional_fields_post > 0) { + void (*postHookFunc) (struct clan *entry, struct config_setting_t *t, int n, const char *source); + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_read_db_additional_fields_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_clan_read_db_additional_fields_post[hIndex].func; + postHookFunc(entry, t, n, source); + } + } + return; +} +void HP_clan_read_buffs(struct clan *c, struct config_setting_t *buff, const char *source) { + int hIndex = 0; + if (HPMHooks.count.HP_clan_read_buffs_pre > 0) { + void (*preHookFunc) (struct clan **c, struct config_setting_t **buff, const char **source); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_read_buffs_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_clan_read_buffs_pre[hIndex].func; + preHookFunc(&c, &buff, &source); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.clan.read_buffs(c, buff, source); + } + if (HPMHooks.count.HP_clan_read_buffs_post > 0) { + void (*postHookFunc) (struct clan *c, struct config_setting_t *buff, const char *source); + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_read_buffs_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_clan_read_buffs_post[hIndex].func; + postHookFunc(c, buff, source); + } + } + return; +} +struct clan* HP_clan_search(int clan_id) { + int hIndex = 0; + struct clan* retVal___ = NULL; + if (HPMHooks.count.HP_clan_search_pre > 0) { + struct clan* (*preHookFunc) (int *clan_id); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_search_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_clan_search_pre[hIndex].func; + retVal___ = preHookFunc(&clan_id); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.clan.search(clan_id); + } + if (HPMHooks.count.HP_clan_search_post > 0) { + struct clan* (*postHookFunc) (struct clan* retVal___, int clan_id); + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_search_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_clan_search_post[hIndex].func; + retVal___ = postHookFunc(retVal___, clan_id); + } + } + return retVal___; +} +struct clan* HP_clan_searchname(const char *name) { + int hIndex = 0; + struct clan* retVal___ = NULL; + if (HPMHooks.count.HP_clan_searchname_pre > 0) { + struct clan* (*preHookFunc) (const char **name); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_searchname_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_clan_searchname_pre[hIndex].func; + retVal___ = preHookFunc(&name); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.clan.searchname(name); + } + if (HPMHooks.count.HP_clan_searchname_post > 0) { + struct clan* (*postHookFunc) (struct clan* retVal___, const char *name); + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_searchname_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_clan_searchname_post[hIndex].func; + retVal___ = postHookFunc(retVal___, name); + } + } + return retVal___; +} +struct map_session_data* HP_clan_getonlinesd(struct clan *c) { + int hIndex = 0; + struct map_session_data* retVal___ = NULL; + if (HPMHooks.count.HP_clan_getonlinesd_pre > 0) { + struct map_session_data* (*preHookFunc) (struct clan **c); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_getonlinesd_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_clan_getonlinesd_pre[hIndex].func; + retVal___ = preHookFunc(&c); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.clan.getonlinesd(c); + } + if (HPMHooks.count.HP_clan_getonlinesd_post > 0) { + struct map_session_data* (*postHookFunc) (struct map_session_data* retVal___, struct clan *c); + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_getonlinesd_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_clan_getonlinesd_post[hIndex].func; + retVal___ = postHookFunc(retVal___, c); + } + } + return retVal___; +} +int HP_clan_getindex(const struct clan *c, int char_id) { + int hIndex = 0; + int retVal___ = 0; + if (HPMHooks.count.HP_clan_getindex_pre > 0) { + int (*preHookFunc) (const struct clan **c, int *char_id); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_getindex_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_clan_getindex_pre[hIndex].func; + retVal___ = preHookFunc(&c, &char_id); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.clan.getindex(c, char_id); + } + if (HPMHooks.count.HP_clan_getindex_post > 0) { + int (*postHookFunc) (int retVal___, const struct clan *c, int char_id); + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_getindex_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_clan_getindex_post[hIndex].func; + retVal___ = postHookFunc(retVal___, c, char_id); + } + } + return retVal___; +} +bool HP_clan_join(struct map_session_data *sd, int clan_id) { + int hIndex = 0; + bool retVal___ = false; + if (HPMHooks.count.HP_clan_join_pre > 0) { + bool (*preHookFunc) (struct map_session_data **sd, int *clan_id); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_join_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_clan_join_pre[hIndex].func; + retVal___ = preHookFunc(&sd, &clan_id); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.clan.join(sd, clan_id); + } + if (HPMHooks.count.HP_clan_join_post > 0) { + bool (*postHookFunc) (bool retVal___, struct map_session_data *sd, int clan_id); + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_join_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_clan_join_post[hIndex].func; + retVal___ = postHookFunc(retVal___, sd, clan_id); + } + } + return retVal___; +} +void HP_clan_member_online(struct map_session_data *sd, bool first) { + int hIndex = 0; + if (HPMHooks.count.HP_clan_member_online_pre > 0) { + void (*preHookFunc) (struct map_session_data **sd, bool *first); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_member_online_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_clan_member_online_pre[hIndex].func; + preHookFunc(&sd, &first); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.clan.member_online(sd, first); + } + if (HPMHooks.count.HP_clan_member_online_post > 0) { + void (*postHookFunc) (struct map_session_data *sd, bool first); + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_member_online_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_clan_member_online_post[hIndex].func; + postHookFunc(sd, first); + } + } + return; +} +bool HP_clan_leave(struct map_session_data *sd, bool first) { + int hIndex = 0; + bool retVal___ = false; + if (HPMHooks.count.HP_clan_leave_pre > 0) { + bool (*preHookFunc) (struct map_session_data **sd, bool *first); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_leave_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_clan_leave_pre[hIndex].func; + retVal___ = preHookFunc(&sd, &first); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.clan.leave(sd, first); + } + if (HPMHooks.count.HP_clan_leave_post > 0) { + bool (*postHookFunc) (bool retVal___, struct map_session_data *sd, bool first); + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_leave_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_clan_leave_post[hIndex].func; + retVal___ = postHookFunc(retVal___, sd, first); + } + } + return retVal___; +} +bool HP_clan_send_message(struct map_session_data *sd, const char *mes) { + int hIndex = 0; + bool retVal___ = false; + if (HPMHooks.count.HP_clan_send_message_pre > 0) { + bool (*preHookFunc) (struct map_session_data **sd, const char **mes); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_send_message_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_clan_send_message_pre[hIndex].func; + retVal___ = preHookFunc(&sd, &mes); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.clan.send_message(sd, mes); + } + if (HPMHooks.count.HP_clan_send_message_post > 0) { + bool (*postHookFunc) (bool retVal___, struct map_session_data *sd, const char *mes); + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_send_message_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_clan_send_message_post[hIndex].func; + retVal___ = postHookFunc(retVal___, sd, mes); + } + } + return retVal___; +} +void HP_clan_recv_message(struct clan *c, const char *mes, int len) { + int hIndex = 0; + if (HPMHooks.count.HP_clan_recv_message_pre > 0) { + void (*preHookFunc) (struct clan **c, const char **mes, int *len); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_recv_message_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_clan_recv_message_pre[hIndex].func; + preHookFunc(&c, &mes, &len); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.clan.recv_message(c, mes, len); + } + if (HPMHooks.count.HP_clan_recv_message_post > 0) { + void (*postHookFunc) (struct clan *c, const char *mes, int len); + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_recv_message_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_clan_recv_message_post[hIndex].func; + postHookFunc(c, mes, len); + } + } + return; +} +void HP_clan_member_offline(struct map_session_data *sd) { + int hIndex = 0; + if (HPMHooks.count.HP_clan_member_offline_pre > 0) { + void (*preHookFunc) (struct map_session_data **sd); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_member_offline_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_clan_member_offline_pre[hIndex].func; + preHookFunc(&sd); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.clan.member_offline(sd); + } + if (HPMHooks.count.HP_clan_member_offline_post > 0) { + void (*postHookFunc) (struct map_session_data *sd); + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_member_offline_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_clan_member_offline_post[hIndex].func; + postHookFunc(sd); + } + } + return; +} +void HP_clan_set_constants(void) { + int hIndex = 0; + if (HPMHooks.count.HP_clan_set_constants_pre > 0) { + void (*preHookFunc) (void); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_set_constants_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_clan_set_constants_pre[hIndex].func; + preHookFunc(); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.clan.set_constants(); + } + if (HPMHooks.count.HP_clan_set_constants_post > 0) { + void (*postHookFunc) (void); + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_set_constants_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_clan_set_constants_post[hIndex].func; + postHookFunc(); + } + } + return; +} +int HP_clan_get_id(const struct block_list *bl) { + int hIndex = 0; + int retVal___ = 0; + if (HPMHooks.count.HP_clan_get_id_pre > 0) { + int (*preHookFunc) (const struct block_list **bl); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_get_id_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_clan_get_id_pre[hIndex].func; + retVal___ = preHookFunc(&bl); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.clan.get_id(bl); + } + if (HPMHooks.count.HP_clan_get_id_post > 0) { + int (*postHookFunc) (int retVal___, const struct block_list *bl); + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_get_id_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_clan_get_id_post[hIndex].func; + retVal___ = postHookFunc(retVal___, bl); + } + } + return retVal___; +} +void HP_clan_buff_start(struct map_session_data *sd, struct clan *c) { + int hIndex = 0; + if (HPMHooks.count.HP_clan_buff_start_pre > 0) { + void (*preHookFunc) (struct map_session_data **sd, struct clan **c); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_buff_start_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_clan_buff_start_pre[hIndex].func; + preHookFunc(&sd, &c); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.clan.buff_start(sd, c); + } + if (HPMHooks.count.HP_clan_buff_start_post > 0) { + void (*postHookFunc) (struct map_session_data *sd, struct clan *c); + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_buff_start_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_clan_buff_start_post[hIndex].func; + postHookFunc(sd, c); + } + } + return; +} +void HP_clan_buff_end(struct map_session_data *sd, struct clan *c) { + int hIndex = 0; + if (HPMHooks.count.HP_clan_buff_end_pre > 0) { + void (*preHookFunc) (struct map_session_data **sd, struct clan **c); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_buff_end_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_clan_buff_end_pre[hIndex].func; + preHookFunc(&sd, &c); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.clan.buff_end(sd, c); + } + if (HPMHooks.count.HP_clan_buff_end_post > 0) { + void (*postHookFunc) (struct map_session_data *sd, struct clan *c); + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_buff_end_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_clan_buff_end_post[hIndex].func; + postHookFunc(sd, c); + } + } + return; +} +void HP_clan_reload(void) { + int hIndex = 0; + if (HPMHooks.count.HP_clan_reload_pre > 0) { + void (*preHookFunc) (void); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_reload_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_clan_reload_pre[hIndex].func; + preHookFunc(); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.clan.reload(); + } + if (HPMHooks.count.HP_clan_reload_post > 0) { + void (*postHookFunc) (void); + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_reload_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_clan_reload_post[hIndex].func; + postHookFunc(); + } + } + return; +} +int HP_clan_rejoin(struct map_session_data *sd, va_list ap) { + int hIndex = 0; + int retVal___ = 0; + if (HPMHooks.count.HP_clan_rejoin_pre > 0) { + int (*preHookFunc) (struct map_session_data **sd, va_list ap); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_rejoin_pre; hIndex++) { + va_list ap___copy; va_copy(ap___copy, ap); + preHookFunc = HPMHooks.list.HP_clan_rejoin_pre[hIndex].func; + retVal___ = preHookFunc(&sd, ap___copy); + va_end(ap___copy); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return retVal___; + } + } + { + va_list ap___copy; va_copy(ap___copy, ap); + retVal___ = HPMHooks.source.clan.rejoin(sd, ap___copy); + va_end(ap___copy); + } + if (HPMHooks.count.HP_clan_rejoin_post > 0) { + int (*postHookFunc) (int retVal___, struct map_session_data *sd, va_list ap); + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_rejoin_post; hIndex++) { + va_list ap___copy; va_copy(ap___copy, ap); + postHookFunc = HPMHooks.list.HP_clan_rejoin_post[hIndex].func; + retVal___ = postHookFunc(retVal___, sd, ap___copy); + va_end(ap___copy); + } + } + return retVal___; +} +int HP_clan_inactivity_kick(int tid, int64 tick, int id, intptr_t data) { + int hIndex = 0; + int retVal___ = 0; + if (HPMHooks.count.HP_clan_inactivity_kick_pre > 0) { + int (*preHookFunc) (int *tid, int64 *tick, int *id, intptr_t *data); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_inactivity_kick_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_clan_inactivity_kick_pre[hIndex].func; + retVal___ = preHookFunc(&tid, &tick, &id, &data); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.clan.inactivity_kick(tid, tick, id, data); + } + if (HPMHooks.count.HP_clan_inactivity_kick_post > 0) { + int (*postHookFunc) (int retVal___, int tid, int64 tick, int id, intptr_t data); + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_inactivity_kick_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_clan_inactivity_kick_post[hIndex].func; + retVal___ = postHookFunc(retVal___, tid, tick, id, data); + } + } + return retVal___; +} +int HP_clan_request_kickoffline(int tid, int64 tick, int id, intptr_t data) { + int hIndex = 0; + int retVal___ = 0; + if (HPMHooks.count.HP_clan_request_kickoffline_pre > 0) { + int (*preHookFunc) (int *tid, int64 *tick, int *id, intptr_t *data); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_request_kickoffline_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_clan_request_kickoffline_pre[hIndex].func; + retVal___ = preHookFunc(&tid, &tick, &id, &data); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.clan.request_kickoffline(tid, tick, id, data); + } + if (HPMHooks.count.HP_clan_request_kickoffline_post > 0) { + int (*postHookFunc) (int retVal___, int tid, int64 tick, int id, intptr_t data); + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_request_kickoffline_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_clan_request_kickoffline_post[hIndex].func; + retVal___ = postHookFunc(retVal___, tid, tick, id, data); + } + } + return retVal___; +} +int HP_clan_request_membercount(int tid, int64 tick, int id, intptr_t data) { + int hIndex = 0; + int retVal___ = 0; + if (HPMHooks.count.HP_clan_request_membercount_pre > 0) { + int (*preHookFunc) (int *tid, int64 *tick, int *id, intptr_t *data); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_request_membercount_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_clan_request_membercount_pre[hIndex].func; + retVal___ = preHookFunc(&tid, &tick, &id, &data); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.clan.request_membercount(tid, tick, id, data); + } + if (HPMHooks.count.HP_clan_request_membercount_post > 0) { + int (*postHookFunc) (int retVal___, int tid, int64 tick, int id, intptr_t data); + for (hIndex = 0; hIndex < HPMHooks.count.HP_clan_request_membercount_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_clan_request_membercount_post[hIndex].func; + retVal___ = postHookFunc(retVal___, tid, tick, id, data); + } + } + return retVal___; +} /* clif_interface */ int HP_clif_init(bool minimal) { int hIndex = 0; @@ -25165,6 +25888,136 @@ void HP_clif_skill_scale(struct block_list *bl, int src_id, int x, int y, uint16 } return; } +void HP_clif_clan_basicinfo(struct map_session_data *sd) { + int hIndex = 0; + if (HPMHooks.count.HP_clif_clan_basicinfo_pre > 0) { + void (*preHookFunc) (struct map_session_data **sd); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_clan_basicinfo_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_clif_clan_basicinfo_pre[hIndex].func; + preHookFunc(&sd); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.clif.clan_basicinfo(sd); + } + if (HPMHooks.count.HP_clif_clan_basicinfo_post > 0) { + void (*postHookFunc) (struct map_session_data *sd); + for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_clan_basicinfo_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_clif_clan_basicinfo_post[hIndex].func; + postHookFunc(sd); + } + } + return; +} +void HP_clif_clan_onlinecount(struct clan *c) { + int hIndex = 0; + if (HPMHooks.count.HP_clif_clan_onlinecount_pre > 0) { + void (*preHookFunc) (struct clan **c); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_clan_onlinecount_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_clif_clan_onlinecount_pre[hIndex].func; + preHookFunc(&c); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.clif.clan_onlinecount(c); + } + if (HPMHooks.count.HP_clif_clan_onlinecount_post > 0) { + void (*postHookFunc) (struct clan *c); + for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_clan_onlinecount_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_clif_clan_onlinecount_post[hIndex].func; + postHookFunc(c); + } + } + return; +} +void HP_clif_clan_leave(struct map_session_data *sd) { + int hIndex = 0; + if (HPMHooks.count.HP_clif_clan_leave_pre > 0) { + void (*preHookFunc) (struct map_session_data **sd); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_clan_leave_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_clif_clan_leave_pre[hIndex].func; + preHookFunc(&sd); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.clif.clan_leave(sd); + } + if (HPMHooks.count.HP_clif_clan_leave_post > 0) { + void (*postHookFunc) (struct map_session_data *sd); + for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_clan_leave_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_clif_clan_leave_post[hIndex].func; + postHookFunc(sd); + } + } + return; +} +void HP_clif_clan_message(struct clan *c, const char *mes, int len) { + int hIndex = 0; + if (HPMHooks.count.HP_clif_clan_message_pre > 0) { + void (*preHookFunc) (struct clan **c, const char **mes, int *len); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_clan_message_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_clif_clan_message_pre[hIndex].func; + preHookFunc(&c, &mes, &len); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.clif.clan_message(c, mes, len); + } + if (HPMHooks.count.HP_clif_clan_message_post > 0) { + void (*postHookFunc) (struct clan *c, const char *mes, int len); + for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_clan_message_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_clif_clan_message_post[hIndex].func; + postHookFunc(c, mes, len); + } + } + return; +} +void HP_clif_pClanMessage(int fd, struct map_session_data *sd) { + int hIndex = 0; + if (HPMHooks.count.HP_clif_pClanMessage_pre > 0) { + void (*preHookFunc) (int *fd, struct map_session_data **sd); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_pClanMessage_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_clif_pClanMessage_pre[hIndex].func; + preHookFunc(&fd, &sd); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.clif.pClanMessage(fd, sd); + } + if (HPMHooks.count.HP_clif_pClanMessage_post > 0) { + void (*postHookFunc) (int fd, struct map_session_data *sd); + for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_pClanMessage_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_clif_pClanMessage_post[hIndex].func; + postHookFunc(fd, sd); + } + } + return; +} /* cmdline_interface */ void HP_cmdline_init(void) { int hIndex = 0; @@ -33854,6 +34707,60 @@ int HP_intif_rodex_checkname(struct map_session_data *sd, const char *name) { } return retVal___; } +int HP_intif_clan_kickoffline(int clan_id, int kick_interval) { + int hIndex = 0; + int retVal___ = 0; + if (HPMHooks.count.HP_intif_clan_kickoffline_pre > 0) { + int (*preHookFunc) (int *clan_id, int *kick_interval); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_intif_clan_kickoffline_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_intif_clan_kickoffline_pre[hIndex].func; + retVal___ = preHookFunc(&clan_id, &kick_interval); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.intif.clan_kickoffline(clan_id, kick_interval); + } + if (HPMHooks.count.HP_intif_clan_kickoffline_post > 0) { + int (*postHookFunc) (int retVal___, int clan_id, int kick_interval); + for (hIndex = 0; hIndex < HPMHooks.count.HP_intif_clan_kickoffline_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_intif_clan_kickoffline_post[hIndex].func; + retVal___ = postHookFunc(retVal___, clan_id, kick_interval); + } + } + return retVal___; +} +int HP_intif_clan_membercount(int clan_id, int kick_interval) { + int hIndex = 0; + int retVal___ = 0; + if (HPMHooks.count.HP_intif_clan_membercount_pre > 0) { + int (*preHookFunc) (int *clan_id, int *kick_interval); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_intif_clan_membercount_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_intif_clan_membercount_pre[hIndex].func; + retVal___ = preHookFunc(&clan_id, &kick_interval); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.intif.clan_membercount(clan_id, kick_interval); + } + if (HPMHooks.count.HP_intif_clan_membercount_post > 0) { + int (*postHookFunc) (int retVal___, int clan_id, int kick_interval); + for (hIndex = 0; hIndex < HPMHooks.count.HP_intif_clan_membercount_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_intif_clan_membercount_post[hIndex].func; + retVal___ = postHookFunc(retVal___, clan_id, kick_interval); + } + } + return retVal___; +} void HP_intif_request_accinfo(int u_fd, int aid, int group_lv, char *query) { int hIndex = 0; if (HPMHooks.count.HP_intif_request_accinfo_pre > 0) { @@ -35682,6 +36589,32 @@ void HP_intif_pRodexCheckName(int fd) { } return; } +void HP_intif_pRecvClanMemberAction(int fd) { + int hIndex = 0; + if (HPMHooks.count.HP_intif_pRecvClanMemberAction_pre > 0) { + void (*preHookFunc) (int *fd); + *HPMforce_return = false; + for (hIndex = 0; hIndex < HPMHooks.count.HP_intif_pRecvClanMemberAction_pre; hIndex++) { + preHookFunc = HPMHooks.list.HP_intif_pRecvClanMemberAction_pre[hIndex].func; + preHookFunc(&fd); + } + if (*HPMforce_return) { + *HPMforce_return = false; + return; + } + } + { + HPMHooks.source.intif.pRecvClanMemberAction(fd); + } + if (HPMHooks.count.HP_intif_pRecvClanMemberAction_post > 0) { + void (*postHookFunc) (int fd); + for (hIndex = 0; hIndex < HPMHooks.count.HP_intif_pRecvClanMemberAction_post; hIndex++) { + postHookFunc = HPMHooks.list.HP_intif_pRecvClanMemberAction_post[hIndex].func; + postHookFunc(fd); + } + } + return; +} /* irc_bot_interface */ void HP_ircbot_init(bool minimal) { int hIndex = 0; diff --git a/src/plugins/HPMHooking/HPMHooking_map.sources.inc b/src/plugins/HPMHooking/HPMHooking_map.sources.inc index 23f762151..e6f305726 100644 --- a/src/plugins/HPMHooking/HPMHooking_map.sources.inc +++ b/src/plugins/HPMHooking/HPMHooking_map.sources.inc @@ -33,6 +33,7 @@ HPMHooks.source.buyingstore = *buyingstore; HPMHooks.source.channel = *channel; HPMHooks.source.chat = *chat; HPMHooks.source.chrif = *chrif; +HPMHooks.source.clan = *clan; HPMHooks.source.clif = *clif; HPMHooks.source.cmdline = *cmdline; HPMHooks.source.console = *console; -- cgit v1.2.3-70-g09d2