Initial release of lasagna npcs (#2105)

* First release of lasagna npcs (playing conversion).

* Added a new parameter for npctalk script command
Target for <flag>:
- bc_all  : Broadcast message is sent server-wide (only in the chat window).
- bc_map  : Message is sent to everyone in the same map as the source of the npc.
- bc_area : Message is sent to players in the vicinity of the source (default value).
- bc_self : Message is sent only to player attached.

* Implemented doram food buffs

* Updated npctalk:
*npctalk "<message>"{,"<NPC name>",<flag>};
- Empty string for "<NPC name>" now means attached NPC

* Added flag parameter for unittalk script command
*unittalk <GID>,"<text>"{,<flag>};
flag: Specify target
   bc_area - Message is sent to players in the vicinity of the source (default).
   bc_self - Message is sent only to player attached.
 
* Updated classchange script command:
classchange(<view id>{,"<NPC name>",<flag>});
flag: Specify target
   bc_area - Data is sent to players in the vicinity of the source (default).
   bc_self - Data is sent only to player attached.

* Updated Time Limit for quests to allow HH:MM format

Thanks @secretdataz, @Lemongrass3110, @aleos89, @Jeybla, @anacondaqq, @jenkijo, @sikiro, @admkakaroto for contributing !
This commit is contained in:
Atemo 2017-06-26 00:54:25 +02:00 committed by GitHub
parent 809fc35b0e
commit a5afb06979
19 changed files with 10610 additions and 68 deletions

View File

@ -6118,6 +6118,7 @@
11599,Superstar_Potion,Superstar Potion,0,10,,10,,,,0,0xFFFFFFFF,63,2,,,,,,{},{},{}
11600,Shining_Holy_Water,Shining Holy Water,0,10,,15,,,,0,0xFFFFFFFF,63,2,,,,,,{ if(strcharinfo(3)=="prt_q") { bonus_script "{ bonus2 bSubSize,Size_All,10; }",600; sc_end SC_SILENCE; sc_end SC_POISON; sc_end SC_CURSE; heal 1000,0; } },{},{}
11602,Catnip_Fruit,Catnip Fruit,0,15,,1,,,,,0xFFFFFFFF,63,2,,,,,,{ itemheal rand(10,40),0; },{},{}
11601,Delicious_Anchovy,Delicious Anchovy,0,20,,30,,,,,0xFFFFFFFF,63,2,,,,,,{ itemheal rand(30,46),0; },{},{}
11605,Cookie_Bat,Cookie Bat,0,0,,50,,,,,0xFFFFFFFF,63,2,,,,,,{ itemheal rand(50,100),0; /*TODO*/ },{},{}
//
11701,Girl_Bunch_Of_Flower_,Girl's Bouquet,0,20,,50,,,,,0xFFFFFFFF,63,2,,,,,,{ itemheal rand(105,145),0; },{},{}
@ -9841,6 +9842,7 @@
19053,Fighter_Moon_Cat,Fighter Moon Cat,4,20,,100,,5,,1,0xFFFFFFFF,63,2,256,,1,1,1308,{ /*Enables use of Level 1 Monster's Cry*/ .@r = getrefine(); bonus bAllStats,3; bonus2 bAddEff,Eff_Stun,500+(.@r*100); },{},{}
19082,Bio_Protector,Bio Protector,4,0,,500,,3,,0,0xFFFFFFFF,63,2,512,1,50,1,1366,{ bonus bHit,10; bonus bVariableCastrate,-5; bonus bPerfectHitRate,5; },{},{}
19083,Mask_of_Hero,Mask of Hero,4,20,,200,,0,,0,0xFFFFFFFF,63,2,512,,70,0,1367,{ bonus bVit,10; bonus bMdef,10; bonus bShortWeaponDamageReturn,1; },{},{}
19084,Parfaille_Vigilante_Hat,Parfaille Vigilante Hat,4,0,,100,,2,,0,0x80000000,63,2,256,,20,1,1368,{ bonus bLuk,1; bonus3 bAutoSpell,"AL_BLESSING",3,100; },{},{}
19085,Sigrun's_Wings_,Sigrun's Wings,4,20,,100,,2,,1,0xFFFFFFFF,63,2,512,,1,0,568,{ if(BaseClass==Job_Swordman||BaseClass==Job_Merchant||BaseClass==Job_Thief||(BaseJob==Job_Taekwon&&Class!=Job_Soul_Linker)) { bonus bAspd,1; bonus bAgi,-2; } else if(BaseClass==Job_Mage||BaseClass==Job_Acolyte||Class==Job_Ninja||Class==Job_Soul_Linker){ bonus bMatk,3; bonus bHealPower,2; } else if(BaseClass==Job_Archer||BaseClass==Job_Gunslinger) bonus bLongAtkRate,1; else if(BaseJob==Job_Novice||BaseJob==Job_SuperNovice) { bonus bMaxHP,60; bonus bMaxSP,30; } },{},{}
19086,Robo_Eye_,Robo Eye,4,20,,200,,2,,1,0xFFFFFFFF,63,2,512,,10,0,345,{ bonus2 bAddClass,Class_All,1; bonus bMatkRate,1; bonus bDex,1; },{},{}
19087,Angel_Spirit_,Angel Spirit,4,20,,200,,0,,1,0xFFFFFFFF,63,2,512,,0,0,394,{ bonus bStr,1; bonus bHit,8; },{},{}
@ -11092,7 +11094,8 @@
22899,Parchment_City,Parchment City,2,20,,0,,,,,0xFFFFFFFF,63,2,,,,,,{ itemskill "AL_INCAGI",1; heal -15,0; },{},{}
22901,Question_Old_Blue_Box,Question Old Blue Box,2,20,,0,,,,,0xFFFFFFFF,63,2,,,,,,{ /*No info yet*/ },{},{}
22902,Sealed_Card_Album_Scroll_II,Sealed Card Album Scroll II,2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ getitem callfunc("F_Rand",6238,6239,17474,22829,24243,24244,24245),1; },{},{}
22985,Basil,Basil,0,0,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ bonus_script "{ bonus2 bSPRegenRate,5,10000; }",180,1,0,SI_DORAM_BUF_02; },{},{}
22984,Kahluna_Milk,Kahluna Milk,0,6,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ sc_start SC_DORAM_BUF_01, 180000, 0; },{},{}
22985,Basil,Basil,0,10,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ sc_start SC_DORAM_BUF_02, 180000, 0; },{},{}
//
23177,Kafra_Card_,Kafra Card,2,2,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ callfunc "F_CashStore"; },{},{}
23191,Varetyr_Spear_Scroll_1_5,Level 5 Varetyr Spear,11,10,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ itemskill "SO_VARETYR_SPEAR",5; },{},{}
@ -11363,6 +11366,13 @@
//===================================================================
// New etc.
//===================================================================
25043,Thorny_Vine_Flute,Thorny Vine Flute,3,0,,0,,,,,,,,,,,,,{},{},{}
25044,Hard_Thorny_Vine,Hard Thorny Vine,3,0,,10,,,,,,,,,,,,,{},{},{}
25045,Luxurious_Cloth,Luxurious Cloth,3,0,,0,,,,,,,,,,,,,{},{},{}
25046,Boarding_Pass,Boarding Pass,3,0,,0,,,,,,,,,,,,,{},{},{}
25047,Kahlunac,Kahlunac,3,0,,0,,,,,,,,,,,,,{},{},{}
25048,Hearty_Lunchbox,Hearty Lunchbox,3,0,,0,,,,,,,,,,,,,{},{},{}
25049,Basilac_Clam,Basilac Clam,3,0,,0,,,,,,,,,,,,,{},{},{}
25132,Pumpkin_Deco,Pumpkin Deco,3,0,,0,,,,,,,,,,,,,{},{},{}
25133,Dried_White_Stem,Dried White Stem,3,0,,0,,,,,,,,,,,,,{},{},{}
25142,Doram_Token,Doram Token,3,,0,0,,,,,,,,,,,,,{},{},{}

