- Fixed bugreport:9146, wrong message for msg 380. Thank Napster
- Changed Monster, Mercenary, & Elemental defense element check, from %10 to %20, to support 10 custom elements. Thank @Atemo - Updated some arrays in ACMD_FUNC(mobinfo) - Removed element number limit for each level in db/[pre-]re/attr_fix.txt - Allowing 'getitembound' and 'getitembound2' to put bound type 0 (no bound) for scripting easier - Updated doc/mob_db.txt, follow up ca4a0ea - Updated map_msg_idn.conf Signed-off-by: Cydh Ramdh <house.bad@gmail.com>
This commit is contained in:
parent
ca4a0ea1a2
commit
2bfe1d6f6e
@ -393,7 +393,7 @@
|
||||
//etc
|
||||
378: Eleanor is now in %s mode.
|
||||
379: Item Failed. [%s] is cooling down. Wait %.1f minutes.
|
||||
380: Item Failed. [%s] is cooling down. Wait %.1f seconds.
|
||||
380: Item Failed. [%s] is cooling down. Wait %d seconds.
|
||||
381: Skill Failed. [%s] requires %dx %s.
|
||||
382: You're too close to a stone or emperium to use this skill.
|
||||
383: You cannot create a savepoint in an instance.
|
||||
|
@ -392,9 +392,9 @@
|
||||
377: -- Pemain %s telah menolak permintaan duel --
|
||||
//lain-lain
|
||||
378: Eleanor sekarang dalam mode %s.
|
||||
379: Dapat digunakan setelah %.1f menit.
|
||||
380: Dapat digunakan setelah %d detik.
|
||||
381: Penggunaan skill gagal. [%s] membutuhkan %dx %s.
|
||||
379: Penggunaan item [%s] gagal. Dapat digunakan setelah %1.f menit.
|
||||
380: Penggunaan item [%s] gagal. Dapat digunakan setelah %d detik.
|
||||
381: Penggunaan skill [%s] gagal. Membutuhkan %dx %s.
|
||||
382: Kamu terlalu dekat dengan batu atau emperium untuk menggunakan skill ini.
|
||||
383: Kamu tidak dapat membuat save point di instance
|
||||
384: Kamu tidak dapat membuat memo di instance
|
||||
@ -519,7 +519,25 @@
|
||||
// @auction
|
||||
517: Sistem Auction tidak tersedia.
|
||||
|
||||
//518~534: kosong
|
||||
// @itemlist -- continued
|
||||
518: Lower Costume Head,
|
||||
519: Top Costume Head,
|
||||
520: Top/Lower Costume Head,
|
||||
521: Mid Costume Head,
|
||||
522: Mid/Lower Costume Head,
|
||||
523: Top/Mid/Lower Costume Head,
|
||||
524: Costume Robe,
|
||||
525: Costume Floor,
|
||||
526: Ammo,
|
||||
527: Shadow Body,
|
||||
528: Shadow Right Hand,
|
||||
529: Shadow Left Hand,
|
||||
530: Shadow Both Hands,
|
||||
531: Shadow Shoes,
|
||||
532: Shadow Right Accessory,
|
||||
533: Shadow Left Accessory,
|
||||
|
||||
//534: kosong
|
||||
|
||||
// Pesan yang berhubungan dengan deteksi Bot (Saat ini belum diimplementasikan)
|
||||
535: Kemungkinan BOT (99%%) atau client yang digunakan sudah dimodifikasi '%s' (akun: %d, char_id: %d). Pemain ini bisa melihat nama kamu saat kamu sedang tidak terlihat.
|
||||
@ -1373,25 +1391,25 @@
|
||||
|
||||
// @itemlist
|
||||
1332: ------ %s daftar item dari '%s' ------
|
||||
1333: | dipakai:
|
||||
1334: jubah,
|
||||
1335: aksesori kiri,
|
||||
1336: badan/armor,
|
||||
1337: tangan kanan,
|
||||
1338: tangan kiri,
|
||||
1339: kedua tangan,
|
||||
1340: kaki,
|
||||
1341: aksesori kanan,
|
||||
1342: kepala bagian bawah,
|
||||
1343: kepala bagian atas,
|
||||
1344: kepala bagian bawah/atas,
|
||||
1345: kepala bagian tengah,
|
||||
1346: kepala bagian bawah/tengah,
|
||||
1347: kepala bagian bawah/tengah/atas,
|
||||
1333: | Dipakai:
|
||||
1334: Jubah,
|
||||
1335: Aksesori kiri,
|
||||
1336: Badan/armor,
|
||||
1337: Tangan kanan,
|
||||
1338: Tangan kiri,
|
||||
1339: Kedua tangan,
|
||||
1340: Kaki,
|
||||
1341: Aksesori kanan,
|
||||
1342: Kepala bagian bawah,
|
||||
1343: Kepala bagian atas,
|
||||
1344: Kepala bagian bawah/atas,
|
||||
1345: Kepala bagian tengah,
|
||||
1346: Kepala bagian bawah/tengah,
|
||||
1347: Kepala bagian bawah/tengah/atas,
|
||||
1348: -> (telur peliharaan, id peliharaan: %u, sudah diberi nama)
|
||||
1349: -> (telur peliharaan, id peliharaan: %u, belum diberi nama)
|
||||
1350: -> (item dibuat, id pembuat: %u, %d star crumb, elemen %d)
|
||||
1351: -> (memproduksi item, id pembuat: %u)
|
||||
1350: -> (item buatan, id pembuat: %u, %d star crumb, elemen %d)
|
||||
1351: -> (item produksi, id pembuat: %u)
|
||||
1352: -> (kartu:
|
||||
1353: Tidak ada item yang ditemukan di %s pemain.
|
||||
1354: %d item ditemukan di slot %d %s.
|
||||
|
@ -4618,6 +4618,7 @@ IT_AMMO 10
|
||||
IT_DELAYCONSUME 11
|
||||
IT_CASH 18
|
||||
|
||||
Bound_None 0
|
||||
Bound_Account 1
|
||||
Bound_Guild 2
|
||||
Bound_Party 3
|
||||
|
@ -4,7 +4,7 @@
|
||||
// Columns - attacker's weapon element
|
||||
// Rows - target's defense element
|
||||
|
||||
1,10 // lv1 Attribute table
|
||||
1 // lv1 Attribute table
|
||||
//Neut Watr Erth Fire Wind Pois Holy Shdw Gho Und
|
||||
100, 100, 100, 100, 100, 100, 100, 100, 25, 100, // Neutral
|
||||
100, 25, 100, 150, 50, 100, 75, 100, 100, 100, // Water
|
||||
@ -17,7 +17,7 @@
|
||||
25, 100, 100, 100, 100, 100, 75, 75, 125, 100, // Ghost
|
||||
100, 100, 100, 100, 100, 50, 100, 0, 100, 0, // Undead
|
||||
|
||||
2,10 // lv2 Attribute table
|
||||
2 // lv2 Attribute table
|
||||
//Neut Watr Erth Fire Wind Pois Holy Shdw Gho Und
|
||||
100, 100, 100, 100, 100, 100, 100, 100, 25, 100, // Neutral
|
||||
100, 0, 100, 175, 25, 100, 50, 75, 100, 100, // Water
|
||||
@ -30,7 +30,7 @@
|
||||
0, 75, 75, 75, 75, 75, 50, 50, 150, 125, // Ghost
|
||||
100, 75, 75, 75, 75, 25, 125, 0, 100, 0, // Undead
|
||||
|
||||
3,10 // lv3 Attribute table
|
||||
3 // lv3 Attribute table
|
||||
//Neut Watr Erth Fire Wind Pois Holy Shdw Gho Und
|
||||
100, 100, 100, 100, 100, 100, 100, 100, 0, 100, // Neutral
|
||||
100, -25, 100, 200, 0, 100, 25, 50, 100, 125, // Water
|
||||
@ -43,7 +43,7 @@
|
||||
0, 50, 50, 50, 50, 50, 25, 25, 175, 150, // Ghost
|
||||
100, 50, 50, 50, 50, 0, 150, 0, 100, 0, // Undead
|
||||
|
||||
4,10 // lv4 Attribute table
|
||||
4 // lv4 Attribute table
|
||||
//Neut Watr Erth Fire Wind Pois Holy Shdw Gho Und
|
||||
100, 100, 100, 100, 100, 100, 100, 100, 0, 100, // Neutral
|
||||
100, -50, 100, 200, 0, 75, 0, 25, 100, 150, // Water
|
||||
|
@ -4,7 +4,7 @@
|
||||
// Columns - attacker's weapon element
|
||||
// Rows - target's defense element
|
||||
|
||||
1,10 // lv1 Attribute table
|
||||
1 // lv1 Attribute table
|
||||
//Neut Watr Erth Fire Wind Pois Holy Shdw Gho Und
|
||||
100, 100, 100, 100, 100, 100, 100, 100, 70, 100, // Neutral
|
||||
100, 25, 100, 150, 90, 100, 75, 100, 100, 100, // Water
|
||||
@ -17,7 +17,7 @@
|
||||
70, 100, 100, 100, 100, 100, 75, 75, 125, 100, // Ghost
|
||||
100, 100, 100, 100, 100, 50, 100, 0, 100, 0, // Undead
|
||||
|
||||
2,10 // lv2 Attribute table
|
||||
2 // lv2 Attribute table
|
||||
//Neut Watr Erth Fire Wind Pois Holy Shdw Gho Und
|
||||
100, 100, 100, 100, 100, 100, 100, 100, 50, 100, // Neutral
|
||||
100, 0, 100, 175, 80, 100, 50, 75, 100, 100, // Water
|
||||
@ -30,7 +30,7 @@
|
||||
50, 75, 75, 75, 75, 75, 50, 50, 150, 125, // Ghost
|
||||
100, 75, 75, 75, 75, 25, 125, 0, 100, 0, // Undead
|
||||
|
||||
3,10 // lv3 Attribute table
|
||||
3 // lv3 Attribute table
|
||||
//Neut Watr Erth Fire Wind Pois Holy Shdw Gho Und
|
||||
100, 100, 100, 100, 100, 100, 100, 100, 0, 100, // Neutral
|
||||
100, -25, 100, 200, 70, 100, 25, 50, 100, 125, // Water
|
||||
@ -43,7 +43,7 @@
|
||||
0, 50, 50, 50, 50, 50, 25, 25, 175, 150, // Ghost
|
||||
100, 50, 50, 50, 50, 0, 150, 0, 100, 0, // Undead
|
||||
|
||||
4,10 // lv4 Attribute table
|
||||
4 // lv4 Attribute table
|
||||
//Neut Watr Erth Fire Wind Pois Holy Shdw Gho Und
|
||||
100, 100, 100, 100, 100, 100, 100, 100, 0, 100, // Neutral
|
||||
100, -50, 100, 200, 60, 75, 0, 25, 100, 150, // Water
|
||||
|
134
doc/mob_db.txt
134
doc/mob_db.txt
@ -1,9 +1,9 @@
|
||||
//===== rAthena Documentation ================================
|
||||
//= rAthena Mob Database Reference
|
||||
//= rAthena Monster Database Reference
|
||||
//===== By: ==================================================
|
||||
//= rAthena Dev Team
|
||||
//===== Last Updated: ========================================
|
||||
//= 20140718
|
||||
//= 20140719
|
||||
//===== Description: =========================================
|
||||
//= Explanation of the mob_db.txt file and structure.
|
||||
//============================================================
|
||||
@ -12,83 +12,83 @@ ID,Sprite_Name,kROName,iROName,LV,HP,SP,EXP,JEXP,Range1,ATK1,ATK2,DEF,MDEF,STR,A
|
||||
|
||||
---------------------------------------
|
||||
|
||||
ID: The ID of the mob.
|
||||
ID: The ID of the monster.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
SpriteName: The sprite name of the mob (.act & .spr)
|
||||
SpriteName: The sprite name of the monster (.act & .spr)
|
||||
|
||||
---------------------------------------
|
||||
|
||||
kROName: The name of the mob, this will be used when you use "--ja--".
|
||||
kROName: The name of the monster, this will be used when you use "--ja--".
|
||||
|
||||
---------------------------------------
|
||||
|
||||
iROName: The name of the mob, this will be used when you use "--en--".
|
||||
iROName: The name of the monster, this will be used when you use "--en--".
|
||||
|
||||
---------------------------------------
|
||||
|
||||
LV: The level of the mob.
|
||||
LV: The level of the monster.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
HP: The HP of the mob.
|
||||
HP: The HP of the monster.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
SP: The SP of the mob.
|
||||
SP: The SP of the monster.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
EXP: Base experience point of the mob.
|
||||
EXP: Base experience point of the monster.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
JEXP: Job experience point of the mob.
|
||||
JEXP: Job experience point of the monster.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
Range1: Range of the mob attack. If set to 1 or 2, it will be set to melee attack. If set to 3 or more, it will be set to ranged attack.
|
||||
Range1: Range of the monster attack. If set to 1 or 2, it will be set to melee attack. If set to 3 or more, it will be set to ranged attack.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
ATK1: The minimum attack of the mob.
|
||||
ATK1: The minimum attack of the monster.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
ATK2: The maximum attack of the mob. If undefined, the value of ATK1 will be used as the absolute attack.
|
||||
ATK2: The maximum attack of the monster. If undefined, the value of ATK1 will be used as the absolute attack.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
DEF: Physical defense of the mob. (hint: 100 DEF = Immune to melee/ranged physical attack below 8k. Direct hit attacks are drastically reduced. If you set this value high enough, it will make monks easy to level, because of the skill Psychic Wave/Occult Impact/Investigate.)
|
||||
DEF: Physical defense of the monster, reduce melee & ranged physical attack/skill.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
MDEF: Magic defense of the mob (Hint: 100 MDEF = Golden Thief Bug effect, immune to magical attack below 9k. It's for all magic-using skills.)
|
||||
MDEF: Magic defense of the monster, reduce magical skill.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
STR: Strength of the mob. Affects ATK.
|
||||
STR: Strength of the monster. Affects ATK.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
AGI: Agility of the mob. Affects FLEE.
|
||||
AGI: Agility of the monster. Affects FLEE.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
VIT: Vitality of the mob. Adds additional DEF.
|
||||
VIT: Vitality of the monster. Adds additional DEF.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
INT: Intelligence of the mob. Adds additional MATK.
|
||||
INT: Intelligence of the monster. Adds additional MATK.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
DEX: Dexterity of the mob. Affects HIT rate.
|
||||
DEX: Dexterity of the monster. Affects HIT rate.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
LUK: Luck of the mob. Affects Perfect dodge/Lucky flee/Perfect flee/Lucky dodge rate.
|
||||
LUK: Luck of the monster. Affects Perfect dodge/Lucky flee/Perfect flee/Lucky dodge rate.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
@ -96,66 +96,82 @@ Range2: Maximum Skill Range.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
Range3: Sight limit of the mob. If set to 1000 or beyond, the mob will follow you all over the map.
|
||||
Range3: Sight limit of the monster. If set to 1000 or beyond, the monster will follow you all over the map.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
Scale: Size of the mob. 0=Small, 1=Medium, 2=Large.
|
||||
Scale: Size of the monster
|
||||
|
||||
0 = Small
|
||||
1 = Medium
|
||||
2 = Large
|
||||
|
||||
---------------------------------------
|
||||
|
||||
Race: Race of the mob. 0=Formless, 1=Undead, 2=Brute, 3=Plant, 4=Insect, 5=Fish, 6=Demon, 7=Demi Human, 8=Angel, 9=Dragon.
|
||||
Race: Race of the monster
|
||||
|
||||
0 = Formless
|
||||
1 = Undead
|
||||
2 = Brute
|
||||
3 = Plant
|
||||
4 = Insect
|
||||
5 = Fish
|
||||
6 = Demon
|
||||
7 = Demi-Human
|
||||
8 = Angel
|
||||
9 = Dragon.
|
||||
10 = Player (default race for player)
|
||||
|
||||
Demi-Human is not same nor includes Player.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
Element: Element of the mob. Use 2 digits.
|
||||
Type Lv1,Lv2,Lv3,Lv4
|
||||
Neutral 20,40,60,80
|
||||
Water 21,41,61,81
|
||||
Earth 22,42,62,82
|
||||
Fire 23,43,63,83
|
||||
Wind 24,44,64,84
|
||||
Poison 25,45,65,85
|
||||
Holy 26,46,66,86
|
||||
Shadow 27,47,67,87
|
||||
Ghost 28,48,68,88
|
||||
Undead 29,49,69,89
|
||||
Element: Element of the monster, also for Element of db/elemental_db.txt, db/mercenary_db.txt, and db/[pre-]re/homunculus_db.txt
|
||||
|
||||
+-----------+-------+-------+-------+-------+
|
||||
| Type | Lv1 | Lv2 | Lv3 | Lv4 |
|
||||
+-----------+-------+-------+-------+-------+
|
||||
| Neutral | 20 | 40 | 60 | 80 |
|
||||
| Water | 21 | 41 | 61 | 81 |
|
||||
| Earth | 22 | 42 | 62 | 82 |
|
||||
| Fire | 23 | 43 | 63 | 83 |
|
||||
| Wind | 24 | 44 | 64 | 84 |
|
||||
| Poison | 25 | 45 | 65 | 85 |
|
||||
| Holy | 26 | 46 | 66 | 86 |
|
||||
| Shadow | 27 | 47 | 67 | 87 |
|
||||
| Ghost | 28 | 48 | 68 | 88 |
|
||||
| Undead | 29 | 49 | 69 | 89 |
|
||||
+-----------+-------+-------+-------+-------+
|
||||
| For custom start from 30, 50, 70, and 90 |
|
||||
+-----------+-------+-------+-------+-------+
|
||||
|
||||
---------------------------------------
|
||||
|
||||
Mode: Behaviour of the mob.
|
||||
1 CanMove
|
||||
2 Looter
|
||||
4 Aggressive
|
||||
8 Assist
|
||||
16 CastSensor
|
||||
32 Boss
|
||||
64 Plant
|
||||
128 CanAttack
|
||||
256 Detector
|
||||
512 ChangeTarget
|
||||
Add them up to make the mob to have multiple modes.
|
||||
Full explanation can be found on \doc\mob_db_mode_list.txt
|
||||
Mode: Behaviour of the monster. Full explanation can be found on 'doc/mob_db_mode_list.txt'
|
||||
|
||||
---------------------------------------
|
||||
|
||||
Speed: Walk speed of the mob. 1=Fastest, 1000=Slowest. 100 = Normal.
|
||||
Speed: Walk speed of the monster
|
||||
|
||||
1 = Fastest
|
||||
100 = Normal
|
||||
1000 = Slowest
|
||||
|
||||
---------------------------------------
|
||||
|
||||
aDelay: Attack Delay of the mob, also known as ASPD. Low value=Faster attack speed, but don't make it too low or it will lag when a player got mobbed by several of these mobs.
|
||||
aDelay: Attack Delay of the monster, also known as ASPD. Low value means faster attack speed, but don't make it too low or it will lag when a player got mobbed by several of these mobs.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
aMotion: Attack animation motion. Low value=Mob's attack will be displayed in higher fps (making it shorter, too) (Thanks to Wallex for this)
|
||||
aMotion: Attack animation motion. Low value means monster's attack will be displayed in higher fps (making it shorter, too) (Thanks to Wallex for this)
|
||||
|
||||
---------------------------------------
|
||||
|
||||
dMotion: Damage animation motion, same as aMotion but used to display the "I am hit" animation. Coincidentally, this same value is used to determine how long it is before the mob/player can move again. Endure is dMotion = 0, obviously.
|
||||
dMotion: Damage animation motion, same as aMotion but used to display the "I am hit" animation. Coincidentally, this same value is used to determine how long it is before the monster/player can move again. Endure is dMotion = 0, obviously.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
MEXP: The MVP Experience point the mob gives when it is defeated (to the player who got the MVP reward) (This exp is a percentage of the exp the monster gives.)
|
||||
MEXP: The MVP Experience point the monster gives when it is defeated (to the player who got the MVP reward) (This exp is a percentage of the exp the monster gives.)
|
||||
|
||||
---------------------------------------
|
||||
|
||||
@ -163,7 +179,7 @@ MVP1-3id: The Item ID of the MVP drop goes here. Maximum of 3 items.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
MVP1-3per: The rate of the MVP item being dropped. 100 = 100%
|
||||
MVP1-3per: The rate of the MVP item being dropped, n/10000.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
@ -171,14 +187,14 @@ Drop1-9id: The Item ID of the drop goes here. Maximum of 9 items.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
Drop1-9per: The rate of the item being dropped. 100 = 100%
|
||||
Drop1-9per: The rate of the item being dropped, n/10000.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
DropCardid: The Item ID of the mob's card (if any).
|
||||
DropCardid: The Item ID of the monster's card (if any).
|
||||
|
||||
---------------------------------------
|
||||
|
||||
DropCardper: The rate of the card being dropped. 100 = 100%
|
||||
DropCardper: The rate of the card being dropped, n/10000.
|
||||
|
||||
---------------------------------------
|
||||
|
@ -8,33 +8,34 @@
|
||||
//= A reference description of rAthena's mob_db 'mode' field.
|
||||
//============================================================
|
||||
|
||||
Bit Legend:
|
||||
Bit Legend
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
MD_CANMOVE | 0x000001 | 1
|
||||
MD_LOOTER | 0x000002 | 2
|
||||
MD_AGGRESSIVE | 0x000004 | 4
|
||||
MD_ASSIST | 0x000008 | 8
|
||||
MD_CASTSENSOR_IDLE | 0x000010 | 16
|
||||
MD_BOSS | 0x000020 | 32
|
||||
MD_PLANT | 0x000040 | 64
|
||||
MD_CANATTACK | 0x000080 | 128
|
||||
MD_DETECTOR | 0x000100 | 256
|
||||
MD_CASTSENSOR_CHASE | 0x000200 | 512
|
||||
MD_CHANGECHASE | 0x000400 | 1024
|
||||
MD_ANGRY | 0x000800 | 2048
|
||||
MD_CHANGETARGET_MELEE | 0x001000 | 4096
|
||||
MD_CHANGETARGET_CHASE | 0x002000 | 8192
|
||||
MD_TARGETWEAK | 0x004000 | 16384
|
||||
MD_RANDOMTARGET | 0x008000 | 32768
|
||||
MD_IGNOREMELEE | 0x010000 | 65536
|
||||
MD_IGNOREMAGIC | 0x020000 | 131072
|
||||
MD_IGNORERANGED | 0x040000 | 262144
|
||||
MD_MVP | 0x080000 | 524288
|
||||
MD_CANMOVE | 0x000001 | 1
|
||||
MD_LOOTER | 0x000002 | 2
|
||||
MD_AGGRESSIVE | 0x000004 | 4
|
||||
MD_ASSIST | 0x000008 | 8
|
||||
MD_CASTSENSOR_IDLE | 0x000010 | 16
|
||||
MD_BOSS | 0x000020 | 32
|
||||
MD_PLANT | 0x000040 | 64
|
||||
MD_CANATTACK | 0x000080 | 128
|
||||
MD_DETECTOR | 0x000100 | 256
|
||||
MD_CASTSENSOR_CHASE | 0x000200 | 512
|
||||
MD_CHANGECHASE | 0x000400 | 1024
|
||||
MD_ANGRY | 0x000800 | 2048
|
||||
MD_CHANGETARGET_MELEE | 0x001000 | 4096
|
||||
MD_CHANGETARGET_CHASE | 0x002000 | 8192
|
||||
MD_TARGETWEAK | 0x004000 | 16384
|
||||
MD_RANDOMTARGET | 0x008000 | 32768
|
||||
MD_IGNOREMELEE | 0x010000 | 65536
|
||||
MD_IGNOREMAGIC | 0x020000 | 131072
|
||||
MD_IGNORERANGED | 0x040000 | 262144
|
||||
MD_MVP | 0x080000 | 524288
|
||||
MD_IGNOREMISC | 0x100000 | 1048576
|
||||
MD_KNOCKBACK_IMMUNE | 0x200000 | 2097152
|
||||
|
||||
Explanation for modes:
|
||||
|
||||
Explanation for modes
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
CanMove: Enables the mob to move/chase characters.
|
||||
@ -94,7 +95,8 @@ Ignore Misc: The mob will take 1 HP damage from "none" attack type.
|
||||
|
||||
Knockback Immune: The mob will be unable to be knocked back.
|
||||
|
||||
Aegis Mob Types:
|
||||
|
||||
Aegis Mob Types
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
What Aegis has are mob-types, where each type represents an AI behavior that
|
||||
|
@ -6930,9 +6930,9 @@ ACMD_FUNC(mail)
|
||||
*------------------------------------------*/
|
||||
ACMD_FUNC(mobinfo)
|
||||
{
|
||||
unsigned char msize[3][7] = {"Small", "Medium", "Large"};
|
||||
unsigned char mrace[12][11] = {"Formless", "Undead", "Beast", "Plant", "Insect", "Fish", "Demon", "Demi-Human", "Angel", "Dragon", "Boss", "Non-Boss"};
|
||||
unsigned char melement[10][8] = {"Neutral", "Water", "Earth", "Fire", "Wind", "Poison", "Holy", "Dark", "Ghost", "Undead"};
|
||||
unsigned char msize[SZ_ALL][7] = { "Small", "Medium", "Large" };
|
||||
unsigned char mrace[RC_ALL][11] = { "Formless", "Undead", "Beast", "Plant", "Insect", "Fish", "Demon", "Demi-Human", "Angel", "Dragon", "Player" };
|
||||
unsigned char melement[ELE_ALL][8] = { "Neutral", "Water", "Earth", "Fire", "Wind", "Poison", "Holy", "Dark", "Ghost", "Undead" };
|
||||
char atcmd_output2[CHAT_SIZE_MAX];
|
||||
struct item_data *item_data;
|
||||
struct mob_db *mob, *mob_array[MAX_SEARCH];
|
||||
|
@ -309,10 +309,14 @@ int battle_delay_damage(unsigned int tick, int amotion, struct block_list *src,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get attribute ratio
|
||||
* @param atk_elem Attack element enum e_element
|
||||
* @param def_type Defense element enum e_element
|
||||
* @param def_lv Element level 1 ~ MAX_ELE_LEVEL
|
||||
*/
|
||||
int battle_attr_ratio(int atk_elem,int def_type, int def_lv) {
|
||||
if (!CHK_ELEMENT(atk_elem))
|
||||
return 100;
|
||||
if (!CHK_ELEMENT(def_type) || def_lv < 1 || def_lv > 4)
|
||||
if (!CHK_ELEMENT(atk_elem) || !CHK_ELEMENT(def_type) || !CHK_ELEMENT_LEVEL(def_lv))
|
||||
return 100;
|
||||
|
||||
return attr_fix_table[def_lv-1][atk_elem][def_type];
|
||||
@ -334,8 +338,7 @@ int64 battle_attr_fix(struct block_list *src, struct block_list *target, int64 d
|
||||
if (!CHK_ELEMENT(atk_elem))
|
||||
atk_elem = rnd()%ELE_ALL;
|
||||
|
||||
if (!CHK_ELEMENT(def_type) ||
|
||||
def_lv < 1 || def_lv > 4) {
|
||||
if (!CHK_ELEMENT(def_type) || !CHK_ELEMENT_LEVEL(def_lv)) {
|
||||
ShowError("battle_attr_fix: unknown attr type: atk=%d def_type=%d def_lv=%d\n",atk_elem,def_type,def_lv);
|
||||
return damage;
|
||||
}
|
||||
@ -343,18 +346,18 @@ int64 battle_attr_fix(struct block_list *src, struct block_list *target, int64 d
|
||||
ratio = attr_fix_table[def_lv-1][atk_elem][def_type];
|
||||
if (sc && sc->count) { //increase dmg by src status
|
||||
switch(atk_elem){
|
||||
case ELE_FIRE:
|
||||
if(sc->data[SC_VOLCANO]) ratio += enchant_eff[sc->data[SC_VOLCANO]->val1-1];
|
||||
break;
|
||||
case ELE_WIND:
|
||||
if(sc->data[SC_VIOLENTGALE]) ratio += enchant_eff[sc->data[SC_VIOLENTGALE]->val1-1];
|
||||
break;
|
||||
case ELE_WATER:
|
||||
if(sc->data[SC_DELUGE]) ratio += enchant_eff[sc->data[SC_DELUGE]->val1-1];
|
||||
break;
|
||||
case ELE_GHOST:
|
||||
if(sc->data[SC_TELEKINESIS_INTENSE]) ratio += (sc->data[SC_TELEKINESIS_INTENSE]->val3);
|
||||
break;
|
||||
case ELE_FIRE:
|
||||
if(sc->data[SC_VOLCANO]) ratio += enchant_eff[sc->data[SC_VOLCANO]->val1-1];
|
||||
break;
|
||||
case ELE_WIND:
|
||||
if(sc->data[SC_VIOLENTGALE]) ratio += enchant_eff[sc->data[SC_VIOLENTGALE]->val1-1];
|
||||
break;
|
||||
case ELE_WATER:
|
||||
if(sc->data[SC_DELUGE]) ratio += enchant_eff[sc->data[SC_DELUGE]->val1-1];
|
||||
break;
|
||||
case ELE_GHOST:
|
||||
if(sc->data[SC_TELEKINESIS_INTENSE]) ratio += (sc->data[SC_TELEKINESIS_INTENSE]->val3);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if( target && target->type == BL_SKILL ) {
|
||||
|
@ -808,14 +808,14 @@ static bool read_elementaldb_sub(char* str[], int columns, int current) {
|
||||
status->race = atoi(str[20]);
|
||||
|
||||
ele = atoi(str[21]);
|
||||
status->def_ele = ele%10;
|
||||
status->ele_lv = ele/20;
|
||||
status->def_ele = ele%20;
|
||||
status->ele_lv = (unsigned char)floor(ele/20.);
|
||||
if( !CHK_ELEMENT(status->def_ele) ) {
|
||||
ShowWarning("read_elementaldb_sub: Elemental %d has invalid element type %d (max element is %d)\n", db->class_, status->def_ele, ELE_ALL - 1);
|
||||
status->def_ele = ELE_NEUTRAL;
|
||||
}
|
||||
if( status->ele_lv < 1 || status->ele_lv > 4 ) {
|
||||
ShowWarning("read_elementaldb_sub: Elemental %d has invalid element level %d (max is 4)\n", db->class_, status->ele_lv);
|
||||
if( !CHK_ELEMENT_LEVEL(status->ele_lv) ) {
|
||||
ShowWarning("read_elementaldb_sub: Elemental %d has invalid element level %d (max is %d)\n", db->class_, status->ele_lv, MAX_ELE_LEVEL);
|
||||
status->ele_lv = 1;
|
||||
}
|
||||
|
||||
|
@ -304,8 +304,8 @@ enum bl_type {
|
||||
enum npc_subtype { WARP, SHOP, SCRIPT, CASHSHOP, ITEMSHOP, POINTSHOP, TOMB };
|
||||
|
||||
enum e_race {
|
||||
RC_NONE_=-1, //don't give us bonus
|
||||
RC_FORMLESS=0,
|
||||
RC_NONE_ = -1, //don't give us bonus
|
||||
RC_FORMLESS = 0,
|
||||
RC_UNDEAD,
|
||||
RC_BRUTE,
|
||||
RC_PLANT,
|
||||
@ -321,7 +321,7 @@ enum e_race {
|
||||
};
|
||||
|
||||
enum e_classAE {
|
||||
CLASS_NONE=-1, //don't give us bonus
|
||||
CLASS_NONE = -1, //don't give us bonus
|
||||
CLASS_NORMAL = 0,
|
||||
CLASS_BOSS,
|
||||
CLASS_GUARDIAN,
|
||||
@ -340,7 +340,8 @@ enum e_race2 {
|
||||
RC2_MAX
|
||||
};
|
||||
|
||||
enum e_elemen {
|
||||
/// Element list
|
||||
enum e_element {
|
||||
ELE_NONE=-1,
|
||||
ELE_NEUTRAL=0,
|
||||
ELE_WATER,
|
||||
@ -356,6 +357,8 @@ enum e_elemen {
|
||||
ELE_MAX
|
||||
};
|
||||
|
||||
#define MAX_ELE_LEVEL 4 /// Maximum Element level
|
||||
|
||||
enum mob_ai {
|
||||
AI_NONE = 0,
|
||||
AI_ATTACK,
|
||||
@ -868,6 +871,7 @@ void map_addmap2db(struct map_data *m);
|
||||
void map_removemapdb(struct map_data *m);
|
||||
|
||||
#define CHK_ELEMENT(ele) ((ele) > ELE_NONE && (ele) < ELE_MAX) /// Check valid Element
|
||||
#define CHK_ELEMENT_LEVEL(lv) ((lv) >= 1 && (lv) <= MAX_ELE_LEVEL) /// Check valid element level
|
||||
#define CHK_RACE(race) ((race) > RC_NONE_ && (race) < RC_MAX) /// Check valid Race
|
||||
#define CHK_RACE2(race2) ((race2) >= RC2_NONE && (race2) < RC2_MAX) /// Check valid Race2
|
||||
#define CHK_CLASS(class_) ((class_) > CLASS_NONE && (class_) < CLASS_MAX) /// Check valid Class
|
||||
|
@ -514,16 +514,16 @@ static bool mercenary_readdb_sub(char* str[], int columns, int current)
|
||||
status->race = atoi(str[20]);
|
||||
|
||||
ele = atoi(str[21]);
|
||||
status->def_ele = ele%10;
|
||||
status->ele_lv = ele/20;
|
||||
status->def_ele = ele%20;
|
||||
status->ele_lv = (unsigned char)floor(ele/20.);
|
||||
if( !CHK_ELEMENT(status->def_ele) )
|
||||
{
|
||||
ShowWarning("Mercenary %d has invalid element type %d (max element is %d)\n", db->class_, status->def_ele, ELE_ALL - 1);
|
||||
status->def_ele = ELE_NEUTRAL;
|
||||
}
|
||||
if( status->ele_lv < 1 || status->ele_lv > 4 )
|
||||
if( !CHK_ELEMENT_LEVEL(status->ele_lv) )
|
||||
{
|
||||
ShowWarning("Mercenary %d has invalid element level %d (max is 4)\n", db->class_, status->ele_lv);
|
||||
ShowWarning("Mercenary %d has invalid element level %d (max is %d)\n", db->class_, status->ele_lv, MAX_ELE_LEVEL);
|
||||
status->ele_lv = 1;
|
||||
}
|
||||
|
||||
|
@ -3778,14 +3778,14 @@ static bool mob_parse_dbrow(char** str)
|
||||
status->race = atoi(str[23]);
|
||||
|
||||
i = atoi(str[24]); //Element
|
||||
status->def_ele = i%10;
|
||||
status->ele_lv = i/20;
|
||||
status->def_ele = i%20;
|
||||
status->ele_lv = (unsigned char)floor(i/20.);
|
||||
if (!CHK_ELEMENT(status->def_ele)) {
|
||||
ShowError("mob_parse_dbrow: Invalid element type %d for monster ID %d (max=%d).\n", status->def_ele, mob_id, ELE_ALL-1);
|
||||
return false;
|
||||
}
|
||||
if (status->ele_lv < 1 || status->ele_lv > 4) {
|
||||
ShowError("mob_parse_dbrow: Invalid element level %d for monster ID %d, must be in range 1-4.\n", status->ele_lv, mob_id);
|
||||
if (!CHK_ELEMENT_LEVEL(status->ele_lv)) {
|
||||
ShowError("mob_parse_dbrow: Invalid element level %d for monster ID %d, must be in range 1-%d.\n", status->ele_lv, mob_id, MAX_ELE_LEVEL);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -6466,6 +6466,7 @@ BUILDIN_FUNC(checkweight2){
|
||||
* getitembound <item id>,<amount>,<type>{,<account ID>};
|
||||
* getitembound "<item id>",<amount>,<type>{,<account ID>};
|
||||
* Type:
|
||||
* 0 - No bound
|
||||
* 1 - Account Bound
|
||||
* 2 - Guild Bound
|
||||
* 3 - Party Bound
|
||||
@ -6509,20 +6510,19 @@ BUILDIN_FUNC(getitem)
|
||||
memset(&it,0,sizeof(it));
|
||||
it.nameid = nameid;
|
||||
it.identify = 1;
|
||||
it.bound = BOUND_NONE;
|
||||
|
||||
if( !strcmp(command,"getitembound") ) {
|
||||
char bound = script_getnum(st,4);
|
||||
if( bound > BOUND_NONE && bound < BOUND_MAX ) {
|
||||
it.bound = bound;
|
||||
if( script_hasdata(st,5) )
|
||||
sd = map_id2sd(script_getnum(st,5));
|
||||
else
|
||||
sd = script_rid2sd(st); // Attached player
|
||||
}
|
||||
else { //Not a correct bound type
|
||||
if( bound < BOUND_NONE || bound >= BOUND_MAX ) {
|
||||
ShowError("script_getitembound: Not a correct bound type! Type=%d\n",bound);
|
||||
return SCRIPT_CMD_FAILURE;
|
||||
}
|
||||
if( script_hasdata(st,5) )
|
||||
sd = map_id2sd(script_getnum(st,5));
|
||||
else
|
||||
sd = script_rid2sd(st); // Attached player
|
||||
it.bound = bound;
|
||||
} else if( script_hasdata(st,4) )
|
||||
sd = map_id2sd(script_getnum(st,4)); // <Account ID>
|
||||
else
|
||||
@ -6554,7 +6554,17 @@ BUILDIN_FUNC(getitem)
|
||||
}
|
||||
|
||||
/*==========================================
|
||||
* getitem2 <item id>,<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<account ID>};
|
||||
* getitem2 "<item name>",<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<account ID>};
|
||||
*
|
||||
* getitembound2 <item id>,<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>,<bound type>{,<account ID>};
|
||||
* getitembound2 "<item name>",<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>,<bound type>{,<account ID>};
|
||||
* Type:
|
||||
* 0 - No bound
|
||||
* 1 - Account Bound
|
||||
* 2 - Guild Bound
|
||||
* 3 - Party Bound
|
||||
* 4 - Character Bound
|
||||
*------------------------------------------*/
|
||||
BUILDIN_FUNC(getitem2)
|
||||
{
|
||||
@ -6572,16 +6582,14 @@ BUILDIN_FUNC(getitem2)
|
||||
|
||||
if( !strcmp(command,"getitembound2") ) {
|
||||
bound = script_getnum(st,11);
|
||||
if( bound > BOUND_NONE && bound < BOUND_MAX ) {
|
||||
if( script_hasdata(st,12) )
|
||||
sd = map_id2sd(script_getnum(st,12));
|
||||
else
|
||||
sd = script_rid2sd(st); // Attached player
|
||||
}
|
||||
else {
|
||||
if( bound < BOUND_NONE || bound >= BOUND_MAX ) {
|
||||
ShowError("script_getitembound2: Not a correct bound type! Type=%d\n",bound);
|
||||
return SCRIPT_CMD_FAILURE;
|
||||
}
|
||||
if( script_hasdata(st,12) )
|
||||
sd = map_id2sd(script_getnum(st,12));
|
||||
else
|
||||
sd = script_rid2sd(st); // Attached player
|
||||
} else if( script_hasdata(st,11) )
|
||||
sd = map_id2sd(script_getnum(st,11)); // <Account ID>
|
||||
else
|
||||
|
@ -12693,47 +12693,42 @@ static bool status_readdb_refine(char* fields[], int columns, int current)
|
||||
static bool status_readdb_attrfix(const char *basedir,bool silent)
|
||||
{
|
||||
FILE *fp;
|
||||
char line[512], path[512],*p;
|
||||
int entries=0;
|
||||
char line[512], path[512];
|
||||
int entries = 0;
|
||||
|
||||
|
||||
sprintf(path, "%s/attr_fix.txt", basedir);
|
||||
fp=fopen(path,"r");
|
||||
if(fp==NULL) {
|
||||
if(silent==0) ShowError("can't read %s\n", path);
|
||||
fp = fopen(path,"r");
|
||||
if (fp == NULL) {
|
||||
if (silent==0)
|
||||
ShowError("Can't read %s\n", path);
|
||||
return 1;
|
||||
}
|
||||
while(fgets(line, sizeof(line), fp))
|
||||
{
|
||||
char *split[10];
|
||||
int lv,n,i,j;
|
||||
if(line[0]=='/' && line[1]=='/')
|
||||
continue;
|
||||
for(j=0,p=line;j<3 && p;j++) {
|
||||
split[j]=p;
|
||||
p=strchr(p,',');
|
||||
if(p) *p++=0;
|
||||
}
|
||||
if( j < 2 )
|
||||
while (fgets(line, sizeof(line), fp)) {
|
||||
int lv, i, j;
|
||||
if (line[0] == '/' && line[1] == '/')
|
||||
continue;
|
||||
|
||||
lv=atoi(split[0]);
|
||||
n=atoi(split[1]);
|
||||
lv = atoi(line);
|
||||
if (!CHK_ELEMENT_LEVEL(lv))
|
||||
continue;
|
||||
|
||||
for(i=0;i<n && i<ELE_ALL;) {
|
||||
if( !fgets(line, sizeof(line), fp) )
|
||||
for (i = 0; i < ELE_ALL;) {
|
||||
char *p;
|
||||
if (!fgets(line, sizeof(line), fp))
|
||||
break;
|
||||
if(line[0]=='/' && line[1]=='/')
|
||||
if (line[0]=='/' && line[1]=='/')
|
||||
continue;
|
||||
|
||||
for(j=0,p=line;j<n && j<ELE_ALL && p;j++) {
|
||||
while(*p>0 && *p==32) //skipping newline and space (32=' ')
|
||||
for (j = 0, p = line; j < ELE_ALL && p; j++) {
|
||||
while (*p > 0 && *p == 32) //skipping newline and space (32=' ')
|
||||
p++;
|
||||
attr_fix_table[lv-1][i][j]=atoi(p);
|
||||
if(battle_config.attr_recover == 0 && attr_fix_table[lv-1][i][j] < 0)
|
||||
attr_fix_table[lv-1][i][j] = atoi(p);
|
||||
if (battle_config.attr_recover == 0 && attr_fix_table[lv-1][i][j] < 0)
|
||||
attr_fix_table[lv-1][i][j] = 0;
|
||||
p=strchr(p,',');
|
||||
if(p) *p++=0;
|
||||
p = strchr(p,',');
|
||||
if(p)
|
||||
*p++=0;
|
||||
}
|
||||
|
||||
i++;
|
||||
|
Loading…
x
Reference in New Issue
Block a user