View File

@ -3671,6 +3671,7 @@
19051,475,100 // Warrior_Moon_Cat
19052,507,100 // Sigruns_Wing
19053,475,100 // Fighter_Moon_Cat
19084,467,100 // Parfaille_Vigilante_Hat
19523,475,100 // Donation_Ribbon
19531,475,100 // C_Cube_Mask
19532,475,100 // C_Red_Bunny_Band
@ -3860,6 +3861,12 @@
//22952,475,100 //
23177,475,100 // Kafra_Card_
23196,475,100 // Shining_Blue_Lucky_Egg
25043,499,100 // Thorny_Vine_Flute
25045,499,100 // Luxurious_Cloth
25046,499,100 // Boarding_Pass
25047,499,100 // Kahlunac
25048,499,100 // Hearty_Lunchbox
25049,499,100 // Basilac_Clam
25132,499,100 // Pumpkin_Deco
25133,499,100 // Dried_White_Stem
25143,499,100 // Gift_Stuffed_Doll

View File

@ -2649,20 +2649,23 @@
//3492,E_WILD_MOBSTER
//3493,SYS_MSG_J
//3494,IFN_POIRING
//3495,DR_EGGRING
//3496,DR_LUNATIC
//3497,DR_FABRE
//3498,DR_HORNET
//3499,DR_RODA_FROG
//3500,DR_DESERT_WOLF_B
//3501,DR_SPORE
//3502,DR_BASILISK1
//3503,DR_BASILISK2
//3504,DR_BASILISK3
//3505,DR_BIG_EGGRING
//3506,DR_MANDRAGORA
//3507,DR_POM_SPIDER
//3508,DR_EGGRING_G
// Dummy (inaccurate)
3495,DR_EGGRING,Eggring,Eggring,1,50,1,50,35,1,8,9,2,4,6,1,1,0,6,5,10,12,1,3,22,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,909,8750,938,3750,601,1250,0,0,0,0,4659,1
3496,DR_LUNATIC,Leaf Lunatic,Leaf Lunatic,3,44,1,50,35,1,11,12,16,0,10,3,3,0,8,5,10,12,0,2,60,0x81,200,1456,456,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,515,2000,949,6000,705,8000,0,0,0,0,4663,1
3497,DR_FABRE,Grass Fabre,Grass Fabre,7,60,1,52,38,1,12,15,24,0,12,5,5,5,12,5,10,12,0,4,22,0x2000081,400,1672,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,914,7500,511,2500,0,0,0,0,4664,1
3498,DR_HORNET,Wild Hornet,Wild Hornet,11,78,1,57,42,1,13,16,7,1,12,24,4,5,6,5,10,12,0,4,24,0x2001081,150,1292,792,216,0,0,0,0,0,0,0,0,0,939,10000,909,10000,601,444,0,0,0,0,0,0,0,0,0,0,4665,1
3499,DR_RODA_FROG,Sweet Roda Frog,Sweet Roda Frog,14,140,1,65,50,1,19,23,12,5,12,6,4,0,14,9,10,12,1,5,21,0x81,200,2016,816,288,0,0,0,0,0,0,0,918,10000,908,571,511,571,601,571,1684,416,1683,416,0,0,0,0,0,0,4666,1
3500,DR_DESERT_WOLF_B,Hunter Desert Wolf,Hunter Desert Wolf,17,113,1,76,58,1,80,91,15,3,27,24,30,15,33,5,10,12,1,2,23,0x1089,200,1054,504,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,919,2000,582,2000,0,0,0,0,4667,1
3501,DR_SPORE,Trans Spore,Trans Spore,18,280,1,74,59,1,25,33,12,10,15,5,10,0,12,0,10,12,1,3,21,0x81,200,1872,672,288,0,0,0,0,0,0,0,921,10000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4668,1
3502,DR_BASILISK1,Scout Basilisk,Scout Basilisk,20,243,1,95,62,1,38,50,18,10,0,8,17,0,15,0,10,12,1,2,22,0x3885,400,2612,912,288,0,0,0,0,0,0,0,1685,217,1686,217,22985,256,0,0,0,0,0,0,0,0,0,0,0,0,4660,1
3503,DR_BASILISK2,Combat Basilisk,Combat Basilisk,140,180030,1,583,656,1,216,245,105,80,56,12,19,11,27,10,10,12,1,2,42,0x3885,250,2456,912,504,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4661,1
3504,DR_BASILISK3,Combat Basilisk,Combat Basilisk,148,216036,1,583,656,1,216,245,126,80,56,12,19,11,27,10,10,12,1,2,42,0x3885,250,2456,912,504,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4661,1
3505,DR_BIG_EGGRING,Big Eggring,Big Eggring,25,156,1,97,73,4,20,23,13,2,12,3,5,5,10,5,10,12,1,3,62,0x84,1000,1768,768,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4662,1
3506,DR_MANDRAGORA,Jungle Madragora,Jungle Madragora,144,190570,1,0,0,1,80,120,113,62,35,21,41,12,29,60,10,12,1,3,62,0x6203695,300,1072,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4669,1
3507,DR_POM_SPIDER,Fruits Pom Spider,Fruits Pom Spider,150,156532,1,8010,8037,1,632,847,240,115,156,85,178,88,139,102,10,12,1,4,62,0x2003885,250,864,1056,576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4670,1
3508,DR_EGGRING_G,Eggring,Eggring,20,220,1,0,0,1,8,9,2,5,6,1,1,0,6,5,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
//3509,MOON_RABBIT
//3510,POPE_MD_E_GUARD
//3511,POPE_MD_E_BELIEVER_1

View File

@ -3,6 +3,11 @@
// Structure of Database:
// Quest ID,Time Limit,Target1,Val1,Target2,Val2,Target3,Val3,MobID1,NameID1,Rate1,MobID2,NameID2,Rate2,MobID3,NameID3,Rate3,Quest Title
//
// Time Limit* can be:
// - in seconds ; date limit will be at [Current time + Time Limit]
// - in HH-MM format ; date limit will be at [Time Limit] of the current day or at [Time Limit]
// of the next day if [Time Limit] is lower than the current date.
//
// The MobID*, NameID*, and Rate* reflect special values for quests that can drop an item at given rate from given mob.
// If no MobID* is given, then any mob has a chance to drop the given ItemID*.
@ -1448,6 +1453,21 @@
//7628,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,""
//7629,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,""
// Lasagna Quests
7711,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Beginning"
7712,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Where am I? Who am I??"
7713,0,3495,3,0,0,0,0,0,0,0,0,0,0,0,0,0,"First Battle!"
7714,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Refreshing Apple Juice"
7715,0,0,0,0,0,0,0,3495,1081,5000,0,0,0,0,0,0,"Midding Box"
7716,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To the Village!"
7717,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Merchant's Kindness"
7718,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"I'm used to this"
7719,0,1078,3,0,0,0,0,0,0,0,0,0,0,0,0,0,"Time to Digest"
7720,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Service Manual"
7721,600,3496,3,3497,2,0,0,0,0,0,0,0,0,0,0,0,"Cat showoff contest"
7722,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"EMT"
7723,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The potential within"
8000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Quitting Job Change"
8001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Assassin"
8002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Assassin"
@ -2316,6 +2336,19 @@
//11366,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,""
11378,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Trick or treat" // Halloween Event 2013
// Lasagna Quests
11435,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vigilante Corp"
11436,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vigilante Corp"
11437,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vigilante Corp"
11438,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vigilante Corp"
11439,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vigilante Corp"
11440,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vigilante Corp"
11441,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vigilante Corp"
11442,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vigilante Corp"
11443,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vigilante Corp"
11444,0,0,0,0,0,0,0,3499,25045,5000,0,0,0,0,0,0,"Vigilante Corp"
11445,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vigilante Corp"
12000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"An old friend"
12001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Digotz, Maku's old friend"
12002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Messenger of Friendship"
@ -2921,6 +2954,64 @@
//14290,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,""
//14291,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,""
// Lasagna Quests
14531,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Everything about Con-Chliina"
14532,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Greetings to Captain Gamberi"
14533,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Say hi to recorder"
14534,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To the kitchen"
14535,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To Purser"
14536,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivery to Chef"
14537,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"When do we take off?"
14538,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Can we take off?"
14539,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Crazy Dragon"
14540,0,0,0,0,0,0,0,3502,25049,5000,0,0,0,0,0,0,"An errand out of nowhere"
14541,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"No news is not a good news"
14542,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"How is the Dragon"
14543,0,3502,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Basilisk Hunt"
14544,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Now I can leave"
14545,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To Purser"
14546,0,3496,5,3497,5,0,0,0,0,0,0,0,0,0,0,0,"Take care of grass thief"
14547,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Can we set out the sailing?"
14548,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Crazy Dragon"
14549,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"No news is not a good news"
14550,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"How is the Dragon"
14551,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Chief Basilisk"
14552,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lord Imuk's message"
14553,0,3504,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Basilisk Hunt"
14554,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"We can start sail now"
14555,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Whole new world of taste"
14556,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"There also is a scary thing for me"
14557,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Truth is alway harsh"
14558,0,0,0,0,0,0,0,3503,25049,5000,0,0,0,0,0,0,"Dirty Creatures"
14559,04:00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Charm Effect Duration"
14560,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"New Ingredient"
14561,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dirty and Filty"
14562,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The basic are the best"
14563,04:00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Free time"
14565,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Emergency food supplies"
14566,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Brilliant idea"
14567,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kaluna milk is in Danger!"
14568,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Time to persuade"
14569,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Babysitter"
14570,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Processing Anchovy"
14571,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Anchovy fishing ship"
14572,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Helpless..."
14573,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"I need the time on my own"
14574,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Meal Box Delivery"
14575,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivery Complete Report"
14576,04:00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Meal Box Delivery Time"
14579,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Interview with Captain"
14580,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To Recorder"
14581,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Interview with the Chief"
14582,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To Recorder"
14583,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To Granma"
14584,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Back to Recorder"
14588,0,3498,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Competition"
14589,0,3499,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sticky ingredient"
14590,0,3500,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunter's destination"
14591,0,3501,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret Ingredient"
14592,04:00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Resting Time"
// Academy 14.2
15000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Experiencing abnormal statuses"
15001,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hold your breath"

View File

@ -4171,7 +4171,7 @@ The command will run for the invoking character unless an account ID is given.
---------------------------------------
*classchange <view id>,<type>;
*classchange(<view id>{,"<NPC name>","<flag>"});
This command is very ancient, its origins are clouded in mystery.
It will send a 'display id change' packet to everyone in the immediate area of
@ -4191,6 +4191,12 @@ run will actually just crash the client.
It could be a real gem if it can be gotten to actually do what it's supposed to
do, but this will only happen in a later SVN revision.
Empty <NPC name> means attached NPC.
Target for <flag>:
- bc_area : Sprite is sent to players in the vicinity of the source (default value).
- bc_self : Sprite is sent only to player attached.
---------------------------------------
*changesex({<char_id>});
@ -6179,13 +6185,19 @@ Returns true if the command was executed on the other NPC successfully, false if
---------------------------------------
*npctalk "<message>"{,"<NPC name>"};
*npctalk "<message>"{,"<NPC name>","<flag>"};
This command will display a message to the surrounding area as if the NPC object
running it was a player talking - that is, above their head and in the chat
window. The display name of the NPC won't get appended in front of the message.
If the <NPC name> option is given, then that NPC will display the message, else
the attached NPC will display the message.
This command will display a message as if the NPC object running it was a player
talking - that is, above their head and in the chat window.
The display name of the NPC won't get appended in front of the message.
If the <NPC name> option is given and not empty, then that NPC will display the message,
else the attached NPC will display the message.
Target for <flag>:
- bc_all : Broadcast message is sent server-wide (only in the chat window).
- bc_map : Message is sent to everyone in the same map as the source of the npc.
- bc_area : Message is sent to players in the vicinity of the source (default value).
- bc_self : Message is sent only to player attached.
// This will make everyone in the area see the NPC greet the character
// who just invoked it.
@ -7386,9 +7398,12 @@ Suggest to use 'unitblockmove' to forcefully stop the unit with OnTouch.
---------------------------------------
*unittalk <GID>,"<text>";
*unittalk <GID>,"<text>"{,flag};
This command will make a <GID> say a message. The display name of the <GID> won't get appended in front of the message.
flag: Specify target
bc_area - Message is sent to players in the vicinity of the source (default).
bc_self - Message is sent only to player attached.
---------------------------------------

View File

@ -0,0 +1,28 @@
//===== rAthena Script =======================================
//= Lasagna Dungeons Monsters Spawn Script
//===== Changelogs: ==========================================
//= 1.0 First Version. [Capuche]
//============================================================
//==================================================
// lasa_dun01 - Dragon's Nest
//==================================================
lasa_dun01,0,0 monster Trans Spore 3501,40
lasa_dun01,0,0 monster Scout Basilisk 3502,40
//==================================================
// lasa_dun02 - Dragon's Nest
//==================================================
lasa_dun02,0,0 monster Combat Basilisk 3503,40
lasa_dun02,0,0 monster Jungle Madragora 3506,40
//==================================================
// lasa_dun03 - Dragon's Nest
//==================================================
lasa_dun03,0,0 monster Combat Basilisk 3504,80
lasa_dun03,0,0 monster Fruits Pom Spider 3507,80
//==================================================
// lasa_dun_q - Dragon's Nest
//==================================================
lasa_dun_q,0,0 monster Scout Basilisk 3502,40

View File

@ -0,0 +1,24 @@
//===== rAthena Script =======================================
//= Lasagna Fild Monster Spawn Script
//===== Changelogs: ==========================================
//= 1.0 First Version. [Capuche]
//============================================================
//==================================================
// lasa_fild01 - Ravioli Plain Watch
//==================================================
lasa_fild01,0,0 monster Eggring 3495,30
lasa_fild01,0,0 monster Leaf Lunatic 3496,30
lasa_fild01,0,0 monster Grass Fabre 3497,30
lasa_fild01,100,330,75,50 monster Eggring 3495,50
lasa_fild01,100,330,75,50 monster Leaf Lunatic 3496,50
lasa_fild01,100,330,75,50 monster Grass Fabre 3497,50
lasa_fild01,140,365,15,15 monster Red Plant 1078,5
//==================================================
// lasa_fild01 - Ravioli Forest
//==================================================
lasa_fild02,0,0 monster Wild Hornet 3498,40
lasa_fild02,0,0 monster Sweet Roda Frog 3499,40
lasa_fild02,0,0 monster Hunter Desert Wolf 3500,40
lasa_fild02,0,0 monster Combat Basilisk 3502,5

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,45 @@
//===== rAthena Script =======================================
//= Lasagna Warps
//===== Changelogs: ==========================================
//= 1.0 First Version. [Capuche]
//============================================================
lasa_fild02,348,244,0 warp lasa_fild02#lasa_dun01 1,1,lasa_dun01,24,143
lasa_dun01,18,143,0 warp lasa_dun01#lasa_fild02 1,1,lasa_fild02,344,243
lasa_dun_q,190,14,0 warp lasa_dun_q#lasa_dun01 1,1,lasa_dun01,152,98
lasa_dun01,157,98,0 warp lasa_dun01#lasa_dun02 1,1,lasa_dun02,22,171
lasa_dun02,18,171,0 warp lasa_dun02#lasa_dun01 1,1,lasa_dun01,153,98
lasa_dun02,146,58,0 warp lasa_dun02#lasa_dun03 1,1,lasa_dun03,190,18
lasa_dun03,190,15,0 warp lasa_dun03#lasa_dun02 1,1,lasa_dun02,146,54
lasa_fild01,134,381,0 warp lasa_fild01#lasagna_1 2,2,lasagna,153,58
lasagna,150,54,0 warp lasagna#lasa_fild01_1 2,2,lasa_fild01,131,378
lasa_fild01,341,375,0 warp lasa_fild01#lasagna_2 2,2,lasagna,327,56
lasagna,327,51,0 warp lasagna#lasa_fild01_2 2,2,lasa_fild01,344,371
lasagna,358,91,0 warp lasagna#lasa_fild02 2,2,lasa_fild02,20,98
lasa_fild02,16,98,0 warp lasa_fild02#lasagna 2,2,lasagna,355,92
lasa_in01,159,61,0 warp lasa_in01#lasagna 1,1,lasagna,68,202
// Boat
conch_in,60,61,0 warp2 warp_conch_in#out 1,1,lasagna,206,323
conch_in,51,60,0 warp2 warp_conch_in#A_B 1,1,conch_in,31,60
conch_in,34,60,0 warp2 warp_conch_in#B_A 1,1,conch_in,53,59
conch_in,63,53,0 warp2 warp_conch_in#C_D 1,1,conch_in,63,33
conch_in,63,35,0 warp2 warp_conch_in#D_C 1,1,conch_in,64,55
conch_in,64,66,0 warp2 warp_conch_in#E_F 1,1,conch_in,63,89
conch_in,63,87,0 warp2 warp_conch_in#F_E 1,1,conch_in,63,64
conch_in,101,53,0 warp2 warp_conch_in#G_H 1,1,conch_in,101,33
conch_in,101,35,0 warp2 warp_conch_in#H_G 1,1,conch_in,102,55
conch_in,101,66,0 warp2 warp_conch_in#I_J 1,1,conch_in,101,89
conch_in,102,87,0 warp2 warp_conch_in#J_I 1,1,conch_in,101,64
conch_in,137,53,0 warp2 warp_conch_in#K_L 1,1,conch_in,139,33
conch_in,139,35,0 warp2 warp_conch_in#L_K 1,1,conch_in,138,55
conch_in,137,66,0 warp2 warp_conch_in#M_N 1,1,conch_in,139,89
conch_in,140,87,0 warp2 warp_conch_in#N_M 1,1,conch_in,137,64
conch_in,142,60,0 warp2 warp_conch_in#O_P 1,1,conch_in,162,61
conch_in,159,61,0 warp2 warp_conch_in#P_O 1,1,conch_in,140,59

View File

@ -165,3 +165,9 @@ npc: npc/re/quests/woe_te/te_mission_alde.txt
npc: npc/re/quests/woe_te/te_mission_prt.txt
npc: npc/re/quests/woe_te/te_goditem_prt01.txt
npc: npc/re/quests/woe_te/te_goditem_alde1.txt
// Lasagna npcs
npc: npc/re/custom/lasagna/lasa_dun.txt
npc: npc/re/custom/lasagna/lasa_fild.txt
npc: npc/re/custom/lasagna/lasagna_npcs.txt
npc: npc/re/custom/lasagna/warps.txt

View File

@ -1344,7 +1344,7 @@ static void clif_setdisguise(struct block_list *bl, unsigned char *buf,int len)
/// 01b0 <id>.L <type>.B <value>.L
/// type:
/// unused
void clif_class_change(struct block_list *bl,int class_,int type)
void clif_class_change_target(struct block_list *bl,int class_,int type, enum send_target target, struct map_session_data *sd)
{
nullpo_retv(bl);
@ -1355,7 +1355,7 @@ void clif_class_change(struct block_list *bl,int class_,int type)
WBUFL(buf,2)=bl->id;
WBUFB(buf,6)=type;
WBUFL(buf,7)=class_;
clif_send(buf,packet_len(0x1b0),bl,AREA);
clif_send(buf,packet_len(0x1b0),(sd == NULL ? bl : &(sd->bl)),target);
}
}
@ -9295,9 +9295,9 @@ void clif_specialeffect_value(struct block_list* bl, int effect_id, int num, sen
/// Monster/NPC color chat [SnakeDrak] (ZC_NPC_CHAT).
/// 02c1 <packet len>.W <id>.L <color>.L <message>.?B
void clif_messagecolor(struct block_list *bl, unsigned long color, const char *msg, bool rgb2bgr, enum send_target type) {
void clif_messagecolor_target(struct block_list *bl, unsigned long color, const char *msg, bool rgb2bgr, enum send_target type, struct map_session_data *sd) {
unsigned short msg_len = (unsigned short)(strlen(msg) + 1);
uint8 buf[256];
uint8 buf[CHAT_SIZE_MAX];
nullpo_retv(bl);
@ -9315,7 +9315,7 @@ void clif_messagecolor(struct block_list *bl, unsigned long color, const char *m
WBUFL(buf,8) = color;
memcpy(WBUFCP(buf,12), msg, msg_len);
clif_send(buf, WBUFW(buf,2), bl, type);
clif_send(buf, WBUFW(buf,2), (sd == NULL ? bl : &(sd->bl)), type);
}
/**
@ -9579,7 +9579,7 @@ void clif_slide(struct block_list *bl, int x, int y)
/// Public chat message (ZC_NOTIFY_CHAT). lordalfa/Skotlex - used by @me as well
/// 008d <packet len>.W <id>.L <message>.?B
void clif_disp_overhead(struct block_list *bl, const char* mes)
void clif_disp_overhead_(struct block_list *bl, const char* mes, enum send_target flag)
{
unsigned char buf[256]; //This should be more than sufficient, the theorical max is CHAT_SIZE + 8 (pads and extra inserted crap)
int len_mes = strlen(mes)+1; //Account for \0
@ -9589,11 +9589,13 @@ void clif_disp_overhead(struct block_list *bl, const char* mes)
len_mes = sizeof(buf)-8; //Trunk it to avoid problems.
}
// send message to others
WBUFW(buf,0) = 0x8d;
WBUFW(buf,2) = len_mes + 8; // len of message + 8 (command+len+id)
WBUFL(buf,4) = bl->id;
safestrncpy(WBUFCP(buf,8), mes, len_mes);
clif_send(buf, WBUFW(buf,2), bl, AREA_CHAT_WOC);
if (flag == AREA) {
WBUFW(buf,0) = 0x8d;
WBUFW(buf,2) = len_mes + 8; // len of message + 8 (command+len+id)
WBUFL(buf,4) = bl->id;
safestrncpy(WBUFCP(buf,8), mes, len_mes);
clif_send(buf, WBUFW(buf,2), bl, AREA_CHAT_WOC);
}
// send back message to the speaker
if( bl->type == BL_PC ) {

View File

@ -635,7 +635,8 @@ void clif_storageclose(struct map_session_data* sd);
int clif_insight(struct block_list *bl,va_list ap); // map_forallinmovearea callback
int clif_outsight(struct block_list *bl,va_list ap); // map_forallinmovearea callback
void clif_class_change(struct block_list *bl,int class_,int type);
void clif_class_change_target(struct block_list *bl,int class_, int type, enum send_target target, struct map_session_data *sd);
#define clif_class_change(bl, class_, type) clif_class_change_target(bl, class_, type, AREA, NULL)
#define clif_mob_class_change(md, class_) clif_class_change(&md->bl, class_, 1)
void clif_skillinfoblock(struct map_session_data *sd);
@ -821,7 +822,8 @@ void clif_friendslist_reqack(struct map_session_data *sd, struct map_session_dat
void clif_weather(int16 m); // [Valaris]
void clif_specialeffect(struct block_list* bl, int type, enum send_target target); // special effects [Valaris]
void clif_specialeffect_single(struct block_list* bl, int type, int fd);
void clif_messagecolor(struct block_list *bl, unsigned long color, const char *msg, bool rgb2bgr, enum send_target type); // Mob/Npc color talk [SnakeDrak]
void clif_messagecolor_target(struct block_list *bl, unsigned long color, const char *msg, bool rgb2bgr, enum send_target type, struct map_session_data *sd);
#define clif_messagecolor(bl, color, msg, rgb2bgr, type) clif_messagecolor_target(bl, color, msg, rgb2bgr, type, NULL) // Mob/Npc color talk [SnakeDrak]
void clif_specialeffect_value(struct block_list* bl, int effect_id, int num, send_target target);
void clif_GM_kickack(struct map_session_data *sd, int id);
@ -829,7 +831,8 @@ void clif_GM_kick(struct map_session_data *sd,struct map_session_data *tsd);
void clif_manner_message(struct map_session_data* sd, uint32 type);
void clif_GM_silence(struct map_session_data* sd, struct map_session_data* tsd, uint8 type);
void clif_disp_overhead(struct block_list *bl, const char* mes);
void clif_disp_overhead_(struct block_list *bl, const char* mes, enum send_target flag);
#define clif_disp_overhead(bl, mes) clif_disp_overhead_(bl, mes, AREA)
void clif_get_weapon_view(struct map_session_data* sd, unsigned short *rhand, unsigned short *lhand);

View File

@ -97,8 +97,23 @@ int quest_add(TBL_PC *sd, int quest_id)
memset(&sd->quest_log[n], 0, sizeof(struct quest));
sd->quest_log[n].quest_id = qi->id;
if( qi->time )
sd->quest_log[n].time = (unsigned int)(time(NULL) + qi->time);
if (qi->time) {
if (qi->time_type == 0)
sd->quest_log[n].time = (unsigned int)(time(NULL) + qi->time);
else { // quest time limit at HH:MM
int time_today;
time_t t;
struct tm * lt;
t = time(NULL);
lt = localtime(&t);
time_today = (lt->tm_hour) * 3600 + (lt->tm_min) * 60 + (lt->tm_sec);
if (time_today < qi->time)
sd->quest_log[n].time = (unsigned int)(time(NULL) + qi->time - time_today);
else // next day
sd->quest_log[n].time = (unsigned int)(time(NULL) + 86400 + qi->time - time_today);
}
}
sd->quest_log[n].state = Q_ACTIVE;
sd->save_quest = true;
@ -148,8 +163,23 @@ int quest_change(TBL_PC *sd, int qid1, int qid2)
memset(&sd->quest_log[i], 0, sizeof(struct quest));
sd->quest_log[i].quest_id = qi->id;
if( qi->time )
sd->quest_log[i].time = (unsigned int)(time(NULL) + qi->time);
if (qi->time) {
if (qi->time_type == 0)
sd->quest_log[i].time = (unsigned int)(time(NULL) + qi->time);
else { // quest time limit at HH:MM
int time_today;
time_t t;
struct tm * lt;
t = time(NULL);
lt = localtime(&t);
time_today = (lt->tm_hour) * 3600 + (lt->tm_min) * 60 + (lt->tm_sec);
if (time_today < qi->time)
sd->quest_log[i].time = (unsigned int)(time(NULL) + qi->time - time_today);
else // next day
sd->quest_log[i].time = (unsigned int)(time(NULL) + 86400 + qi->time - time_today);
}
}
sd->quest_log[i].state = Q_ACTIVE;
@ -457,7 +487,21 @@ void quest_read_txtdb(void)
}
}
quest->time = atoi(str[1]);
if (strchr(str[1],':') == NULL) {
quest->time = atoi(str[1]);
quest->time_type = 0;
}
else {
unsigned char hour, min;
hour = atoi(str[1]);
str[1] = strchr(str[1],':');
*str[1] ++= 0;
min = atoi(str[1]);
quest->time = hour * 3600 + min * 60;
quest->time_type = 1;
}
for(i = 0; i < MAX_QUEST_OBJECTIVES; i++) {
uint16 mob_id = (uint16)atoi(str[2 * i + 2]);

View File

@ -27,6 +27,7 @@ struct quest_db {
// TODO: find out if signed or unsigned in client
int id;
unsigned int time;
bool time_type;
uint8 objectives_count;
struct quest_objective *objectives;
uint8 dropitem_count;

View File

@ -13876,21 +13876,45 @@ BUILDIN_FUNC(undisguise)
return SCRIPT_CMD_SUCCESS;
}
/*==========================================
* Transform a bl to another _class,
* @type unused
*------------------------------------------*/
/**
* Transform an NPC to another _class
*
* classchange(<view id>{,"<NPC name>","<flag>"});
* @param flag: Specify target
* BC_AREA - Sprite is sent to players in the vicinity of the source (default).
* BC_SELF - Sprite is sent only to player attached.
*/
BUILDIN_FUNC(classchange)
{
int _class,type;
struct block_list *bl=map_id2bl(st->oid);
int _class, type = 1;
struct npc_data* nd = NULL;
TBL_PC *sd = map_id2sd(st->rid);
send_target target = AREA;
if (bl==NULL)
_class = script_getnum(st,2);
if (script_hasdata(st, 3) && strlen(script_getstr(st,3)) > 0)
nd = npc_name2id(script_getstr(st, 3));
else
nd = (struct npc_data *)map_id2bl(st->oid);
if (nd == NULL)
return SCRIPT_CMD_FAILURE;
_class=script_getnum(st,2);
type=script_getnum(st,3);
clif_class_change(bl,_class,type);
if (script_hasdata(st, 4)) {
switch(script_getnum(st, 4)) {
case BC_SELF: target = SELF; break;
case BC_AREA:
default: target = AREA; break;
}
}
if (target != SELF)
clif_class_change(&nd->bl,_class,type);
else if (sd == NULL)
return SCRIPT_CMD_FAILURE;
else
clif_class_change_target(&nd->bl,_class,type,target,sd);
return SCRIPT_CMD_SUCCESS;
}
@ -14739,22 +14763,46 @@ BUILDIN_FUNC(message)
return SCRIPT_CMD_SUCCESS;
}
/*==========================================
* npctalk (sends message to surrounding area)
*------------------------------------------*/
/**
* npctalk("<message>"{,"<NPC name>","<flag>"});
* @param flag: Specify target
* BC_ALL - Broadcast message is sent server-wide.
* BC_MAP - Message is sent to everyone in the same map as the source of the npc.
* BC_AREA - Message is sent to players in the vicinity of the source (default).
* BC_SELF - Message is sent only to player attached.
*/
BUILDIN_FUNC(npctalk)
{
struct npc_data* nd = NULL;
const char* str = script_getstr(st,2);
if (script_hasdata(st, 3))
if (script_hasdata(st, 3) && strlen(script_getstr(st,3)) > 0)
nd = npc_name2id(script_getstr(st, 3));
else
nd = (struct npc_data *)map_id2bl(st->oid);
if (nd != NULL) {
char message[256];
send_target target = AREA;
char message[CHAT_SIZE_MAX];
if (script_hasdata(st, 4)) {
switch(script_getnum(st, 4)) {
case BC_ALL: target = ALL_CLIENT; break;
case BC_MAP: target = ALL_SAMEMAP; break;
case BC_SELF: target = SELF; break;
case BC_AREA:
default: target = AREA; break;
}
}
safesnprintf(message, sizeof(message), "%s", str);
clif_disp_overhead(&nd->bl, message);
if (target != SELF)
clif_messagecolor(&nd->bl, color_table[COLOR_WHITE], message, false, target);
else {
TBL_PC *sd = map_id2sd(st->rid);
if (sd == NULL)
return SCRIPT_CMD_FAILURE;
clif_messagecolor_target(&nd->bl, color_table[COLOR_WHITE], message, false, target, sd);
}
}
return SCRIPT_CMD_SUCCESS;
}
@ -18274,9 +18322,14 @@ BUILDIN_FUNC(unitstopwalk)
return SCRIPT_CMD_SUCCESS;
}
/// Makes the unit say the given message.
///
/// unittalk <unit_id>,"<message>";
/**
* Makes the unit say the given message.
*
* unittalk <unit_id>,"<message>"{,"<flag>"};
* @param flag: Specify target
* bc_area - Message is sent to players in the vicinity of the source (default).
* bc_self - Message is sent only to player attached.
*/
BUILDIN_FUNC(unittalk)
{
const char* message;
@ -18286,11 +18339,22 @@ BUILDIN_FUNC(unittalk)
if(script_rid2bl(2,bl))
{
send_target target = AREA;
struct StringBuf sbuf;
if (script_hasdata(st, 4)) {
if (script_getnum(st, 4) == BC_SELF) {
if (map_id2sd(bl->id) == NULL) {
ShowWarning("script: unittalk: bc_self can't be used for non-players objects.\n");
return SCRIPT_CMD_FAILURE;
}
target = SELF;
}
}
StringBuf_Init(&sbuf);
StringBuf_Printf(&sbuf, "%s", message);
clif_disp_overhead(bl, StringBuf_Value(&sbuf));
clif_disp_overhead_(bl, StringBuf_Value(&sbuf), target);
StringBuf_Destroy(&sbuf);
}
@ -23382,7 +23446,7 @@ struct script_function buildin_func[] = {
BUILDIN_DEF(getinventorylist,"?"),
BUILDIN_DEF(getskilllist,"?"),
BUILDIN_DEF(clearitem,"?"),
BUILDIN_DEF(classchange,"ii"),
BUILDIN_DEF(classchange,"i??"),
BUILDIN_DEF(misceffect,"i"),
BUILDIN_DEF(playBGM,"s"),
BUILDIN_DEF(playBGMall,"s?????"),
@ -23407,7 +23471,7 @@ struct script_function buildin_func[] = {
BUILDIN_DEF2(atcommand,"charcommand","s"), // [MouseJstr]
BUILDIN_DEF(movenpc,"sii?"), // [MouseJstr]
BUILDIN_DEF(message,"ss"), // [MouseJstr]
BUILDIN_DEF(npctalk,"s?"), // [Valaris]
BUILDIN_DEF(npctalk,"s??"), // [Valaris]
BUILDIN_DEF(chatmes,"s?"), // [Jey]
BUILDIN_DEF(mobcount,"ss"),
BUILDIN_DEF(getlook,"i?"),
@ -23528,7 +23592,7 @@ struct script_function buildin_func[] = {
BUILDIN_DEF(unitattack,"iv?"),
BUILDIN_DEF(unitstopattack,"i"),
BUILDIN_DEF(unitstopwalk,"i"),
BUILDIN_DEF(unittalk,"is"),
BUILDIN_DEF(unittalk,"is?"),
BUILDIN_DEF(unitemote,"ii"),
BUILDIN_DEF(unitskilluseid,"ivi??"), // originally by Qamera [Celest]
BUILDIN_DEF(unitskillusepos,"iviii?"), // [Celest]

View File

@ -1467,6 +1467,8 @@
export_constant(SC_ARMOR_ELEMENT_FIRE);
export_constant(SC_ARMOR_ELEMENT_WIND);
export_constant(SC_DAILYSENDMAILCNT);
export_constant(SC_DORAM_BUF_01);
export_constant(SC_DORAM_BUF_02);
#ifdef RENEWAL
export_constant(SC_EXTREMITYFIST2);
#endif

View File

@ -1872,7 +1872,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
case SC_C_MARKER: case SC_B_TRAP: case SC_H_MINE:
case SC_STRANGELIGHTS: case SC_DECORATION_OF_MUSIC: case SC_GN_CARTBOOST:
case SC_RECOGNIZEDSPELL: case SC_CHASEWALK2: case SC_BITE:
case SC_ACTIVE_MONSTER_TRANSFORM:
case SC_ACTIVE_MONSTER_TRANSFORM: case SC_DORAM_BUF_01: case SC_DORAM_BUF_02:
#ifdef RENEWAL
case SC_EXTREMITYFIST2:
#endif
@ -7920,7 +7920,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case SC_P_ALTER: case SC_E_CHAIN: case SC_C_MARKER:
case SC_B_TRAP: case SC_H_MINE: case SC_STRANGELIGHTS:
case SC_DECORATION_OF_MUSIC: case SC_GN_CARTBOOST: case SC_CHASEWALK2:
case SC_ACTIVE_MONSTER_TRANSFORM:
case SC_ACTIVE_MONSTER_TRANSFORM: case SC_DORAM_BUF_01: case SC_DORAM_BUF_02:
#ifdef RENEWAL
case SC_EXTREMITYFIST2:
#endif
@ -9339,7 +9339,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case SC_REUSE_LIMIT_G: case SC_REUSE_LIMIT_H: case SC_REUSE_LIMIT_MTF:
case SC_REUSE_LIMIT_ASPD_POTION: case SC_REUSE_MILLENNIUMSHIELD: case SC_REUSE_CRUSHSTRIKE:
case SC_REUSE_STORMBLAST: case SC_ALL_RIDING_REUSE_LIMIT:
case SC_SPRITEMABLE:
case SC_SPRITEMABLE: case SC_DORAM_BUF_01: case SC_DORAM_BUF_02:
case SC_QUEST_BUFF1: case SC_QUEST_BUFF2: case SC_QUEST_BUFF3:
case SC_CLAN_INFO: case SC_SWORDCLAN: case SC_ARCWANDCLAN:
case SC_GOLDENMACECLAN: case SC_CROSSBOWCLAN:

View File

@ -1083,6 +1083,8 @@ void initChangeTables(void)
/* Summoners status icons */
StatusIconChangeTable[SC_SPRITEMABLE] = SI_SPRITEMABLE;
StatusIconChangeTable[SC_DORAM_BUF_01] = SI_DORAM_BUF_01;
StatusIconChangeTable[SC_DORAM_BUF_02] = SI_DORAM_BUF_02;
// Item Reuse Limits
StatusIconChangeTable[SC_REUSE_REFRESH] = SI_REUSE_REFRESH;
@ -1266,6 +1268,10 @@ void initChangeTables(void)
// RODEX
StatusChangeFlagTable[SC_DAILYSENDMAILCNT] |= SCB_NONE;
// Doram Buffs
StatusChangeFlagTable[SC_DORAM_BUF_01] |= SCB_REGEN;
StatusChangeFlagTable[SC_DORAM_BUF_02] |= SCB_REGEN;
#ifdef RENEWAL
// renewal EDP increases your weapon atk
StatusChangeFlagTable[SC_EDP] |= SCB_WATK;
@ -9086,6 +9092,8 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
case SC_REUSE_LIMIT_ECL:
case SC_REUSE_LIMIT_RECALL:
case SC_REUSE_LIMIT_ASPD_POTION:
case SC_DORAM_BUF_01:
case SC_DORAM_BUF_02:
return 0;
case SC_PUSH_CART:
case SC_COMBO:
@ -10811,6 +10819,12 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
tick = -1;
status_change_start(src,bl,SC_CLAN_INFO,10000,0,val2,0,0,-1,flag);
break;
case SC_DORAM_BUF_01:
case SC_DORAM_BUF_02:
tick_time = 10000; // every 10 seconds
if( (val4 = tick/tick_time) < 1 )
val4 = 1;
break;
default:
if( calc_flag == SCB_NONE && StatusSkillChangeTable[type] == -1 && StatusIconChangeTable[type] == SI_BLANK ) {
@ -11496,6 +11510,8 @@ int status_change_clear(struct block_list* bl, int type)
case SC_REUSE_STORMBLAST:
case SC_ALL_RIDING_REUSE_LIMIT:
case SC_SPRITEMABLE:
case SC_DORAM_BUF_01:
case SC_DORAM_BUF_02:
case SC_GEFFEN_MAGIC1:
case SC_GEFFEN_MAGIC2:
case SC_GEFFEN_MAGIC3:
@ -13245,6 +13261,22 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr_t data)
sc_timer_next((10000 - ((sce->val1 - 1) * 1000)) + tick, status_change_timer, bl->id, data);
}
break;
case SC_DORAM_BUF_01:
if( sd && --(sce->val4) >= 0 ) {
if( status->hp < status->max_hp )
status_heal(bl, 10, 0, 2);
sc_timer_next(10000 + tick, status_change_timer, bl->id, data);
return 0;
}
break;
case SC_DORAM_BUF_02:
if( sd && --(sce->val4) >= 0 ) {
if( status->sp < status->max_sp )
status_heal(bl, 0, 5, 2);
sc_timer_next(10000 + tick, status_change_timer, bl->id, data);
return 0;
}
break;
}
// If status has an interval and there is at least 100ms remaining time, wait for next interval

View File

@ -804,6 +804,9 @@ typedef enum sc_type {
SC_DAILYSENDMAILCNT,
SC_DORAM_BUF_01,
SC_DORAM_BUF_02,
#ifdef RENEWAL
SC_EXTREMITYFIST2, //! NOTE: This SC should be right before SC_MAX, so it doesn't disturb if RENEWAL is disabled
#endif