summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/ISSUE_TEMPLATE.md54
-rw-r--r--.github/ISSUE_TEMPLATE/bug_report.md36
-rw-r--r--.github/ISSUE_TEMPLATE/feature_request.md19
-rw-r--r--.github/PULL_REQUEST_TEMPLATE.md33
-rw-r--r--.travis.yml12
-rw-r--r--README.md2
-rw-r--r--conf/groups.conf3
-rw-r--r--conf/map/battle/items.conf8
-rw-r--r--conf/map/battle/skill.conf6
-rw-r--r--conf/messages.conf3
-rw-r--r--db/pre-re/skill_db.conf2
-rw-r--r--db/re/skill_db.conf2
-rw-r--r--doc/atcommands.txt6
-rw-r--r--doc/constants.md15
-rw-r--r--doc/effect_list.md1126
-rw-r--r--doc/effect_list.txt986
-rw-r--r--doc/global_configuration.md65
-rw-r--r--doc/global_configuration.txt69
-rw-r--r--doc/permissions.md51
-rw-r--r--doc/permissions.txt39
-rw-r--r--doc/sample/getiteminfo.txt9
-rw-r--r--doc/script_commands.txt53
-rw-r--r--npc/dev/test.txt6
-rw-r--r--npc/other/Global_Functions.txt37
-rw-r--r--src/common/HPMDataCheck.h2
-rw-r--r--src/common/mmo.h3
-rw-r--r--src/map/achievement.c73
-rw-r--r--src/map/achievement.h4
-rw-r--r--src/map/atcommand.c19
-rw-r--r--src/map/battle.c37
-rw-r--r--src/map/battle.h6
-rw-r--r--src/map/clif.c175
-rw-r--r--src/map/clif.h6
-rw-r--r--src/map/guild.c5
-rw-r--r--src/map/map.h1
-rw-r--r--src/map/messages_main.h44
-rw-r--r--src/map/messages_re.h6
-rw-r--r--src/map/messages_zero.h6
-rw-r--r--src/map/packets.h42
-rw-r--r--src/map/packets_keys_main.h6
-rw-r--r--src/map/packets_keys_zero.h6
-rw-r--r--src/map/packets_shuffle_main.h6
-rw-r--r--src/map/packets_shuffle_re.h6
-rw-r--r--src/map/packets_shuffle_zero.h6
-rw-r--r--src/map/packets_struct.h99
-rw-r--r--src/map/pc.c46
-rw-r--r--src/map/pc.h2
-rw-r--r--src/map/quest.c27
-rw-r--r--src/map/quest.h1
-rw-r--r--src/map/script.c234
-rw-r--r--src/map/script.h1
-rw-r--r--src/map/skill.c53
-rw-r--r--src/map/skill.h1
-rw-r--r--src/plugins/HPMHooking/HPMHooking.Defs.inc24
-rw-r--r--src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc32
-rw-r--r--src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc8
-rw-r--r--src/plugins/HPMHooking/HPMHooking_map.Hooks.inc227
57 files changed, 2432 insertions, 1424 deletions
diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
deleted file mode 100644
index c661cbd47..000000000
--- a/.github/ISSUE_TEMPLATE.md
+++ /dev/null
@@ -1,54 +0,0 @@
-[//]: # (**********************************)
-[//]: # (** Fill in the following fields **)
-[//]: # (**********************************)
-
-[//]: # (Note: Lines beginning with syntax such as this one, are comments and will not be visible in your report!)
-
-### Issue Prelude
-
-[//]: # (Please complete these mandatory steps and check the following boxes by putting an `x` inside the brackets _before_ filing your issue)
-
-- [ ] I have not modified the source prior to reproducing this issue.
-- [ ] I am using the latest version of Hercules.
-- [ ] I am aware that this report will be closed or deleted if it becomes obvious that I am stating the false.
-
-### Description
-
-[//]: # (Description of the problem or issue at length.)
-[//]: # (Please specify any battle configuration related to the components of this issue that have been changed from the default values. This will allow quicker determination of the cause of the problem.)
-
-### Current Behavior
-
-[//]: # (Describe at length what you noticed during your analysis.)
-[//]: # (If this is a crash, post the core/stack-dump or crash-log to https://gist.github.com/)
-[//]: # (If you are referencing from sources such as iROwiki or ratemyserver.net, please quote specific information rather than providing the links alone.)
-
-### Expected Behavior
-
-[//]: # (Tell us what should happen instead.)
-
-### Steps To Reproduce The Issue
-
-1. Step 1
-2. Step 2
-3. Step 3
-
-**Branch(es):**
-- [ ] master
-- [ ] other
-
-**Hercules rev. hash/commit:**
-
-Git revision src:
-
-[//]: # (Copy the first 3 lines of the login-server, char-server or map-server startup.)
-[//]: # ( [Info]: Hercules 64-bit for Mac OS X )
-[//]: # ( [Info]: Git revision src: 'a5918b329ca0826b04dca32ede783586403f58db' )
-[//]: # ( [Info]: Git revision scripts: 'a5918b329ca0826b04dca32ede783586403f58db' )
-
-### Operating System
-
-[//]: # (Mac OS X 10.12.3 16D32 [x86_64])
-[//]: # (Thank you for adhering to this process! It ensures your issue is resolved quickly and that neither your nor our time is needlessly wasted.)
-[//]: # (This template is for problem reports. For other types of report, edit it accordingly.)
-[//]: # (For fixes please create a Pull Request.)
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 000000000..95da04be6
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,36 @@
+---
+name: Bug report
+about: Create a report to help us improve
+
+---
+
+**Describe the bug**
+A clear and concise description of what the bug is.
+
+**To Reproduce**
+Steps to reproduce the behavior:
+1. Go to '...'
+2. Click on '....'
+3. Use skill '....'
+4. See error
+
+**Expected behavior**
+A clear and concise description of what you expected to happen.
+
+**Screenshots**
+If applicable, add screenshots to help explain your problem.
+
+**System specs (please complete the following information):**
+ - OS: [e.g. windows 10 version 1809, macOS 10.14]
+ - Hercules Version [e.g. v2018.09.22]
+ - Mode: [renewal or pre-renewal?]
+ - Packet version: [e.g. 20101130]
+ - Client type: [e.g. main, RE, zero, sak, ad]
+
+**Plugins used or source modifications**
+If you are using any plugins besides the ones that come bundled with Hercules,
+please enumerate them here.
+
+**Additional context**
+Add any other context about the problem here. If the bug report is about a
+crash, please attach the core/stack-dump or crash-log, if any.
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 000000000..654402b7f
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,19 @@
+---
+name: Feature request
+about: Suggest an idea for this project
+
+---
+
+**Is your feature request related to a problem? Please describe.**
+A clear and concise description of what the problem is. Ex. I'm always
+frustrated when [...]
+
+**Describe the solution you'd like**
+A clear and concise description of what you want to happen.
+
+**Describe alternatives you've considered**
+A clear and concise description of any alternative solutions or features you've
+considered.
+
+**Additional context**
+Add any other context or screenshots about the feature request here.
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index c62641f08..48ddba651 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -1,37 +1,28 @@
-[//]: # (**********************************)
-[//]: # (** Fill in the following fields **)
-[//]: # (**********************************)
+<!-- Before you continue, please change "base: stable" to "base: master" and
+ enable the setting "[√] Allow edits from maintainers." when creating your
+ pull request if you have not already enabled it. -->
-[//]: # (Note: Lines beginning with syntax such as this one, are comments and will not be visible in your report!)
+<!-- Note: Lines with this <!-- syntax are comments and will not be visible in
+ your pull request. You can safely ignore or remove them. -->
### Pull Request Prelude
-[//]: # (Thank you for working on improving Hercules!)
-
-[//]: # (Please complete these steps and check the following boxes by putting an `x` inside the brackets _before_ filing your Pull Request.)
+<!-- Thank you for working on improving Hercules! -->
+<!-- Please complete these steps and check the following boxes by putting an `x`
+ inside the [brackets] before filing your Pull Request. -->
- [ ] I have followed [proper Hercules code styling][code].
- [ ] I have read and understood the [contribution guidelines][cont] before making this PR.
-- [ ] I am aware that this PR will be closed if the above-mentioned criteria are not fulfilled.
+- [ ] I am aware that this PR may be closed if the above-mentioned criteria are not fulfilled.
### Changes Proposed
-[//]: # (Describe at length, the changes that this pull request makes.)
-
-**Affected Branches:**
-
-[//]: # (Master? Slave?)
-
-**Issues addressed:**
-
-[//]: # (Issue Tracker Number if any.)
+<!-- Describe the changes that this pull request makes. -->
-### Known Issues and TODO List
+**Issues addressed:** <!-- Write here the issue number, if any. -->
-[//]: # (Insert checklist here)
-[//]: # (Syntax: - [ ] Checkbox)
-[//]: # (**NOTE** Enable the setting "[√] Allow edits from maintainers." when creating your pull request if you have not already enabled it.)
+<!-- You can safely ignore the links below: -->
[cont]: https://github.com/HerculesWS/Hercules/blob/master/CONTRIBUTING.md
[code]: https://github.com/HerculesWS/Hercules/wiki/Coding-Style
diff --git a/.travis.yml b/.travis.yml
index fc28a5aef..9312dac9e 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -38,7 +38,7 @@ matrix:
- compiler: false
include:
- compiler: gcc
- env: LDFLAGS="-fuse-ld=gold" CONFIGURE_FLAGS="--enable-debug CC=gcc-6 --disable-manager --enable-Werror --enable-packetver=20180919 --enable-packetver-re --enable-buildbot" HPM="1"
+ env: LDFLAGS="-fuse-ld=gold" CONFIGURE_FLAGS="--enable-debug CC=gcc-6 --disable-manager --enable-Werror --enable-packetver=20181017 --enable-packetver-re --enable-buildbot" HPM="1"
addons:
apt:
sources:
@@ -50,7 +50,7 @@ matrix:
- libxml-sax-perl
- libxml-parser-perl
- compiler: clang
- env: CONFIGURE_FLAGS="--enable-debug CC=clang-5.0 --enable-Werror --enable-packetver=20180919 --enable-packetver-re --enable-buildbot"
+ env: CONFIGURE_FLAGS="--enable-debug CC=clang-5.0 --enable-Werror --enable-packetver=20181017 --enable-packetver-re --enable-buildbot"
addons:
apt:
sources:
@@ -68,7 +68,7 @@ matrix:
packages:
- clang-5.0
- compiler: clang
- env: CONFIGURE_FLAGS="--enable-debug CC=clang-4.0 --enable-Werror --enable-packetver=20180919 --enable-packetver-re --enable-buildbot"
+ env: CONFIGURE_FLAGS="--enable-debug CC=clang-4.0 --enable-Werror --enable-packetver=20181017 --enable-packetver-re --enable-buildbot"
addons:
apt:
sources:
@@ -90,11 +90,11 @@ matrix:
- compiler: clang
env: CONFIGURE_FLAGS="--enable-debug --disable-renewal --enable-Werror --enable-buildbot"
- compiler: gcc
- env: CONFIGURE_FLAGS="--enable-debug --enable-Werror --enable-packetver=20180919 --enable-packetver-re --enable-buildbot"
+ env: CONFIGURE_FLAGS="--enable-debug --enable-Werror --enable-packetver=20181017 --enable-packetver-re --enable-buildbot"
- compiler: gcc
env: CONFIGURE_FLAGS="--enable-debug --disable-renewal --enable-Werror --enable-buildbot"
- compiler: gcc
- env: LDFLAGS="-fuse-ld=gold" CONFIGURE_FLAGS="--enable-debug --enable-sanitize=full CC=gcc-5 --disable-manager --enable-Werror --enable-packetver=20180919 --enable-packetver-re --enable-buildbot"
+ env: LDFLAGS="-fuse-ld=gold" CONFIGURE_FLAGS="--enable-debug --enable-sanitize=full CC=gcc-5 --disable-manager --enable-Werror --enable-packetver=20181017 --enable-packetver-re --enable-buildbot"
addons:
apt:
sources:
@@ -110,7 +110,7 @@ matrix:
packages:
- gcc-5
- compiler: gcc
- env: LDFLAGS="-fuse-ld=gold" CONFIGURE_FLAGS="--enable-debug --enable-sanitize=full CC=gcc-6 --disable-manager --enable-Werror --enable-packetver=20180919 --enable-packetver-re --enable-buildbot"
+ env: LDFLAGS="-fuse-ld=gold" CONFIGURE_FLAGS="--enable-debug --enable-sanitize=full CC=gcc-6 --disable-manager --enable-Werror --enable-packetver=20181017 --enable-packetver-re --enable-buildbot"
addons:
apt:
sources:
diff --git a/README.md b/README.md
index 6a543cea6..e780389b6 100644
--- a/README.md
+++ b/README.md
@@ -218,7 +218,7 @@ the weather. For an in-depth explanation, please see /doc/atcommands.txt
The Hercules emulator has a permission system that enables certain groups of
players to perform certain actions, or have access to certain visual
enhancements or in-game activity. To see what permissions are available, they
-are detailed in /doc/permissions.txt
+are detailed in /doc/permissions.md
### Others
There are more files in the /doc/ directory that will help you to create scripts
diff --git a/conf/groups.conf b/conf/groups.conf
index 3f0c34ffb..5756a3412 100644
--- a/conf/groups.conf
+++ b/conf/groups.conf
@@ -47,7 +47,7 @@ Requires 'log_commands' to be enabled in 'conf/logs.conf'.
A group of settings
<permission> : <bool>
If a permission is not included, false is assumed.
-For a full list of available permissions, see: doc/permissions.txt
+For a full list of available permissions, see: doc/permissions.md
<inherit>
A list of group names that given group will inherit commands and permissions
@@ -126,6 +126,7 @@ groups: (
go: true
breakguild: true
channel: true
+ camerainfo: true
}
permissions: {
}
diff --git a/conf/map/battle/items.conf b/conf/map/battle/items.conf
index 144e04ea4..e834b80f6 100644
--- a/conf/map/battle/items.conf
+++ b/conf/map/battle/items.conf
@@ -123,3 +123,11 @@ boarding_halter_speed: 25
// Allow to use items when the storage is open?
// Official: false (Default)
storage_use_item: false
+
+// Minimum item buy price at shop
+// Default: 1
+min_item_buy_price: 1
+
+// Minimum item sell price at shop
+// Default: 0
+min_item_sell_price: 0
diff --git a/conf/map/battle/skill.conf b/conf/map/battle/skill.conf
index d258567a0..64bba68b5 100644
--- a/conf/map/battle/skill.conf
+++ b/conf/map/battle/skill.conf
@@ -307,6 +307,12 @@ dancing_weaponswitch_fix: true
// 1: Traps in GvG make player stop moving right when stepping over it.
skill_trap_type: 0
+// Trap Reflect
+// Whether the damage from traps must be reflected (for example by Reflect Shield or High Orc Card)?
+// true: Aegis - traps are reflected
+// false: Athena - traps are not reflected
+trap_reflect: true
+
// Max Possible Level of Monster skills
// Note: If your MVPs are too tough, reduce it to 10.
mob_max_skilllvl: 100
diff --git a/conf/messages.conf b/conf/messages.conf
index f986e4649..9fc85cb55 100644
--- a/conf/messages.conf
+++ b/conf/messages.conf
@@ -448,7 +448,8 @@
// Return pet to egg message
451: You can't return your pet because your inventory is full.
-//452-497 FREE
+452: usage @camerainfo range rotation latitude
+//453-497 FREE
// Messages of others (not for GM commands)
// ----------------------------------------
diff --git a/db/pre-re/skill_db.conf b/db/pre-re/skill_db.conf
index 4873012aa..21a0f0e78 100644
--- a/db/pre-re/skill_db.conf
+++ b/db/pre-re/skill_db.conf
@@ -4299,6 +4299,7 @@ skill_db: (
Element: "Ele_Wind"
DamageType: {
SplashArea: true
+ SplitDamage: true
IgnoreFlee: true
}
SplashRange: 1
@@ -4350,6 +4351,7 @@ skill_db: (
Element: "Ele_Fire"
DamageType: {
SplashArea: true
+ SplitDamage: true
IgnoreFlee: true
}
SplashRange: 2
diff --git a/db/re/skill_db.conf b/db/re/skill_db.conf
index 4863e4051..ec8548ab2 100644
--- a/db/re/skill_db.conf
+++ b/db/re/skill_db.conf
@@ -4520,6 +4520,7 @@ skill_db: (
Element: "Ele_Wind"
DamageType: {
SplashArea: true
+ SplitDamage: true
IgnoreFlee: true
}
SplashRange: 1
@@ -4572,6 +4573,7 @@ skill_db: (
Element: "Ele_Fire"
DamageType: {
SplashArea: true
+ SplitDamage: true
IgnoreFlee: true
}
SplashRange: 2
diff --git a/doc/atcommands.txt b/doc/atcommands.txt
index fb3628e00..b455d9151 100644
--- a/doc/atcommands.txt
+++ b/doc/atcommands.txt
@@ -1498,3 +1498,9 @@ Reloads the 'conf/clans.conf' file.
Obs: it will reload 'db/clans.conf' too since it's included inside 'conf/clans.conf'
---------------------------------------
+
+@camerainfo {<range>, <rotation>, <latitude>}
+
+Allow show/hide or change client camera parameters
+
+---------------------------------------
diff --git a/doc/constants.md b/doc/constants.md
index 451f2a5fe..1074eb6bc 100644
--- a/doc/constants.md
+++ b/doc/constants.md
@@ -4278,6 +4278,7 @@
- `ITEMINFO_VIEWID`: 14
- `ITEMINFO_MATK`: 15
- `ITEMINFO_VIEWSPRITE`: 16
+- `ITEMINFO_TRADE`: 17
### monster skill states
@@ -4375,6 +4376,20 @@
- `FUNCTION_IS_LOCAL`: 3
- `FUNCTION_IS_LABEL`: 4
+### item trade restrictions
+
+- `ITR_NONE`: 0
+- `ITR_NODROP`: 1
+- `ITR_NOTRADE`: 2
+- `ITR_PARTNEROVERRIDE`: 4
+- `ITR_NOSELLTONPC`: 8
+- `ITR_NOCART`: 16
+- `ITR_NOSTORAGE`: 32
+- `ITR_NOGSTORAGE`: 64
+- `ITR_NOMAIL`: 128
+- `ITR_NOAUCTION`: 256
+- `ITR_ALL`: 511
+
### Renewal
- `RENEWAL`: 1
diff --git a/doc/effect_list.md b/doc/effect_list.md
new file mode 100644
index 000000000..8ba8d36c9
--- /dev/null
+++ b/doc/effect_list.md
@@ -0,0 +1,1126 @@
+# Client Effects List
+A list of client-side effects sorted by ID in ascending order.
+
+# Copyright
+> This file is part of Hercules.
+> http://herc.ws - http://github.com/HerculesWS/Hercules
+>
+> Copyright (C) 2012-2018 Hercules Dev Team
+> Copyright (C) Athena Dev Teams
+>
+> 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 <http://www.gnu.org/licenses/>.
+
+## Description
+The following is a compiled list of visual and sound effects which the client
+can produce. Each list entry contains a number and a short description of the
+effect. You can produce these effects ingame by using the `@effect` atcommand.
+It's also possible to attach effects to item/npc scripts by using the
+`specialeffect()` script command.
+
+ ID | Constant Name | Description
+ --: | :----------------------------- | :----------------------------------
+ -1 | EF_NONE | None
+ 0 | EF_HIT1 | Regular Hit
+ 1 | EF_HIT2 | Bash
+ 2 | EF_HIT3 | Melee Skill Hit
+ 3 | EF_HIT4 | Melee Skill Hit
+ 4 | EF_HIT5 | Melee Skill Hit
+ 5 | EF_HIT6 | Melee Skill Hit
+ 6 | EF_ENTRY | Being Warped
+ 7 | EF_EXIT | Item Heal effect
+ 8 | EF_WARP | Yellow Ripple Effect
+ 9 | EF_ENHANCE | Different Type of Heal
+ 10 | EF_COIN | Mammonite
+ 11 | EF_ENDURE | Endure
+ 12 | EF_BEGINSPELL | Yellow cast aura
+ 13 | EF_GLASSWALL | Blue Box
+ 14 | EF_HEALSP | Blue restoring effect
+ 15 | EF_SOULSTRIKE | Soul Strike
+ 16 | EF_BASH | Hide
+ 17 | EF_MAGNUMBREAK | Magnum Break
+ 18 | EF_STEAL | Steal
+ 19 | EF_HIDING | (Invalid)
+ 20 | EF_PATTACK | Envenom/Poison
+ 21 | EF_DETOXICATION | Detoxify
+ 22 | EF_SIGHT | Sight
+ 23 | EF_STONECURSE | Stone Curse
+ 24 | EF_FIREBALL | Fire Ball
+ 25 | EF_FIREWALL | Fire Wall
+ 26 | EF_ICEARROW | A sound (a swipe?)
+ 27 | EF_FROSTDIVER | Frost Diver (Traveling to Target)
+ 28 | EF_FROSTDIVER2 | Frost Diver (Hitting)
+ 29 | EF_LIGHTBOLT | Lightning Bolt
+ 30 | EF_THUNDERSTORM | Thunder Storm
+ 31 | EF_FIREARROW | Weird bubbles launching from feet
+ 32 | EF_NAPALMBEAT | Small clustered explosions
+ 33 | EF_RUWACH | Ruwach
+ 34 | EF_TELEPORTATION | Old Map Exit Animation (unused)
+ 35 | EF_READYPORTAL | Old Warp Portal (unused)
+ 36 | EF_PORTAL | Old Warp Portal (unused)
+ 37 | EF_INCAGILITY | AGI Up
+ 38 | EF_DECAGILITY | AGI Down
+ 39 | EF_AQUA | Aqua Benedicta
+ 40 | EF_SIGNUM | Signum Crucis
+ 41 | EF_ANGELUS | Angelus
+ 42 | EF_BLESSING | Blessing
+ 43 | EF_INCAGIDEX | Dex + Agi Up
+ 44 | EF_SMOKE | Little Fog Smoke.
+ 45 | EF_FIREFLY | Faint Little Ball Things.
+ 46 | EF_SANDWIND | Sand Wind
+ 47 | EF_TORCH | Torch
+ 48 | EF_SPRAYPOND | Small Piece of Glass
+ 49 | EF_FIREHIT | Firebolt/Wall Hits
+ 50 | EF_FIRESPLASHHIT | Spinning Fire Thing
+ 51 | EF_COLDHIT | Ice Elemental Hit
+ 52 | EF_WINDHIT | Wind Elemental Hit
+ 53 | EF_POISONHIT | Puff of Purpulish Smoke?
+ 54 | EF_BEGINSPELL2 | Cast Initiation Aura (Water Element)
+ 55 | EF_BEGINSPELL3 | Cast Initiation Aura (Fire Element)
+ 56 | EF_BEGINSPELL4 | Cast Initiation Aura (Wind Element)
+ 57 | EF_BEGINSPELL5 | Cast Initiation Aura (Earth Element)
+ 58 | EF_BEGINSPELL6 | Cast Initiation Aura (Holy Element)
+ 59 | EF_BEGINSPELL7 | Cast Initiation Aura (Poison Element)
+ 60 | EF_LOCKON | Cast target circle
+ 61 | EF_WARPZONE | Old Warp Portal (NPC Warp, unused)
+ 62 | EF_SIGHTRASHER | Sight Trasher
+ 63 | EF_BARRIER | Moonlight Sphere
+ 64 | EF_ARROWSHOT | Something Like Puruple/Yellow Light Bullet
+ 65 | EF_INVENOM | Something Like Absorb of Power
+ 66 | EF_CURE | Cure
+ 67 | EF_PROVOKE | Provoke
+ 68 | EF_MVP | MVP Banner
+ 69 | EF_SKIDTRAP | Skid Trap
+ 70 | EF_BRANDISHSPEAR | Brandish Spear
+ 71 | EF_CONE | Spiral White balls
+ 72 | EF_SPHERE | Bigger Spiral White balls
+ 73 | EF_BOWLINGBASH | Blue/White Small Aura
+ 74 | EF_ICEWALL | Ice Wall
+ 75 | EF_GLORIA | Gloria
+ 76 | EF_MAGNIFICAT | Magnificat
+ 77 | EF_RESURRECTION | Resurrection
+ 78 | EF_RECOVERY | Status Recovery
+ 79 | EF_EARTHSPIKE | Earth Spike
+ 80 | EF_SPEARBMR | Spear Boomerang
+ 81 | EF_PIERCE | Skill hit
+ 82 | EF_TURNUNDEAD | Turn Undead
+ 83 | EF_SANCTUARY | Sanctuary
+ 84 | EF_IMPOSITIO | Impositio Manus
+ 85 | EF_LEXAETERNA | Lex Aeterna
+ 86 | EF_ASPERSIO | Aspersio
+ 87 | EF_LEXDIVINA | Lex Divina
+ 88 | EF_SUFFRAGIUM | Suffragium
+ 89 | EF_STORMGUST | Storm Gust
+ 90 | EF_LORD | Lord of Vermilion
+ 91 | EF_BENEDICTIO | B. S. Sacramenti
+ 92 | EF_METEORSTORM | Meteor Storm
+ 93 | EF_YUFITEL | Jupitel Thunder (Ball)
+ 94 | EF_YUFITELHIT | Jupitel Thunder (Hit)
+ 95 | EF_QUAGMIRE | Quagmire
+ 96 | EF_FIREPILLAR | Fire Pillar
+ 97 | EF_FIREPILLARBOMB | Fire Pillar/Land Mine hit
+ 98 | EF_HASTEUP | Adrenaline Rush
+ 99 | EF_FLASHER | Flasher Trap
+ 100 | EF_REMOVETRAP | Yellow ball fountain
+ 101 | EF_REPAIRWEAPON | Weapon Repair
+ 102 | EF_CRASHEARTH | Hammerfall
+ 103 | EF_PERFECTION | Weapon Perfection
+ 104 | EF_MAXPOWER | Maximize Power
+ 105 | EF_BLASTMINE | (nothing)
+ 106 | EF_BLASTMINEBOMB | Blast Mine Trap
+ 107 | EF_CLAYMORE | Claymore Trap
+ 108 | EF_FREEZING | Freezing Trap
+ 109 | EF_BUBBLE | Bailaban Blue bubble Map Effect
+ 110 | EF_GASPUSH | Trap Used by Giearth
+ 111 | EF_SPRINGTRAP | Spring Trap
+ 112 | EF_KYRIE | Kyrie Eleison
+ 113 | EF_MAGNUS | Magnus Exorcismus
+ 114 | EF_BOTTOM | Old Magnus Exorcismus Map Unit (unused)
+ 115 | EF_BLITZBEAT | Blitz Beat
+ 116 | EF_WATERBALL | Fling Watersphere
+ 117 | EF_WATERBALL2 | Waterball
+ 118 | EF_FIREIVY | Fling Firesphere
+ 119 | EF_DETECTING | Detect
+ 120 | EF_CLOAKING | Cloaking
+ 121 | EF_SONICBLOW | Sonic Blow (Part 1/2)
+ 122 | EF_SONICBLOWHIT | Multi hit effect
+ 123 | EF_GRIMTOOTH | Grimtooth Cast
+ 124 | EF_VENOMDUST | Venom Dust
+ 125 | EF_ENCHANTPOISON | Enchant Poison
+ 126 | EF_POISONREACT | Poison React
+ 127 | EF_POISONREACT2 | Small Posion React
+ 128 | EF_OVERTHRUST | Over Thrust
+ 129 | EF_SPLASHER | Venom Splasher Explosion
+ 130 | EF_TWOHANDQUICKEN | Two-Hand Quicken
+ 131 | EF_AUTOCOUNTER | Auto-Counter Hit
+ 132 | EF_GRIMTOOTHATK | Grimtooth Hit
+ 133 | EF_FREEZE | Ice Effect (Used by NPCs)
+ 134 | EF_FREEZED | Ice Effect (Used by NPCs)
+ 135 | EF_ICECRASH | Ice Effect (Used by NPCs)
+ 136 | EF_SLOWPOISON | Slow Poison
+ 137 | EF_BOTTOM2 | Old Sanctuary Map Unit (unused)
+ 138 | EF_FIREPILLARON | Fire pillar
+ 139 | EF_SANDMAN | Sandman Trap
+ 140 | EF_REVIVE | Ressurection Aura
+ 141 | EF_PNEUMA | Pneuma
+ 142 | EF_HEAVENSDRIVE | Heaven's Drive
+ 143 | EF_SONICBLOW2 | Sonic Blow (Part 2/2)
+ 144 | EF_BRANDISH2 | Brandish Spear Pre-Hit Effect
+ 145 | EF_SHOCKWAVE | Shockwave Trap
+ 146 | EF_SHOCKWAVEHIT | Shockwave Trap Hit
+ 147 | EF_EARTHHIT | Pierce Hit
+ 148 | EF_PIERCESELF | Pierce Cast Animation
+ 149 | EF_BOWLINGSELF | Bowling Bash
+ 150 | EF_SPEARSTABSELF | Pierce Cast Animation
+ 151 | EF_SPEARBMRSELF | Spear Boomerang Cast
+ 152 | EF_HOLYHIT | Turn Undead
+ 153 | EF_CONCENTRATION | Increase Concentration
+ 154 | EF_REFINEOK | Refine Success
+ 155 | EF_REFINEFAIL | Refine Fail
+ 156 | EF_JOBCHANGE | jobchange.str not found error
+ 157 | EF_LVUP | levelup.str not found error
+ 158 | EF_JOBLVUP | Job Level Up
+ 159 | EF_TOPRANK | PvP circle
+ 160 | EF_PARTY | PvP Party Circle
+ 161 | EF_RAIN | (Nothing)
+ 162 | EF_SNOW | Snow
+ 163 | EF_SAKURA | White Sakura Leaves
+ 164 | EF_STATUS_STATE | (Nothing)
+ 165 | EF_BANJJAKII | Comodo Fireworks Ball
+ 166 | EF_MAKEBLUR | Energy Coat (Visual Effect)
+ 167 | EF_TAMINGSUCCESS | (Nothing)
+ 168 | EF_TAMINGFAILED | (Nothing)
+ 169 | EF_ENERGYCOAT | Energy Coat Animation
+ 170 | EF_CARTREVOLUTION | Cart Revolution
+ 171 | EF_VENOMDUST2 | Venom Dust Map Unit
+ 172 | EF_CHANGEDARK | Change Element (Dark)
+ 173 | EF_CHANGEFIRE | Change Element (Fire)
+ 174 | EF_CHANGECOLD | Change Element (Water)
+ 175 | EF_CHANGEWIND | Change Element (Wind)
+ 176 | EF_CHANGEFLAME | Change Element (Fire)
+ 177 | EF_CHANGEEARTH | Change Element (Earth)
+ 178 | EF_CHAINGEHOLY | Change Element (Holy)
+ 179 | EF_CHANGEPOISON | Change Element (Poison)
+ 180 | EF_HITDARK | Darkness Attack
+ 181 | EF_MENTALBREAK | Mental Breaker
+ 182 | EF_MAGICALATTHIT | Magical Hit
+ 183 | EF_SUI_EXPLOSION | Self Destruction
+ 184 | EF_DARKATTACK | (Nothing)
+ 185 | EF_SUICIDE | (Nothing)
+ 186 | EF_COMBOATTACK1 | Combo Attack 1
+ 187 | EF_COMBOATTACK2 | Combo Attack 2
+ 188 | EF_COMBOATTACK3 | Combo Attack 3
+ 189 | EF_COMBOATTACK4 | Combo Attack 4
+ 190 | EF_COMBOATTACK5 | Combo Attack 5
+ 191 | EF_GUIDEDATTACK | Guided Attack
+ 192 | EF_POISONATTACK | Poison Attack
+ 193 | EF_SILENCEATTACK | Silence Attack
+ 194 | EF_STUNATTACK | Stun Attack
+ 195 | EF_PETRIFYATTACK | Petrify Attack
+ 196 | EF_CURSEATTACK | Curse Attack
+ 197 | EF_SLEEPATTACK | Sleep Attack
+ 198 | EF_TELEKHIT | (Nothing)
+ 199 | EF_PONG | Small Popping Bubble Map Effect
+ 200 | EF_LEVEL99 | Normal level 99 Aura (Middle)
+ 201 | EF_LEVEL99_2 | Normal level 99 Aura (Bottom)
+ 202 | EF_LEVEL99_3 | Lv 99 Aura Bubble
+ 203 | EF_GUMGANG | Fury (Visual Effect)
+ 204 | EF_POTION1 | Red Herb/Potion
+ 205 | EF_POTION2 | Orange Potion
+ 206 | EF_POTION3 | Yellow Herb/Potion
+ 207 | EF_POTION4 | White Herb/Potion
+ 208 | EF_POTION5 | Blue Herb/Potion
+ 209 | EF_POTION6 | Green Herb/Potion
+ 210 | EF_POTION7 | Yellow Circle Healing Effect
+ 211 | EF_POTION8 | Blue Circle Healing Effect
+ 212 | EF_DARKBREATH | Dark Breath
+ 213 | EF_DEFFENDER | Defender
+ 214 | EF_KEEPING | Keeping
+ 215 | EF_SUMMONSLAVE | Summon Slave
+ 216 | EF_BLOODDRAIN | Blood Drain
+ 217 | EF_ENERGYDRAIN | Energy Drain
+ 218 | EF_POTION_CON | Concentration Potion
+ 219 | EF_POTION_ | Awakening Potion
+ 220 | EF_POTION_BERSERK | Berserk Potion
+ 221 | EF_POTIONPILLAR | Intense light beam
+ 222 | EF_DEFENDER | Defender (Crusader)
+ 223 | EF_GANBANTEIN | Holy Cast Aura
+ 224 | EF_WIND | Wind (Map effect)
+ 225 | EF_VOLCANO | Volcano casting effect
+ 226 | EF_GRANDCROSS | Grand Cross Effect
+ 227 | EF_INTIMIDATE | Snatch
+ 228 | EF_CHOOKGI | (Nothing)
+ 229 | EF_CLOUD | (Nothing)
+ 230 | EF_CLOUD2 | (Nothing)
+ 231 | EF_MAPPILLAR | Map Light Pillar Animation 1
+ 232 | EF_LINELINK | Sacrifice (Visual Effect)
+ 233 | EF_CLOUD3 | Fog
+ 234 | EF_SPELLBREAKER | Spell Breaker
+ 235 | EF_DISPELL | Dispell
+ 236 | EF_DELUGE | Deluge Cast Aura
+ 237 | EF_VIOLENTGALE | Violent Gale Cast Aura
+ 238 | EF_LANDPROTECTOR | Magnetic Earth Cast Aura
+ 239 | EF_BOTTOM_VO | Volcano (Visual Effect)
+ 240 | EF_BOTTOM_DE | Deluge (Visual Effect)
+ 241 | EF_BOTTOM_VI | Violent Gale (Visual Effect)
+ 242 | EF_BOTTOM_LA | Magnetic Earth (Visual Effect)
+ 243 | EF_FASTMOVE | (Invalid)
+ 244 | EF_MAGICROD | Magic Rod
+ 245 | EF_HOLYCROSS | Holy Cross
+ 246 | EF_SHIELDCHARGE | Shield Charge
+ 247 | EF_MAPPILLAR2 | Map Light Pillar Animation 2
+ 248 | EF_PROVIDENCE | Resistant Souls
+ 249 | EF_SHIELDBOOMERANG | Shield Boomerang
+ 250 | EF_SPEARQUICKEN | Spear Quicken
+ 251 | EF_DEVOTION | Devotion
+ 252 | EF_REFLECTSHIELD | Reflect Shield
+ 253 | EF_ABSORBSPIRITS | Absorb Spirit Spheres
+ 254 | EF_STEELBODY | Mental Strength (Visual Effect)
+ 255 | EF_FLAMELAUNCHER | Elemental Endow (Fire)
+ 256 | EF_FROSTWEAPON | Elemental Endow (Water)
+ 257 | EF_LIGHTNINGLOADER | Elemental Endow (Wind)
+ 258 | EF_SEISMICWEAPON | Elemental Endow (Earth)
+ 259 | EF_MAPPILLAR3 | Map Light Pillar Animation 3
+ 260 | EF_MAPPILLAR4 | Map Light Pillar Animation 4
+ 261 | EF_GUMGANG2 | Fury Cast Animation
+ 262 | EF_TEIHIT1 | Raging Quadruple Blow
+ 263 | EF_GUMGANG3 | Raging Quadruple Blow 2
+ 264 | EF_TEIHIT2 | (Nothing)
+ 265 | EF_TANJI | Throw Spirit Sphere
+ 266 | EF_TEIHIT1X | Raging Quadruple Blow 3
+ 267 | EF_CHIMTO | Occult Impaction
+ 268 | EF_STEALCOIN | Steal Coin
+ 269 | EF_STRIPWEAPON | Divest Weapon
+ 270 | EF_STRIPSHIELD | Divest Shield
+ 271 | EF_STRIPARMOR | Divest Armor
+ 272 | EF_STRIPHELM | Divest Helm
+ 273 | EF_CHAINCOMBO | Raging Quadruple Blow 4
+ 274 | EF_RG_COIN | Steal Coin Animation
+ 275 | EF_BACKSTAP | Back Stab Animation
+ 276 | EF_TEIHIT3 | Raging Thrust
+ 277 | EF_BOTTOM_DISSONANCE | Dissoance Map Unit
+ 278 | EF_BOTTOM_LULLABY | Lullaby Map Unit
+ 279 | EF_BOTTOM_RICHMANKIM | Mr Kim a Rich Man Map Unit
+ 280 | EF_BOTTOM_ETERNALCHAOS | Eternal Chaos Map Unit
+ 281 | EF_BOTTOM_DRUMBATTLEFIELD | A Drum on the Battlefield Map Unit
+ 282 | EF_BOTTOM_RINGNIBELUNGEN | The Ring Of Nibelungen Map Unit
+ 283 | EF_BOTTOM_ROKISWEIL | Loki's Veil Map Unit
+ 284 | EF_BOTTOM_INTOABYSS | Into the Abyss Map Unit
+ 285 | EF_BOTTOM_SIEGFRIED | Invunerable Siegfriend Map Unit
+ 286 | EF_BOTTOM_WHISTLE | A Wistle Map Unit
+ 287 | EF_BOTTOM_ASSASSINCROSS | Assassin Cross of Sunset Map Unit
+ 288 | EF_BOTTOM_POEMBRAGI | A Poem of Bragi Map Unit
+ 289 | EF_BOTTOM_APPLEIDUN | The Apple Of Idun Map Unit
+ 290 | EF_BOTTOM_UGLYDANCE | Ugly Dance Map Unit
+ 291 | EF_BOTTOM_HUMMING | Humming Map Unit
+ 292 | EF_BOTTOM_DONTFORGETME | Please don't Forget Me Map Unit
+ 293 | EF_BOTTOM_FORTUNEKISS | Fortune's Kiss Map Unit
+ 294 | EF_BOTTOM_SERVICEFORYOU | Service For You Map Unit
+ 295 | EF_TALK_FROSTJOKE | Frost Joke
+ 296 | EF_TALK_SCREAM | Scream
+ 297 | EF_POKJUK | Fire Works (Visual Effect)
+ 298 | EF_THROWITEM | Acid Terror Animnation
+ 299 | EF_THROWITEM2 | (Nothing)
+ 300 | EF_CHEMICALPROTECTION | Chemical Protection
+ 301 | EF_POKJUK_SOUND | Fire Works (Sound Effect)
+ 302 | EF_DEMONSTRATION | Bomb
+ 303 | EF_CHEMICAL2 | (Unused)
+ 304 | EF_TELEPORTATION2 | Teleportation Animation
+ 305 | EF_PHARMACY_OK | Pharmacy Success
+ 306 | EF_PHARMACY_FAIL | Pharmacy Failed
+ 307 | EF_FORESTLIGHT | Forest Light 1
+ 308 | EF_THROWITEM3 | Throw Stone
+ 309 | EF_FIRSTAID | First Aid
+ 310 | EF_SPRINKLESAND | Sprinkle Sand
+ 311 | EF_LOUD | Crazy Uproar
+ 312 | EF_HEAL | Heal Effect
+ 313 | EF_HEAL2 | Heal Effect 2
+ 314 | EF_EXIT2 | Old Map Exit effect (Unused)
+ 315 | EF_GLASSWALL2 | Safety Wall
+ 316 | EF_READYPORTAL2 | Warp Portal Animation 1
+ 317 | EF_PORTAL2 | Warp Portal Animation 2
+ 318 | EF_BOTTOM_MAG | Magnus Exorcisimus Map Unit
+ 319 | EF_BOTTOM_SANC | Sanctuary Map Unit
+ 320 | EF_HEAL3 | Offensive Heal
+ 321 | EF_WARPZONE2 | Warp NPC
+ 322 | EF_FORESTLIGHT2 | Forest Light 2
+ 323 | EF_FORESTLIGHT3 | Forest Light 3
+ 324 | EF_FORESTLIGHT4 | Forest Light 4
+ 325 | EF_HEAL4 | Heal Effect 4
+ 326 | EF_FOOT | Chase Walk Left Foot
+ 327 | EF_FOOT2 | Chse Walk Right Foot
+ 328 | EF_BEGINASURA | Monk Asura Strike
+ 329 | EF_TRIPLEATTACK | Triple Strike
+ 330 | EF_HITLINE | Combo Finish
+ 331 | EF_HPTIME | Natural HP Regeneration
+ 332 | EF_SPTIME | Natural SP Regeneration
+ 333 | EF_MAPLE | Autumn Leaves
+ 334 | EF_BLIND | Blind
+ 335 | EF_POISON | Poison
+ 336 | EF_GUARD | Kyrie Eleison/Parrying Shield
+ 337 | EF_JOBLVUP50 | Class Change
+ 338 | EF_ANGEL2 | Super Novice/Taekwon Level Up Angel
+ 339 | EF_MAGNUM2 | Spiral Pierce
+ 340 | EF_CALLZONE | (Nothing)
+ 341 | EF_PORTAL3 | Wedding Warp Portal
+ 342 | EF_COUPLECASTING | Wedding Skill
+ 343 | EF_HEARTCASTING | Another Merry Skill
+ 344 | EF_ENTRY2 | Character map entry effect
+ 345 | EF_SAINTWING | Wings (Animated)
+ 346 | EF_SPHEREWIND | Like Moonlight But Blue
+ 347 | EF_COLORPAPER | Wedding Ceremony
+ 348 | EF_LIGHTSPHERE | Like 1000 Blade trepassing
+ 349 | EF_WATERFALL | Waterfall (Horizonatal)
+ 350 | EF_WATERFALL_90 | Waterfall (Vertical)
+ 351 | EF_WATERFALL_SMALL | Small Waterfall (Horizonatal)
+ 352 | EF_WATERFALL_SMALL_90 | Small Waterfall (Vertical)
+ 353 | EF_WATERFALL_T2 | Dark Waterfall (Horizonatal)
+ 354 | EF_WATERFALL_T2_90 | Dark Waterfall (Vertical)
+ 355 | EF_WATERFALL_SMALL_T2 | Dark Small Waterfall (Horizonatal)
+ 356 | EF_WATERFALL_SMALL_T2_90 | Dark Small Waterfall (Vertical)
+ 357 | EF_MINI_TETRIS | (Nothing)
+ 358 | EF_GHOST | Niflheim Ghost
+ 359 | EF_BAT | Niflheim Bat Slow
+ 360 | EF_BAT2 | Niflheim Bat Fast
+ 361 | EF_SOULBREAKER | Soul Destroyer
+ 362 | EF_LEVEL99_4 | Trancendant Level 99 Aura 1
+ 363 | EF_VALLENTINE | Valentine Day Heart With Wings
+ 364 | EF_VALLENTINE2 | Valentine Day Heart
+ 365 | EF_PRESSURE | Gloria Domini
+ 366 | EF_BASH3D | Martyr's Reckoning
+ 367 | EF_AURABLADE | Aura Blade
+ 368 | EF_REDBODY | Berserk
+ 369 | EF_LKCONCENTRATION | Concentration
+ 370 | EF_BOTTOM_GOSPEL | Gospel Map Unit
+ 371 | EF_ANGEL | Level Up
+ 372 | EF_DEVIL | Death
+ 373 | EF_DRAGONSMOKE | House Smoke
+ 374 | EF_BOTTOM_BASILICA | Basilica
+ 375 | EF_ASSUMPTIO | Assumptio (Visual Effect)
+ 376 | EF_HITLINE2 | Palm Strike
+ 377 | EF_BASH3D2 | Matyr's Reckoning 2
+ 378 | EF_ENERGYDRAIN2 | Soul Drain (1st Part)
+ 379 | EF_TRANSBLUEBODY | Soul Drain (2nd Part)
+ 380 | EF_MAGICCRASHER | Magic Crasher
+ 381 | EF_LIGHTSPHERE2 | Blue Starburst (Unknown use)
+ 382 | EF_LIGHTBLADE | (Nothing)
+ 383 | EF_ENERGYDRAIN3 | Health Conversion
+ 384 | EF_LINELINK2 | Soul Change (Sound Effect)
+ 385 | EF_LINKLIGHT | Soul Change (Visual Effect)
+ 386 | EF_TRUESIGHT | True Sight
+ 387 | EF_FALCONASSAULT | Falcon Assault
+ 388 | EF_TRIPLEATTACK2 | Focused Arrow Strike (Sound Effect)
+ 389 | EF_PORTAL4 | Wind Walk
+ 390 | EF_MELTDOWN | Shattering Strike
+ 391 | EF_CARTBOOST | Cart Boost
+ 392 | EF_REJECTSWORD | Reject Sword
+ 393 | EF_TRIPLEATTACK3 | Arrow Vulcan
+ 394 | EF_SPHEREWIND2 | Sheltering Bliss
+ 395 | EF_LINELINK3 | Marionette Control (Sound Effect)
+ 396 | EF_PINKBODY | Marionette Control (Visual Effect)
+ 397 | EF_LEVEL99_5 | Trancended 99 Aura (Middle)
+ 398 | EF_LEVEL99_6 | Trancended 99 Aura (Bottom)
+ 399 | EF_BASH3D3 | Head Crush
+ 400 | EF_BASH3D4 | Joint Beat
+ 401 | EF_NAPALMVALCAN | Napalm Vulcan Sound
+ 402 | EF_PORTAL5 | Dangerous Soul Collect
+ 403 | EF_MAGICCRASHER2 | Mind Breaker
+ 404 | EF_BOTTOM_SPIDER | Fiber Lock
+ 405 | EF_BOTTOM_FOGWALL | Wall Of Fog
+ 406 | EF_SOULBURN | Soul Burn
+ 407 | EF_SOULCHANGE | Soul Change
+ 408 | EF_BABY | Mom, Dad, I love you! (Baby Skill)
+ 409 | EF_SOULBREAKER2 | Meteor Assault
+ 410 | EF_RAINBOW | Rainbow
+ 411 | EF_PEONG | Leap
+ 412 | EF_TANJI2 | Like Throw Spirit Sphere
+ 413 | EF_PRESSEDBODY | Axe Kick
+ 414 | EF_SPINEDBODY | Round Kick
+ 415 | EF_KICKEDBODY | Counter Kick
+ 416 | EF_AIRTEXTURE | (Nothing)
+ 417 | EF_HITBODY | Flash
+ 418 | EF_DOUBLEGUMGANG | Warmth Lightning
+ 419 | EF_REFLECTBODY | Kaite (Visual Effect)
+ 420 | EF_BABYBODY | Eswoo (Small) (Visual Effect)
+ 421 | EF_BABYBODY2 | Eswoo (Alt. Small) (Visual Effect)
+ 422 | EF_GIANTBODY | Eswoo (Normal) (Visual Effect)
+ 423 | EF_GIANTBODY2 | Eswoo (Alt. Normal) (Visual Effect)
+ 424 | EF_ASURABODY | Spirit Link (Visual Effect)
+ 425 | EF_4WAYBODY | Esma Hit (Visual Effect)
+ 426 | EF_QUAKEBODY | Sprint Collision (Visual Effect)
+ 427 | EF_ASURABODY_MONSTER | (Nothing)
+ 428 | EF_HITLINE3 | (Nothing)
+ 429 | EF_HITLINE4 | Taekwon Kick Hit 1
+ 430 | EF_HITLINE5 | Taekwon Kick Hit 2
+ 431 | EF_HITLINE6 | Taekwon Kick Hit 3
+ 432 | EF_ELECTRIC | Solar, Lunar and Stellar Perception (Visual Effect)
+ 433 | EF_ELECTRIC2 | Solar, Lunar and Stellar Opposition (Visual Effect)
+ 434 | EF_HITLINE7 | Taekwon Kick Hit 4
+ 435 | EF_STORMKICK | Whirlwind Kick
+ 436 | EF_HALFSPHERE | White Barrier (Unused)
+ 437 | EF_ATTACKENERGY | White barrier 2 (Unused)
+ 438 | EF_ATTACKENERGY2 | Kaite Reflect Animation
+ 439 | EF_CHEMICAL3 | Flying Side Kick
+ 440 | EF_ASSUMPTIO2 | Assumptio (Animation)
+ 441 | EF_BLUECASTING | Comfort Skills Cast Aura
+ 442 | EF_RUN | Foot Prints caused by Sprint.
+ 443 | EF_STOPRUN | (Nothing)
+ 444 | EF_STOPEFFECT | Sprint Stop Animation
+ 445 | EF_JUMPBODY | High Jump (Jump)
+ 446 | EF_LANDBODY | High Jump (Return Down)
+ 447 | EF_FOOT3 | Running Left Foot
+ 448 | EF_FOOT4 | Running Right Foot
+ 449 | EF_TAE_READY | KA-Spell (1st Part)
+ 450 | EF_GRANDCROSS2 | Darkcross
+ 451 | EF_SOULSTRIKE2 | Dark Strike
+ 452 | EF_YUFITEL2 | Something Like Jupitel Thunder
+ 453 | EF_NPC_STOP | Paralized
+ 454 | EF_DARKCASTING | Like Blind
+ 455 | EF_GUMGANGNPC | Another Warmth Lightning
+ 456 | EF_AGIUP | Power Up
+ 457 | EF_JUMPKICK | Flying Side Kick (2nd Part)
+ 458 | EF_QUAKEBODY2 | Running/Sprint (running into a wall)
+ 459 | EF_STORMKICK1 | Brown tornado that spins sprite (unused)
+ 460 | EF_STORMKICK2 | Green tornado (unused)
+ 461 | EF_STORMKICK3 | Blue tornado (unused)
+ 462 | EF_STORMKICK4 | Kaupe Dodge Effect
+ 463 | EF_STORMKICK5 | Kaupe Dodge Effect
+ 464 | EF_STORMKICK6 | White tornado (unused)
+ 465 | EF_STORMKICK7 | Purple tornado (unused)
+ 466 | EF_SPINEDBODY2 | Another Round Kick
+ 467 | EF_BEGINASURA1 | Warm/Mild Wind (Earth)
+ 468 | EF_BEGINASURA2 | Warm/Mild Wind (Wind)
+ 469 | EF_BEGINASURA3 | Warm/Mild Wind (Water)
+ 470 | EF_BEGINASURA4 | Warm/Mild Wind (Fire)
+ 471 | EF_BEGINASURA5 | Warm/Mild Wind (Undead)
+ 472 | EF_BEGINASURA6 | Warm/Mild Wind (Shadow)
+ 473 | EF_BEGINASURA7 | Warm/Mild Wind (Holy)
+ 474 | EF_AURABLADE2 | (Nothing)
+ 475 | EF_DEVIL1 | Demon of The Sun Moon And Stars (Level 1)
+ 476 | EF_DEVIL2 | Demon of The Sun Moon And Stars (Level 2)
+ 477 | EF_DEVIL3 | Demon of The Sun Moon And Stars (Level 3)
+ 478 | EF_DEVIL4 | Demon of The Sun Moon And Stars (Level 4)
+ 479 | EF_DEVIL5 | Demon of The Sun Moon And Stars (Level 5)
+ 480 | EF_DEVIL6 | Demon of The Sun Moon And Stars (Level 6)
+ 481 | EF_DEVIL7 | Demon of The Sun Moon And Stars (Level 7)
+ 482 | EF_DEVIL8 | Demon of The Sun Moon And Stars (Level 8)
+ 483 | EF_DEVIL9 | Demon of The Sun Moon And Stars (Level 9)
+ 484 | EF_DEVIL10 | Demon of The Sun Moon And Stars (Level 10)
+ 485 | EF_DOUBLEGUMGANG2 | Mental Strength Lightning but White
+ 486 | EF_DOUBLEGUMGANG3 | Mental Strength Lightning
+ 487 | EF_BLACKDEVIL | Demon of The Sun Moon And Stars Ground Effect
+ 488 | EF_FLOWERCAST | Comfort Skills
+ 489 | EF_FLOWERCAST2 | (Nothing)
+ 490 | EF_FLOWERCAST3 | (Nothing)
+ 491 | EF_MOCHI | Element Potions
+ 492 | EF_LAMADAN | Cooking Foods
+ 493 | EF_EDP | Enchant Deadly Poison
+ 494 | EF_SHIELDBOOMERANG2 | Throwing Tomahawk
+ 495 | EF_RG_COIN2 | Full Strip Sound
+ 496 | EF_GUARD2 | Preserve
+ 497 | EF_SLIM | Twilight Alchemy 1
+ 498 | EF_SLIM2 | Twilight Alchemy 2
+ 499 | EF_SLIM3 | Twilight Alchemy 3
+ 500 | EF_CHEMICALBODY | Player Become Blue with Blue Aura
+ 501 | EF_CASTSPIN | Chase Walk Animation
+ 502 | EF_PIERCEBODY | Player Become Yellow with Yellow Aura
+ 503 | EF_SOULLINK | Soul Link Word
+ 504 | EF_CHOOKGI2 | (Nothing)
+ 505 | EF_MEMORIZE | Memorize
+ 506 | EF_SOULLIGHT | (Nothing)
+ 507 | EF_MAPAE | Authoritative Badge
+ 508 | EF_ITEMPOKJUK | Fire Cracker
+ 509 | EF_05VAL | Valentine Day Hearth (Wings)
+ 510 | EF_BEGINASURA11 | Champion Asura Strike
+ 511 | EF_NIGHT | (Nothing)
+ 512 | EF_CHEMICAL2DASH | Chain Crush Combo
+ 513 | EF_GROUNDSAMPLE | Area Cast
+ 514 | EF_GI_EXPLOSION | Really Big Circle
+ 515 | EF_CLOUD4 | Einbroch Fog
+ 516 | EF_CLOUD5 | Airship Cloud
+ 517 | EF_BOTTOM_HERMODE | (Nothing)
+ 518 | EF_CARTTER | Cart Termination
+ 519 | EF_ITEMFAST | Speed Down Potion
+ 520 | EF_SHIELDBOOMERANG3 | Shield Bumerang
+ 521 | EF_DOUBLECASTBODY | Player Become Red with Red Aura
+ 522 | EF_GRAVITATION | Gravitation Field
+ 523 | EF_TAROTCARD1 | Tarot Card of Fate (The Fool)
+ 524 | EF_TAROTCARD2 | Tarot Card of Fate (The Magician)
+ 525 | EF_TAROTCARD3 | Tarot Card of Fate (The High Priestess)
+ 526 | EF_TAROTCARD4 | Tarot Card of Fate (The Chariot)
+ 527 | EF_TAROTCARD5 | Tarot Card of Fate (Strength)
+ 528 | EF_TAROTCARD6 | Tarot Card of Fate (The Lovers)
+ 529 | EF_TAROTCARD7 | Tarot Card of Fate (The Wheel of Fortune)
+ 530 | EF_TAROTCARD8 | Tarot Card of Fate (The Hanged Man)
+ 531 | EF_TAROTCARD9 | Tarot Card of Fate (Death)
+ 532 | EF_TAROTCARD10 | Tarot Card of Fate (Temperance)
+ 533 | EF_TAROTCARD11 | Tarot Card of Fate (The Devil)
+ 534 | EF_TAROTCARD12 | Tarot Card of Fate (The Tower)
+ 535 | EF_TAROTCARD13 | Tarot Card of Fate (The Star)
+ 536 | EF_TAROTCARD14 | Tarot Card of Fate (The Sun)
+ 537 | EF_ACIDDEMON | Acid Demonstration
+ 538 | EF_GREENBODY | Player Become Green with Green Aura
+ 539 | EF_THROWITEM4 | Throw Random Bottle
+ 540 | EF_BABYBODY_BACK | Instant Small->Normal
+ 541 | EF_THROWITEM5 | (Nothing)
+ 542 | EF_BLUEBODY | KA-Spell (1st Part)
+ 543 | EF_HATED | Kahii
+ 544 | EF_REDLIGHTBODY | Warmth Red Sprite
+ 545 | EF_RO2YEAR | Sound And... PUFF Client Crash :P
+ 546 | EF_SMA_READY | Kaupe
+ 547 | EF_STIN | Estin
+ 548 | EF_RED_HIT | Instant Red Sprite
+ 549 | EF_BLUE_HIT | Instant Blue Sprite
+ 550 | EF_QUAKEBODY3 | Another Effect like Running Hit
+ 551 | EF_SMA | Effect Like Estun but with Circle
+ 552 | EF_SMA2 | (Nothing)
+ 553 | EF_STIN2 | Esma
+ 554 | EF_HITTEXTURE | Large White Cloud
+ 555 | EF_STIN3 | Estun
+ 556 | EF_SMA3 | (Nothing)
+ 557 | EF_BLUEFALL | Juperos Energy Waterfall (Horizontal)
+ 558 | EF_BLUEFALL_90 | Juperos Energy Waterfall (Vertical)
+ 559 | EF_FASTBLUEFALL | Juperos Energy Waterfall Fast (Horizontal)
+ 560 | EF_FASTBLUEFALL_90 | Juperos Energy Waterfall Fast (Vertical)
+ 561 | EF_BIG_PORTAL | Juperos Warp
+ 562 | EF_BIG_PORTAL2 | Juperos Warp
+ 563 | EF_SCREEN_QUAKE | Earthquake Effect (Juperos Elevator)
+ 564 | EF_HOMUNCASTING | Wedding Cast
+ 565 | EF_HFLIMOON1 | Filir Moonlight Lvl 1
+ 566 | EF_HFLIMOON2 | Filir Moonlight Lvl 2
+ 567 | EF_HFLIMOON3 | Filir Moonlight Lvl 3
+ 568 | EF_HO_UP | Another Job Level Up
+ 569 | EF_HAMIDEFENCE | Amistr Bulwark
+ 570 | EF_HAMICASTLE | Amistr Castling
+ 571 | EF_HAMIBLOOD | Amistr Bloodlust
+ 572 | EF_HATED2 | Warmth Soul
+ 573 | EF_TWILIGHT1 | Twilight Alchemy 1
+ 574 | EF_TWILIGHT2 | Twilight Alchemy 2
+ 575 | EF_TWILIGHT3 | Twilight Alchemy 3
+ 576 | EF_ITEM_THUNDER | Box Effect (Thunder)
+ 577 | EF_ITEM_CLOUD | Box Effect (Cloud)
+ 578 | EF_ITEM_CURSE | Box Effect (Curse)
+ 579 | EF_ITEM_ZZZ | Box Effect (Sleep)
+ 580 | EF_ITEM_RAIN | Box Effect (Rain)
+ 581 | EF_ITEM_LIGHT | Box Effect (Sunlight)
+ 582 | EF_ANGEL3 | Another Super Novice/Taekwon Angel
+ 583 | EF_M01 | Warmth Hit
+ 584 | EF_M02 | Full Buster
+ 585 | EF_M03 | 5 Medium Size Explosion
+ 586 | EF_M04 | Somatology Lab Mobs Aura
+ 587 | EF_M05 | Big Purple Flame
+ 588 | EF_M06 | Little Red Flame
+ 589 | EF_M07 | Eswoo
+ 590 | EF_KAIZEL | Running Stop
+ 591 | EF_KAAHI | (Nothing)
+ 592 | EF_CLOUD6 | Thanatos Tower Bloody Clouds
+ 593 | EF_FOOD01 | Food Effect (STR)
+ 594 | EF_FOOD02 | Food Effect (INT)
+ 595 | EF_FOOD03 | Food Effect (VIT)
+ 596 | EF_FOOD04 | Food Effect (AGI)
+ 597 | EF_FOOD05 | Food Effect (DEX)
+ 598 | EF_FOOD06 | Food Effect (LUK)
+ 599 | EF_SHRINK | Cast Time Sound and Flashing Animation on Player
+ 600 | EF_THROWITEM6 | Throw Venom Knife
+ 601 | EF_SIGHT2 | Sight Blaster
+ 602 | EF_QUAKEBODY4 | Close Confine (Grab Effect)
+ 603 | EF_FIREHIT2 | Spinning fire ball (like 50, but smaller)
+ 604 | EF_NPC_STOP2 | Close Confine (Ground Effect)
+ 605 | EF_NPC_STOP2_DEL | (Nothing)
+ 606 | EF_FVOICE | Pang Voice (Visual Effect)
+ 607 | EF_WINK | Wink of Charm (Visual Effect)
+ 608 | EF_COOKING_OK | Cooking Success
+ 609 | EF_COOKING_FAIL | Cooking Failed
+ 610 | EF_TEMP_OK | Success
+ 611 | EF_TEMP_FAIL | Failed
+ 612 | EF_HAPGYEOK | Korean Words and /no1 Emoticon
+ 613 | EF_THROWITEM7 | Throw Shuriken
+ 614 | EF_THROWITEM8 | Throw Kunai
+ 615 | EF_THROWITEM9 | Throw Fumma Shuriken
+ 616 | EF_THROWITEM10 | Throw Money
+ 617 | EF_BUNSINJYUTSU | Illusionary Shadow
+ 618 | EF_KOUENKA | Crimson Fire Bolossom
+ 619 | EF_HYOUSENSOU | Lightning Spear Of Ice
+ 620 | EF_BOTTOM_SUITON | Water Escape Technique
+ 621 | EF_STIN4 | Wind Blade
+ 622 | EF_THUNDERSTORM2 | Lightning Crash
+ 623 | EF_CHEMICAL4 | Piercing Shot
+ 624 | EF_STIN5 | Kamaitachi
+ 625 | EF_MADNESS_BLUE | Madness Canceller
+ 626 | EF_MADNESS_RED | Adjustment
+ 627 | EF_RG_COIN3 | Disarm (Sound Effect)
+ 628 | EF_BASH3D5 | Dust
+ 629 | EF_CHOOKGI3 | (Nothing)
+ 630 | EF_KIRIKAGE | Shadow Slash
+ 631 | EF_TATAMI | Reverse Tatami Map Unit
+ 632 | EF_KASUMIKIRI | Mist Slash
+ 633 | EF_ISSEN | Final Strike
+ 634 | EF_KAEN | Crimson Fire Formation
+ 635 | EF_BAKU | Dragon Fire Formation
+ 636 | EF_HYOUSYOURAKU | Falling Ice Pillar
+ 637 | EF_DESPERADO | Desperado
+ 638 | EF_LIGHTNING_S | Ground Drift Grenade
+ 639 | EF_BLIND_S | Ground Drift Grenade
+ 640 | EF_POISON_S | Ground Drift Grenade
+ 641 | EF_FREEZING_S | Ground Drift Grenade
+ 642 | EF_FLARE_S | Ground Drift Grenade
+ 643 | EF_RAPIDSHOWER | Rapid Shower
+ 644 | EF_MAGICALBULLET | Magic Bullet
+ 645 | EF_SPREADATTACK | Spread Attack
+ 646 | EF_TRACKCASTING | Tracking (Shown While Casting)
+ 647 | EF_TRACKING | Tracking
+ 648 | EF_TRIPLEACTION | Triple Action
+ 649 | EF_BULLSEYE | Bull's Eye
+ 650 | EF_MAP_MAGICZONE | Ice Cave Level 4 Circle
+ 651 | EF_MAP_MAGICZONE2 | Ice Cave Level 4 Big Circle
+ 652 | EF_DAMAGE1 | Like Regeneration Number but Red with a Sound
+ 653 | EF_DAMAGE1_2 | Like Regeneration Number but Red
+ 654 | EF_DAMAGE1_3 | Like Regeneration Number but Purple
+ 655 | EF_UNDEADBODY | Mobs Skill (Change Undead Element)
+ 656 | EF_UNDEADBODY_DEL | Last animation before Change Undead Element finish
+ 657 | EF_GREEN_NUMBER | (Nothing)
+ 658 | EF_BLUE_NUMBER | (Nothing)
+ 659 | EF_RED_NUMBER | (Nothing)
+ 660 | EF_PURPLE_NUMBER | (Nothing)
+ 661 | EF_BLACK_NUMBER | (Nothing)
+ 662 | EF_WHITE_NUMBER | (Nothing)
+ 663 | EF_YELLOW_NUMBER | (Nothing)
+ 664 | EF_PINK_NUMBER | (Nothing)
+ 665 | EF_BUBBLE_DROP | Little Blue Ball Falling From the Sky
+ 666 | EF_NPC_EARTHQUAKE | Earthquake
+ 667 | EF_DA_SPACE | (Nothing)
+ 668 | EF_DRAGONFEAR | Dragonfear
+ 669 | EF_BLEEDING | Wide Bleeding
+ 670 | EF_WIDECONFUSE | Dragon fear (Visual Effect)
+ 671 | EF_BOTTOM_RUNNER | The Japan Earth Symbol (like 'Seven Wind Lv1', but on the ground)
+ 672 | EF_BOTTOM_TRANSFER | The Japan Wind Symbol (like 'Seven Wind Lv2', but on the ground)
+ 673 | EF_CRYSTAL_BLUE | Map turns Blue (like Soul Link)
+ 674 | EF_BOTTOM_EVILLAND | Evil Land Cell
+ 675 | EF_GUARD3 | Like Parrying/Kyrie Eleison barrier but Yellow with small Cross in every barrier piece
+ 676 | EF_NPC_SLOWCAST | Slow Casting
+ 677 | EF_CRITICALWOUND | Critical Wounds/Bleeding Attack
+ 678 | EF_GREEN99_3 | White 99 Aura Bubbles
+ 679 | EF_GREEN99_5 | Green Aura (Middle)
+ 680 | EF_GREEN99_6 | Green Aura (Bottom)
+ 681 | EF_MAPSPHERE | Dimensional Gorge Map Effect
+ 682 | EF_POK_LOVE | I Love You Banner
+ 683 | EF_POK_WHITE | Happy White Day Banner
+ 684 | EF_POK_VALEN | Happy Valentine Day Banner
+ 685 | EF_POK_BIRTH | Happy Birthday Banner
+ 686 | EF_POK_CHRISTMAS | Merry Christmas Banner
+ 687 | EF_MAP_MAGICZONE3 | Cast Circle-Like effect 1
+ 688 | EF_MAP_MAGICZONE4 | Cast Circle-Like effect 2
+ 689 | EF_DUST | Endless Tower Map Effect
+ 690 | EF_TORCH_RED | Burning Flame (Red)
+ 691 | EF_TORCH_GREEN | Burning Flame (Green)
+ 692 | EF_MAP_GHOST | Unknown Aura Bubbles (Small ghosts)
+ 693 | EF_GLOW1 | Translucent yellow circle
+ 694 | EF_GLOW2 | Translucent green circle
+ 695 | EF_GLOW4 | Rotating green light
+ 696 | EF_TORCH_PURPLE | The same of 690 and 691 but Blue/Purple
+ 697 | EF_CLOUD7 | (Nothing)
+ 698 | EF_CLOUD8 | (Nothing)
+ 699 | EF_FLOWERLEAF | Fall of powder from the sky and raise of some leaf
+ 700 | EF_MAPSPHERE2 | Big Colored Green Sphere.
+ 701 | EF_GLOW11 | Huge Blue Sphere
+ 702 | EF_GLOW12 | Little Colored Violet Sphere
+ 703 | EF_CIRCLELIGHT | Light Infiltration with fall of pownder
+ 704 | EF_ITEM315 | Client Error (mobile_ef02.str)
+ 705 | EF_ITEM316 | Client Error (mobile_ef01.str)
+ 706 | EF_ITEM317 | Client Error (mobile_ef03.str)
+ 707 | EF_ITEM318 | Client Crash :P
+ 708 | EF_STORM_MIN | Storm Gust (same as 89)
+ 709 | EF_POK_JAP | A Firework that split in 4 mini fireworks
+ 710 | EF_MAP_GREENLIGHT | A Sphere like Effect 701 but Green, and a bit more larger
+ 711 | EF_MAP_MAGICWALL | A big violet wall
+ 712 | EF_MAP_GREENLIGHT2 | A Little Flame Sphere
+ 713 | EF_YELLOWFLY1 | A lot of Very Small and Yellow Sphere
+ 714 | EF_YELLOWFLY2 | (Nothing)
+ 715 | EF_BOTTOM_BLUE | Little blue Basilica
+ 716 | EF_BOTTOM_BLUE2 | Same as 715
+ 717 | EF_WEWISH | Christmas Carol (copy of Angelus)
+ 718 | EF_FIREPILLARON2 | Judex (Visual Effect)
+ 719 | EF_FORESTLIGHT5 | Renovatio (light beam)
+ 720 | EF_SOULBREAKER3 | Yellow version of Soul Breaker
+ 721 | EF_ADO_STR | Adoramus (lightning bolt)
+ 722 | EF_IGN_STR | Ignition Break (big explosion)
+ 723 | EF_CHIMTO2 | Hundred Spear (sound effect)
+ 724 | EF_WINDCUTTER | Green version of Detecting
+ 725 | EF_DETECT2 | Oratorio (like Detecting)
+ 726 | EF_FROSTMYSTY | Frost Misty (blue vapor and bubbles)
+ 727 | EF_CRIMSON_STR | Crimson Rock
+ 728 | EF_HELL_STR | Small fire (part of Hell Inferno)
+ 729 | EF_SPR_MASH | Marsh of Abyss (like Close Confine)
+ 730 | EF_SPR_SOULE | Small, cartoony explosion (part of Soul Expansion)
+ 731 | EF_DHOWL_STR | Dragon Howling (blinking, expanding circle)
+ 732 | EF_EARTHWALL | Spike from the ground
+ 733 | EF_SOULBREAKER4 | Fluffy Ball flying by
+ 734 | EF_CHAINL_STR | Chain Lightning
+ 735 | EF_CHOOKGI_FIRE | (Nothing)
+ 736 | EF_CHOOKGI_WIND | (Nothing)
+ 737 | EF_CHOOKGI_WATER | (Nothing)
+ 738 | EF_CHOOKGI_GROUND | (Nothing)
+ 739 | EF_MAGENTA_TRAP | Old Magenta Trap
+ 740 | EF_COBALT_TRAP | Old Cobald Trap
+ 741 | EF_MAIZE_TRAP | Old Maize Trap
+ 742 | EF_VERDURE_TRAP | Old Verdure Trap
+ 743 | EF_NORMAL_TRAP | White Ranger Trap
+ 744 | EF_CLOAKING2 | Camouflage
+ 745 | EF_AIMED_STR | Aimed Bolt (crosshairs)
+ 746 | EF_ARROWSTORM_STR | Arrow Storm
+ 747 | EF_LAULAMUS_STR | Falling white feathers
+ 748 | EF_LAUAGNUS_STR | Falling blue feathers
+ 749 | EF_MILSHIELD_STR | Millennium Shield
+ 750 | EF_CONCENTRATION2 | Detonator (blue sparkles)
+ 751 | EF_FIREBALL2 | Releasing summoned warlock spheres
+ 752 | EF_BUNSINJYUTSU2 | Like Energy Coat, but not as dark
+ 753 | EF_CLEARTIME | Clearance
+ 754 | EF_GLASSWALL3 | Green warp portal (root of Epiclesis)
+ 755 | EF_ORATIO | Oratio (spinning blue symbol)
+ 756 | EF_POTION_BERSERK2 | Enchant Blade (like Berserk Potion)
+ 757 | EF_CIRCLEPOWER | Third Class Aura (Middle)
+ 758 | EF_ROLLING1 | Rolling Cutter - Spin Count 1
+ 759 | EF_ROLLING2 | Rolling Cutter - Spin Count 2
+ 760 | EF_ROLLING3 | Rolling Cutter - Spin Count 3
+ 761 | EF_ROLLING4 | Rolling Cutter - Spin Count 4
+ 762 | EF_ROLLING5 | Rolling Cutter - Spin Count 5
+ 763 | EF_ROLLING6 | Rolling Cutter - Spin Count 6
+ 764 | EF_ROLLING7 | Rolling Cutter - Spin Count 7
+ 765 | EF_ROLLING8 | Rolling Cutter - Spin Count 8
+ 766 | EF_ROLLING9 | Rolling Cutter - Spin Count 9
+ 767 | EF_ROLLING10 | Rolling Cutter - Spin Count 10
+ 768 | EF_PURPLEBODY | Blinking
+ 769 | EF_STIN6 | Cross Ripper Slasher (flying knives)
+ 770 | EF_RG_COIN4 | Strip sound
+ 771 | EF_POISONWAV | Poison sound
+ 772 | EF_POISONSMOKE | Poison particles
+ 773 | EF_GUMGANG4 | Expanding purple aura (part of Phantom Menace)
+ 774 | EF_SHIELDBOOMERANG4 | Axe Boomerang
+ 775 | EF_CASTSPIN2 | Spinning character sprite
+ 776 | EF_VULCANWAV | Like Desperado sound effect
+ 777 | EF_AGIUP2 | Faded light from the ground [S]
+ 778 | EF_DETECT3 | Expanding white aura (like Clearance)
+ 779 | EF_AGIUP3 | Faded light from the ground [S]
+ 780 | EF_DETECT4 | Expanding red aura (from Infrared Scan)
+ 781 | EF_ELECTRIC3 | Magnetic Field (purple chains)
+ 782 | EF_GUARD4 | All-around shield [S]
+ 783 | EF_BOTTOM_BARRIER | Yellow shaft of light
+ 784 | EF_BOTTOM_STEALTH | White shaft of light
+ 785 | EF_REPAIRTIME | Upward flying wrenches
+ 786 | EF_NC_ANAL | Symbol with bleeping sound [S]
+ 787 | EF_FIRETHROW | Flare Launcher (line of fire)
+ 788 | EF_VENOMIMPRESS | Venom Impress (green skull)
+ 789 | EF_FROSTMISTY | Freezing Status Effect (two ancillas)
+ 790 | EF_BURNING | Burning Status Effect (flame symbol)
+ 791 | EF_COLDTHROW | Two ice shots
+ 792 | EF_MAKEHALLU | Upward streaming white particles
+ 793 | EF_HALLUTIME | Same, but more brief
+ 794 | EF_INFRAREDSCAN | Infrared Scan (red lasers)
+ 795 | EF_CRASHAXE | Power Swing (axe crash)
+ 796 | EF_GTHUNDER | Spinning blue triangles
+ 797 | EF_STONERING | Stapo
+ 798 | EF_INTIMIDATE2 | Red triangles (like Intimidate)
+ 799 | EF_STASIS | Stasis (expanding blue mist) [S]
+ 800 | EF_REDLINE | Hell Inferno (red lights)
+ 801 | EF_FROSTDIVER3 | Jack Frost unit (ice spikes)
+ 802 | EF_BOTTOM_BASILICA2 | White Imprison
+ 803 | EF_RECOGNIZED | Recognized Spell
+ 804 | EF_TETRA | Tetra Vortex [S]
+ 805 | EF_TETRACASTING | Tetra Vortex cast animation (blinking colors)
+ 806 | EF_FIREBALL3 | Flying by as fast as a rocket
+ 807 | EF_INTIMIDATE3 | Kidnapping sound
+ 808 | EF_RECOGNIZED2 | Like Recognized Spell, but one symbol
+ 809 | EF_CLOAKING3 | Shadowy filter [S]
+ 810 | EF_INTIMIDATE4 | Damp thud sound [S]
+ 811 | EF_STRETCH | Body Painting
+ 812 | EF_BLACKBODY | Black expanding aura
+ 813 | EF_ENERVATION | Masquerade - Enervation
+ 814 | EF_ENERVATION2 | Masquerade - Groomy
+ 815 | EF_ENERVATION3 | Masquerade - Ignorance
+ 816 | EF_ENERVATION4 | Masquerade - Laziness
+ 817 | EF_ENERVATION5 | Masquerade - Unlucky
+ 818 | EF_ENERVATION6 | Masquerade - Weakness
+ 819 | EF_LINELINK4 | (Nothing)
+ 820 | EF_RG_COIN5 | Strip Accessory
+ 821 | EF_WATERFALL_ANI | Waterfall
+ 822 | EF_BOTTOM_MANHOLE | Dimension Door (spinning blue aura)
+ 823 | EF_MANHOLE | in-the-manhole effect
+ 824 | EF_MAKEFEINT | Some filter
+ 825 | EF_FORESTLIGHT6 | Dimension Door (aura + blue light)
+ 826 | EF_DARKCASTING2 | Expanding black casting anim.
+ 827 | EF_BOTTOM_ANI | Chaos Panic (spinning brown aura)
+ 828 | EF_BOTTOM_MAELSTROM | Maelstrom (spinning pink aura)
+ 829 | EF_BOTTOM_BLOODYLUST | Bloody Lust (spinning red aura)
+ 830 | EF_BEGINSPELL_N1 | Blue aura (Arch Bishop cast animation)
+ 831 | EF_BEGINSPELL_N2 | Blue cone [S]
+ 832 | EF_HEAL_N | Sonic Wave
+ 833 | EF_CHOOKGI_N | (Nothing)
+ 834 | EF_JOBLVUP50_2 | Light shooting away circlish
+ 835 | EF_CHEMICAL2DASH2 | Fastness yellow-reddish
+ 836 | EF_CHEMICAL2DASH3 | Fastness yellow-pinkish
+ 837 | EF_ROLLINGCAST | Casting [S]
+ 838 | EF_WATER_BELOW | Watery aura
+ 839 | EF_WATER_FADE | [Client Error]
+ 840 | EF_BEGINSPELL_N3 | Red cone
+ 841 | EF_BEGINSPELL_N4 | Green cone
+ 842 | EF_BEGINSPELL_N5 | Yellow cone
+ 843 | EF_BEGINSPELL_N6 | White cone
+ 844 | EF_BEGINSPELL_N7 | Purple cone
+ 845 | EF_BEGINSPELL_N8 | light-bluish turquoise cone
+ 846 | EF_WATER_SMOKE | (Nothing)
+ 847 | EF_DANCE1 | Gloomy Day (white/red light rays)
+ 848 | EF_DANCE2 | Gloomy Day (white/blue light rays)
+ 849 | EF_LINKPARTICLE | (Nothing)
+ 850 | EF_SOULLIGHT2 | (Nothing)
+ 851 | EF_SPR_PARTICLE | Green mushy-foggy stuff (dull)
+ 852 | EF_SPR_PARTICLE2 | Green mushy-foggy stuff (bright)
+ 853 | EF_SPR_PLANT | Bright green flower area
+ 854 | EF_CHEMICAL_V | Blue beam of light with notes
+ 855 | EF_SHOOTPARTICLE | (Nothing)
+ 856 | EF_BOT_REVERB | Reverberation (red eighth notes)
+ 857 | EF_RAIN_PARTICLE | Severe Rainstorm (falling red and blue beams)
+ 858 | EF_CHEMICAL_V2 | Deep Sleep Lullaby (two red beams and music notes)
+ 859 | EF_SECRA | Holograph of text (blue)
+ 860 | EF_BOT_REVERB2 | Distorted note (blue)
+ 861 | EF_CIRCLEPOWER2 | Green aura (from Circle of Life's Melody)
+ 862 | EF_SECRA2 | Randomize Spell (holograph of text)
+ 863 | EF_CHEMICAL_V3 | Dominion Impulse (two spears of light)
+ 864 | EF_ENERVATION7 | Gloomy Day (colorful lines)
+ 865 | EF_CIRCLEPOWER3 | Blue aura (from Song of Mana)
+ 866 | EF_SPR_PLANT2 | Dance with a Warg (Wargs)
+ 867 | EF_CIRCLEPOWER4 | Yellow aura (from Dance with a Warg)
+ 868 | EF_SPR_PLANT3 | Song of Mana (Violies)
+ 869 | EF_RG_COIN6 | Strip sound [S]
+ 870 | EF_SPR_PLANT4 | Ghostly Succubuses of fire
+ 871 | EF_CIRCLEPOWER5 | Red aura (from Lerad's Dew)
+ 872 | EF_SPR_PLANT5 | Lerad's Dew (Minerals)
+ 873 | EF_CIRCLEPOWER6 | Stargate-wormhole stuff (bright purple)
+ 874 | EF_SPR_PLANT6 | Melody of Sink (Ktullanuxes)
+ 875 | EF_CIRCLEPOWER7 | Stargate-wormhole stuff (bright turquoise)
+ 876 | EF_SPR_PLANT7 | Warcry of Beyond (Garms)
+ 877 | EF_CIRCLEPOWER8 | Stargate-wormhole stuff (white)
+ 878 | EF_SPR_PLANT8 | Unlimited Humming Voice (Miyabi Ningyos)
+ 879 | EF_HEARTASURA | Siren's Voice (heart-like)
+ 880 | EF_BEGINSPELL_150 | Bluish castish cone
+ 881 | EF_LEVEL99_150 | Blue aura
+ 882 | EF_PRIMECHARGE | Whirl of fireflies (red)
+ 883 | EF_GLASSWALL4 | Epiclesis (transparent green tree)
+ 884 | EF_GRADIUS_LASER | Green beam
+ 885 | EF_BASH3D6 | Blue light beams
+ 886 | EF_GUMGANG5 | Blue castish cone
+ 887 | EF_HITLINE8 | Wavy sparks
+ 888 | EF_ELECTRIC4 | Earth Shaker (same as 432)
+ 889 | EF_TEIHIT1T | Fast light beams
+ 890 | EF_SPINMOVE | Rotation
+ 891 | EF_FIREBALL4 | Magic shots [S]
+ 892 | EF_TRIPLEATTACK4 | Fastness with hitting sound[S]
+ 893 | EF_CHEMICAL3S | Blue-white light passing by
+ 894 | EF_GROUNDSHAKE | (Nothing)
+ 895 | EF_DQ9_CHARGE | Big wheel of flat light beams
+ 896 | EF_DQ9_CHARGE2 | Still sun shaped lightning aura
+ 897 | EF_DQ9_CHARGE3 | Animated sun shaped lightning aura
+ 898 | EF_DQ9_CHARGE4 | Animated, curvy sun shaped lightning aura
+ 899 | EF_BLUELINE | White/red light shots from below
+ 900 | EF_SELFSCROLL | Animated, slow curvy sun shaped lightning aura
+ 901 | EF_SPR_LIGHTPRINT | Explosion
+ 902 | EF_PNG_TEST | Floating bedtable texture
+ 903 | EF_BEGINSPELL_YB | Castish flamey cone
+ 904 | EF_CHEMICAL2DASH4 | Yellow/pink lights passing by
+ 905 | EF_GROUNDSHAKE2 | Expanding circle
+ 906 | EF_PRESSURE2 | Shield Press (falling shield)
+ 907 | EF_RG_COIN7 | Chainy, metalish sound [S]
+ 908 | EF_PRIMECHARGE2 | Prestige (sphere of yellow particles)
+ 909 | EF_PRIMECHARGE3 | Banding (sphere of red particles)
+ 910 | EF_PRIMECHARGE4 | Inspiration (sphere of blue particles)
+ 911 | EF_GREENCASTING | Green castish animation [S]
+ 912 | EF_WALLOFTHORN | Wall of Thorns unit (green fog cloud)
+ 913 | EF_FIREBALL5 | Magic projectiles
+ 914 | EF_THROWITEM11 | (Nothing)
+ 915 | EF_SPR_PLANT9 | Crazy Weed
+ 916 | EF_DEMONICFIRE | Demonic Fire
+ 917 | EF_DEMONICFIRE2 | More angry, demonic flames
+ 918 | EF_DEMONICFIRE3 | Fire Insignia (demonic flames)
+ 919 | EF_HELLSPLANT | Hell's Plant (green snapping plant)
+ 920 | EF_FIREWALL2 | Fire Walk unit
+ 921 | EF_VACUUM | Vacuum Extreme (whirlwind)
+ 922 | EF_SPR_PLANT10 | Psychic Wave
+ 923 | EF_SPR_LIGHTPRINT2 | Poison Buster
+ 924 | EF_POISONSMOKE2 | Poisoning animation
+ 925 | EF_MAKEHALLU2 | Some filter
+ 926 | EF_SHOCKWAVE2 | Electric Walk unit
+ 927 | EF_SPR_PLANT11 | Earth Grave (speary roots)
+ 928 | EF_COLDTHROW2 | Ice cloud projectiles
+ 929 | EF_DEMONICFIRE4 | Warmer (field of flames)
+ 930 | EF_PRESSURE3 | Varetyr Spear (falling spear)
+ 931 | EF_LINKPARTICLE2 | (Nothing)
+ 932 | EF_SOULLIGHT3 | Firefly
+ 933 | EF_CHAREFFECT | [Client Crash]
+ 934 | EF_GUMGANG6 | White, castishly expanding cone
+ 935 | EF_FIREBALL6 | Green magic projectile
+ 936 | EF_GUMGANG7 | Red, castishly expanding cone
+ 937 | EF_GUMGANG8 | Yellow, castishly expanding cone
+ 938 | EF_GUMGANG9 | Dark-red, castishly expanding cone
+ 939 | EF_BOTTOM_DE2 | Blue, conish aura
+ 940 | EF_COLDSTATUS | Snow flake
+ 941 | EF_SPR_LIGHTPRINT3 | Explosion of red, demonic fire
+ 942 | EF_WATERBALL3 | Expanding, white dome
+ 943 | EF_HEAL_N2 | Green, fluffy projectile
+ 944 | EF_RAIN_PARTICLE2 | Falling gems
+ 945 | EF_CLOUD9 | (Nothing)
+ 946 | EF_YELLOWFLY3 | Floating lights
+ 947 | EF_EL_GUST | Blue lightning sphere
+ 948 | EF_EL_BLAST | Two blue lightning spheres
+ 949 | EF_EL_AQUAPLAY | Flat, spinning diamond
+ 950 | EF_EL_UPHEAVAL | Circling, planetlike spheres
+ 951 | EF_EL_WILD_STORM | Three lightning spheres
+ 952 | EF_EL_CHILLY_AIR | Flat, spinning gem and two lightning spheres
+ 953 | EF_EL_CURSED_SOIL | Spinning, planetlike spheres
+ 954 | EF_EL_COOLER | Two lightblue glowing spheres
+ 955 | EF_EL_TROPIC | Three spinning flame spheres
+ 956 | EF_EL_PYROTECHNIC | Flame
+ 957 | EF_EL_PETROLOGY | Spinning planetlike sphere
+ 958 | EF_EL_HEATER | Two flames
+ 959 | EF_POISON_MIST | Purple flame
+ 960 | EF_ERASER_CUTTER | Small yellow explosion
+ 961 | EF_SILENT_BREEZE | Cartoony whirlwind
+ 962 | EF_MAGMA_FLOW | Rising fire
+ 963 | EF_GRAYBODY | Dark filter (like Stone Curse)
+ 964 | EF_LAVA_SLIDE | Same as 920
+ 965 | EF_SONIC_CLAW | Small white explosion
+ 966 | EF_TINDER_BREAKER | Bone crack
+ 967 | EF_MIDNIGHT_FRENZY | Another little explosion
+ 968 | EF_MACRO |
+ 969 | EF_CHEMICAL_ALLRANGE |
+ 970 | EF_TETRA_FIRE |
+ 971 | EF_TETRA_WATER |
+ 972 | EF_TETRA_WIND |
+ 973 | EF_TETRA_GROUND |
+ 974 | EF_EMITTER |
+ 975 | EF_VOLCANIC_ASH |
+ 976 | EF_LEVEL99_ORB1 |
+ 977 | EF_LEVEL99_ORB2 |
+ 978 | EF_LEVEL150 |
+ 979 | EF_LEVEL150_SUB |
+ 980 | EF_THROWITEM4_1 |
+ 981 | EF_THROW_HAPPOKUNAI |
+ 982 | EF_THROW_MULTIPLE_COIN |
+ 983 | EF_THROW_BAKURETSU |
+ 984 | EF_ROTATE_HUUMARANKA |
+ 985 | EF_ROTATE_BG |
+ 986 | EF_ROTATE_LINE_GRAY |
+ 987 | EF_2011RWC |
+ 988 | EF_2011RWC2 |
+ 989 | EF_KAIHOU |
+ 990 | EF_GROUND_EXPLOSION |
+ 991 | EF_KG_KAGEHUMI |
+ 992 | EF_KO_ZENKAI_WATER |
+ 993 | EF_KO_ZENKAI_LAND |
+ 994 | EF_KO_ZENKAI_FIRE |
+ 995 | EF_KO_ZENKAI_WIND |
+ 996 | EF_KO_JYUMONJIKIRI |
+ 997 | EF_KO_SETSUDAN |
+ 998 | EF_RED_CROSS |
+ 999 | EF_KO_IZAYOI |
+1000 | EF_ROTATE_LINE_BLUE |
+1001 | EF_KG_KYOMU |
+1002 | EF_KO_HUUMARANKA |
+1003 | EF_BLUELIGHTBODY |
+1004 | EF_KAGEMUSYA |
+1005 | EF_OB_GENSOU |
+1006 | EF_NO100_FIRECRACKER |
+1007 | EF_KO_MAKIBISHI |
+1008 | EF_KAIHOU1 |
+1009 | EF_AKAITSUKI |
+1010 | EF_ZANGETSU |
+1011 | EF_GENSOU |
+1012 | EF_HAT_EFFECT |
+1013 | EF_CHERRYBLOSSOM |
+1014 | EF_EVENT_CLOUD |
+1015 | EF_RUN_MAKE_OK |
+1016 | EF_RUN_MAKE_FAILURE |
+1017 | EF_MIRESULT_MAKE_OK |
+1018 | EF_MIRESULT_MAKE_FAIL |
+1019 | EF_ALL_RAY_OF_PROTECTION |
+1020 | EF_VENOMFOG |
+1021 | EF_DUSTSTORM |
+1022 | EF_LEVEL160 |
+1023 | EF_LEVEL160_SUB |
+1024 | EF_MAPCHAIN |
+1025 | EF_MAGIC_FLOOR |
+1026 | EF_ICEMINE |
+1027 | EF_FLAMECORSS |
+1028 | EF_ICEMINE_1 |
+1029 | EF_DANCE_BLADE_ATK |
+1030 | EF_DARKPIERCING |
+1031 | EF_INVINCIBLEOFF2 |
+1032 | EF_MAXPAIN |
+1033 | EF_DEATHSUMMON |
+1034 | EF_MOONSTAR |
+1035 | EF_STRANGELIGHTS |
+1036 | EF_SUPER_STAR |
+1037 | EF_YELLOBODY |
+1038 | EF_COLORPAPER2 |
+1039 | EF_EVILS_PAW |
+1040 | EF_GC_DARKCROW |
+1041 | EF_RK_DRAGONBREATH_WATER |
+1042 | EF_ALL_FULL_THROTTLE |
+1043 | EF_SR_FLASHCOMBO |
+1044 | EF_RK_LUXANIMA |
+1045 | EF_CLOUD10 |
+1046 | EF_SO_ELEMENTAL_SHIELD |
+1047 | EF_AB_OFFERTORIUM |
+1048 | EF_WL_TELEKINESIS_INTENSE |
+1049 | EF_GN_ILLUSIONDOPING |
+1050 | EF_NC_MAGMA_ERUPTION |
+1051 | EF_LG_KINGS_GRACE |
+1052 | EF_BLOODDRAIN2 |
+1053 | EF_NPC_WIDEWEB |
+1054 | EF_NPC_BURNT |
+1055 | EF_NPC_CHILL |
+1056 | EF_RA_UNLIMIT |
+1057 | EF_AB_OFFERTORIUM_RING |
+1058 | EF_SC_ESCAPE |
+1059 | EF_WM_FRIGG_SONG |
+1060 | EF_FLICKER |
+1061 | EF_C_MAKER |
+1062 | EF_HAMMER_OF_GOD |
+1063 | EF_MASS_SPIRAL |
+1064 | EF_FIRE_RAIN |
+1065 | EF_WHITEBODY |
+1066 | EF_BANISHING_BUSTER |
+1067 | EF_SLUGSHOT |
+1068 | EF_D_TAIL |
+1069 | EF_BIND_TRAP1 |
+1070 | EF_BIND_TRAP2 |
+1071 | EF_BIND_TRAP3 |
+1072 | EF_JUMPBODY1 |
+1073 | EF_ANIMATED_EMITTER |
+1074 | EF_RL_EXPLOSION |
+1075 | EF_C_MAKER_1 |
+1076 | EF_QD_SHOT |
+1077 | EF_P_ALTER |
+1078 | EF_S_STORM |
+1079 | EF_MUSIC_HAT |
+1080 | EF_CLOUD_KILL |
+1081 | EF_ESCAPE |
+1082 | EF_XENO_SLASHER |
+1083 | EF_FLOWERSMOKE |
+1084 | EF_FSTONE |
+1085 | EF_QSCARABA |
+1086 | EF_LJOSALFAR |
+1087 | EF_HAPPINESSSTAR |
+1088 | EF_POWER_OF_GAIA |
+1089 | EF_MAPLE_FALLS |
+1090 | EF_MARKING_USE_CHANGEMONSTER |
+1091 | EF_MAGICAL_FEATHER |
+1092 | EF_MERMAID_LONGING |
+1093 | EF_GIFT_OF_SNOW |
+1094 | EF_ACH_COMPLETE |
+1095 | EF_TIME_ACCESSORY |
+1096 | EF_SPRITEMABLE |
+1097 | EF_TUNAPARTY |
diff --git a/doc/effect_list.txt b/doc/effect_list.txt
deleted file mode 100644
index 01ea2753b..000000000
--- a/doc/effect_list.txt
+++ /dev/null
@@ -1,986 +0,0 @@
-//===== Hercules Documentation ===============================
-//= Client Effects List
-//===== By: ==================================================
-//= Hercules Dev Team
-//===== Current Version: =====================================
-//= 20120822
-//===== Description: =========================================
-//= A list of client-side effects sorted by ID.
-//============================================================
-
-The following is a compiled list of visual and sound effects which the client
-can produce when receiving a packet with id 0x1f3 (01f3 <ID>.l <type>.l).
-Each list entry contains a number and a short description of the effect.
-You can produce these effects ingame by doing "@effect <number> 22" (22=self).
-It's also possible to attach effects to item/npc scripts by using 'misceffect'.
-
-Number Description
------- -----------
-0. Regular Hit
-1. Bash
-2. Melee Skill Hit
-3. Melee Skill Hit
-4. Melee Skill Hit
-5. Melee Skill Hit
-6. Being Warped
-7. Item Heal effect
-8. Yellow Ripple Effect
-9. Different Type of Heal
-10. Mammonite
-11. Endure
-12. Yellow cast aura
-13. Blue Box
-14. Blue restoring effect
-15. Soul Strike
-16. Hide
-17. Magnum Break
-18. Steal
-19. (Invalid)
-20. Envenom/Poison
-21. Detoxify
-22. Sight
-23. Stone Curse
-24. Fire Ball
-25. Fire Wall
-26. A sound (a swipe?)
-27. Frost Diver (Traveling to Target)
-28. Frost Diver (Hitting)
-29. Lightning Bolt
-30. Thunder Storm
-31. Weird bubbles launching from feet
-32. Small clustered explosions
-33. Ruwach
-34. Old Map Exit Animation (unused)
-35. Old Warp Portal (unused)
-36. Old Warp Portal (unused)
-37. AGI Up
-38. AGI Down
-39. Aqua Benedicta
-40. Signum Crucis
-41. Angelus
-42. Blessing
-43. Dex + Agi Up
-44. Little Fog Smoke.
-45. Faint Little Ball Things.
-46. Sand Wind
-47. Torch
-48. Small Piece of Glass
-49. Firebolt/Wall Hits
-50. Spinning Fire Thing
-51. Ice Elemental Hit
-52. Wind Elemental Hit
-53. Puff of Purpulish Smoke?
-54. Cast Initiation Aura (Water Element)
-55. Cast Initiation Aura (Fire Element)
-56. Cast Initiation Aura (Wind Element)
-57. Cast Initiation Aura (Earth Element)
-58. Cast Initiation Aura (Holy Element)
-59. Cast Initiation Aura (Poison Element)
-60. Cast target circle
-61. Old Warp Portal (NPC Warp, unused)
-62. Sight Trasher
-63. Moonlight Sphere
-64. Something Like Puruple/Yellow Light Bullet
-65. Something Like Absorb of Power
-66. Cure
-67. Provoke
-68. MVP Banner
-69. Skid Trap
-70. Brandish Spear
-71. Spiral White balls
-72. Bigger Spiral White balls
-73. Blue/White Small Aura
-74. Ice Wall
-75. Gloria
-76. Magnificat
-77. Resurrection
-78. Status Recovery
-79. Earth Spike
-80. Spear Boomerang
-81. Skill hit
-82. Turn Undead
-83. Sanctuary
-84. Impositio Manus
-85. Lex Aeterna
-86. Aspersio
-87. Lex Divina
-88. Suffragium
-89. Storm Gust
-90. Lord of Vermilion
-91. B. S. Sacramenti
-92. Meteor Storm
-93. Jupitel Thunder (Ball)
-94. Jupitel Thunder (Hit)
-95. Quagmire
-96. Fire Pillar
-97. Fire Pillar/Land Mine hit
-98. Adrenaline Rush
-99. Flasher Trap
-100. Yellow ball fountain
-101. Weapon Repair
-102. Hammerfall
-103. Weapon Perfection
-104. Maximize Power
-105. (nothing)
-106. Blast Mine Trap
-107. Claymore Trap
-108. Freezing Trap
-109. Bailaban Blue bubble Map Effect
-110. Trap Used by Giearth
-111. Spring Trap
-112. Kyrie Eleison
-113. Magnus Exorcismus
-114. Old Magnus Exorcismus Map Unit (unused)
-115. Blitz Beat
-116. Fling Watersphere
-117. Waterball
-118. Fling Firesphere
-119. Detect
-120. Cloaking
-121. Sonic Blow (Part 1/2)
-122. Multi hit effect
-123. Grimtooth Cast
-124. Venom Dust
-125. Enchant Poison
-126. Poison React
-127. Small Posion React
-128. Over Thrust
-129. Venom Splasher Explosion
-130. Two-Hand Quicken
-131. Auto-Counter Hit
-132. Grimtooth Hit
-133. Ice Effect (Used by NPCs)
-134. Ice Effect (Used by NPCs)
-135. Ice Effect (Used by NPCs)
-136. Slow Poison
-137. Old Sanctuary Map Unit (unused)
-138. Fire pillar
-139. Sandman Trap
-140. Ressurection Aura
-141. Pneuma
-142. Heaven's Drive
-143. Sonic Blow (Part 2/2)
-144. Brandish Spear Pre-Hit Effect
-145. Shockwave Trap
-146. Shockwave Trap Hit
-147. Pierce Hit
-148. Pierce Cast Animation
-149. Bowling Bash
-150. Pierce Cast Animation
-151. Spear Boomerang Cast
-152. Turn Undead
-153. Increase Concentration
-154. Refine Success
-155. Refine Fail
-156. jobchange.str not found error
-157. levelup.str not found error
-158. Job Level Up
-159. PvP circle
-160. PvP Party Circle
-161. (Nothing)
-162. Snow
-163. White Sakura Leaves
-164. (Nothing)
-165. Comodo Fireworks Ball
-166. Energy Coat (Visual Effect)
-167. (Nothing)
-168. (Nothing)
-169. Energy Coat Animation
-170. Cart Revolution
-171. Venom Dust Map Unit
-172. Change Element (Dark)
-173. Change Element (Fire)
-174. Change Element (Water)
-175. Change Element (Wind)
-176. Change Element (Fire)
-177. Change Element (Earth)
-178. Change Element (Holy)
-179. Change Element (Poison)
-180. Darkness Attack
-181. Mental Breaker
-182. Magical Hit
-183. Self Destruction
-184. (Nothing)
-185. (Nothing)
-186. Combo Attack 1
-187. Combo Attack 2
-188. Combo Attack 3
-189. Combo Attack 4
-190. Combo Attack 5
-191. Guided Attack
-192. Poison Attack
-193. Silence Attack
-194. Stun Attack
-195. Petrify Attack
-196. Curse Attack
-197. Sleep Attack
-198. (Nothing)
-199. Small Popping Bubble Map Effect
-200. Normal level 99 Aura (Middle)
-201. Normal level 99 Aura (Bottom)
-202. Lv 99 Aura Bubble
-203. Fury (Visual Effect)
-204. Red Herb/Potion
-205. Orange Potion
-206. Yellow Herb/Potion
-207. White Herb/Potion
-208. Blue Herb/Potion
-209. Green Herb/Potion
-210. Yellow Circle Healing Effect
-211. Blue Circle Healing Effect
-212. Dark Breath
-213. Defender
-214. Keeping
-215. Summon Slave
-216. Blood Drain
-217. Energy Drain
-218. Concentration Potion
-219. Awakening Potion
-220. Berserk Potion
-221. Intense light beam
-222. Defender (Crusader)
-223. Holy Cast Aura
-224. Wind (Map effect)
-225. Volcano casting effect
-226. Grand Cross Effect
-227. Snatch
-228. (Nothing)
-229. (Nothing)
-230. (Nothing)
-231. Map Light Pillar Animation 1
-232. Sacrifice (Visual Effect)
-233. Fog
-234. Spell Breaker
-235. Dispell
-236. Deluge Cast Aura
-237. Violent Gale Cast Aura
-238. Magnetic Earth Cast Aura
-239. Volcano (Visual Effect)
-240. Deluge (Visual Effect)
-241. Violent Gale (Visual Effect)
-242. Magnetic Earth (Visual Effect)
-243. (Invalid)
-244. Magic Rod
-245. Holy Cross
-246. Shield Charge
-247. Map Light Pillar Animation 2
-248. Resistant Souls
-249. Shield Boomerang
-250. Spear Quicken
-251. Devotion
-252. Reflect Shield
-253. Absorb Spirit Spheres
-254. Mental Strength (Visual Effect)
-255. Elemental Endow (Fire)
-256. Elemental Endow (Water)
-257. Elemental Endow (Wind)
-258. Elemental Endow (Earth)
-259. Map Light Pillar Animation 3
-260. Map Light Pillar Animation 4
-261. Fury Cast Animation
-262. Raging Quadruple Blow
-263. Raging Quadruple Blow 2
-264. (Nothing)
-265. Throw Spirit Sphere
-266. Raging Quadruple Blow 3
-267. Occult Impaction
-268. Steal Coin
-269. Divest Weapon
-270. Divest Shield
-271. Divest Armor
-272. Divest Helm
-273. Raging Quadruple Blow 4
-274. Steal Coin Animation
-275. Back Stab Animation
-276. Raging Thrust
-277. Dissoance Map Unit
-278. Lullaby Map Unit
-279. Mr Kim a Rich Man Map Unit
-280. Eternal Chaos Map Unit
-281. A Drum on the Battlefield Map Unit
-282. The Ring Of Nibelungen Map Unit
-283. Loki's Veil Map Unit
-284. Into the Abyss Map Unit
-285. Invunerable Siegfriend Map Unit
-286. A Wistle Map Unit
-287. Assassin Cross of Sunset Map Unit
-288. A Poem of Bragi Map Unit
-289. The Apple Of Idun Map Unit
-290. Ugly Dance Map Unit
-291. Humming Map Unit
-292. Please don't Forget Me Map Unit
-293. Fortune's Kiss Map Unit
-294. Service For You Map Unit
-295. Frost Joke
-296. Scream
-297. Fire Works (Visual Effect)
-298. Acid Terror Animnation
-299. (Nothing)
-300. Chemical Protection
-301. Fire Works (Sound Effect)
-302. Bomb
-303. (Unused)
-304. Teleportation Animation
-305. Pharmacy Success
-306. Pharmacy Failed
-307. Forest Light 1
-308. Throw Stone
-309. First Aid
-310. Sprinkle Sand
-311. Crazy Uproar
-312. Heal Effect
-313. Heal Effect 2
-314. Old Map Exit effect (Unused)
-315. Safety Wall
-316. Warp Portal Animation 1
-317. Warp Portal Animation 2
-318. Magnus Exorcisimus Map Unit
-319. Sanctuary Map Unit
-320. Offensive Heal
-321. Warp NPC
-322. Forest Light 2
-323. Forest Light 3
-324. Forest Light 4
-325. Heal Effect 4
-326. Chase Walk Left Foot
-327. Chse Walk Right Foot
-328. Monk Asura Strike
-329. Triple Strike
-330. Combo Finish
-331. Natural HP Regeneration
-332. Natural SP Regeneration
-333. Autumn Leaves
-334. Blind
-335. Poison
-336. Kyrie Eleison/Parrying Shield
-337. Class Change
-338. Super Novice/Taekwon Level Up Angel
-339. Spiral Pierce
-340. (Nothing)
-341. Wedding Warp Portal
-342. Wedding Skill
-343. Another Merry Skill
-344. Character map entry effect
-345. Wings (Animated)
-346. Like Moonlight But Blue
-347. Wedding Ceremony
-348. Like 1000 Blade trepassing
-349. Waterfall (Horizonatal)
-350. Waterfall (Vertical)
-351. Small Waterfall (Horizonatal)
-352. Small Waterfall (Vertical)
-353. Dark Waterfall (Horizonatal)
-354. Dark Waterfall (Vertical)
-355. Dark Small Waterfall (Horizonatal)
-356. Dark Small Waterfall (Vertical)
-357. (Nothing)
-358. Niflheim Ghost
-359. Niflheim Bat Slow
-360. Niflheim Bat Fast
-361. Soul Destroyer
-362. Trancendant Level 99 Aura 1
-363. Valentine Day Heart With Wings
-364. Valentine Day Heart
-365. Gloria Domini
-366. Martyr's Reckoning
-367. Aura Blade
-368. Berserk
-369. Concentration
-370. Gospel Map Unit
-371. Level Up
-372. Death
-373. House Smoke
-374. Basilica
-375. Assumptio (Visual Effect)
-376. Palm Strike
-377. Matyr's Reckoning 2
-378. Soul Drain (1st Part)
-379. Soul Drain (2nd Part)
-380. Magic Crasher
-381. Blue Starburst (Unknown use)
-382. (Nothing)
-383. Health Conversion
-384. Soul Change (Sound Effect)
-385. Soul Change (Visual Effect)
-386. True Sight
-387. Falcon Assault
-388. Focused Arrow Strike (Sound Effect)
-389. Wind Walk
-390. Shattering Strike
-391. Cart Boost
-392. Reject Sword
-393. Arrow Vulcan
-394. Sheltering Bliss
-395. Marionette Control (Sound Effect)
-396. Marionette Control (Visual Effect)
-397. Trancended 99 Aura (Middle)
-398. Trancended 99 Aura (Bottom)
-399. Head Crush
-400. Joint Beat
-401. Napalm Vulcan Sound
-402. Dangerous Soul Collect
-403. Mind Breaker
-404. Fiber Lock
-405. Wall Of Fog
-406. Soul Burn
-407. Soul Change
-408. Mom, Dad, I love you! (Baby Skill)
-409. Meteor Assault
-410. Rainbow
-411. Leap
-412. Like Throw Spirit Sphere
-413. Axe Kick
-414. Round Kick
-415. Counter Kick
-416. (Nothing)
-417. Flash
-418. Warmth Lightning
-419. Kaite (Visual Effect)
-420. Eswoo (Small) (Visual Effect)
-421. Eswoo (Alt. Small) (Visual Effect)
-422. Eswoo (Normal) (Visual Effect)
-423. Eswoo (Alt. Normal) (Visual Effect)
-424. Spirit Link (Visual Effect)
-425. Esma Hit (Visual Effect)
-426. Sprint Collision (Visual Effect)
-427. (Nothing)
-428. (Nothing)
-429. Taekwon Kick Hit 1
-430. Taekwon Kick Hit 2
-431. Taekwon Kick Hit 3
-432. Solar, Lunar and Stellar Perception (Visual Effect)
-433. Solar, Lunar and Stellar Opposition (Visual Effect)
-434. Taekwon Kick Hit 4
-435. Whirlwind Kick
-436. White Barrier (Unused)
-437. White barrier 2 (Unused)
-438. Kaite Reflect Animation
-439. Flying Side Kick
-440. Assumptio (Animation)
-441. Comfort Skills Cast Aura
-442. Foot Prints caused by Sprint.
-443. (Nothing)
-444. Sprint Stop Animation
-445. High Jump (Jump)
-446. High Jump (Return Down)
-447. Running Left Foot
-448. Running Right Foot
-449. KA-Spell (1st Part)
-450. Darkcross
-451. Dark Strike
-452. Something Like Jupitel Thunder
-453. Paralized
-454. Like Blind
-455. Another Warmth Lightning
-456. Power Up
-457. Flying Side Kick (2nd Part)
-458. Running/Sprint (running into a wall)
-459. Brown tornado that spins sprite (unused)
-460. Green tornado (unused)
-461. Blue tornado (unused)
-462. Kaupe Dodge Effect
-463. Kaupe Dodge Effect
-464. White tornado (unused)
-465. Purple tornado (unused)
-466. Another Round Kick
-467. Warm/Mild Wind (Earth)
-468. Warm/Mild Wind (Wind)
-469. Warm/Mild Wind (Water)
-470. Warm/Mild Wind (Fire)
-471. Warm/Mild Wind (Undead)
-472. Warm/Mild Wind (Shadow)
-473. Warm/Mild Wind (Holy)
-474. (Nothing)
-475. Demon of The Sun Moon And Stars (Level 1)
-476. Demon of The Sun Moon And Stars (Level 2)
-477. Demon of The Sun Moon And Stars (Level 3)
-478. Demon of The Sun Moon And Stars (Level 4)
-479. Demon of The Sun Moon And Stars (Level 5)
-480. Demon of The Sun Moon And Stars (Level 6)
-481. Demon of The Sun Moon And Stars (Level 7)
-482. Demon of The Sun Moon And Stars (Level 8)
-483. Demon of The Sun Moon And Stars (Level 9)
-484. Demon of The Sun Moon And Stars (Level 10)
-485. Mental Strength Lightning but White
-486. Mental Strength Lightning
-487. Demon of The Sun Moon And Stars Ground Effect
-488. Comfort Skills
-489. (Nothing)
-490. (Nothing)
-491. Element Potions
-492. Cooking Foods
-493. Enchant Deadly Poison
-494. Throwing Tomahawk
-495. Full Strip Sound
-496. Preserve
-497. Twilight Alchemy 1
-498. Twilight Alchemy 2
-499. Twilight Alchemy 3
-500. Player Become Blue with Blue Aura
-501. Chase Walk Animation
-502. Player Become Yellow with Yellow Aura
-503. Soul Link Word
-504. (Nothing)
-505. Memorize
-506. (Nothing)
-507. Authoritative Badge
-508. Fire Cracker
-509. Valentine Day Hearth (Wings)
-510. Champion Asura Strike
-511. (Nothing)
-512. Chain Crush Combo
-513. Area Cast
-514. Really Big Circle
-515. Einbroch Fog
-516. Airship Cloud
-517. (Nothing)
-518. Cart Termination
-519. Speed Down Potion
-520. Shield Bumerang
-521. Player Become Red with Red Aura
-522. Gravitation Field
-523. Tarot Card of Fate (The Fool)
-524. Tarot Card of Fate (The Magician)
-525. Tarot Card of Fate (The High Priestess)
-526. Tarot Card of Fate (The Chariot)
-527. Tarot Card of Fate (Strength)
-528. Tarot Card of Fate (The Lovers)
-529. Tarot Card of Fate (The Wheel of Fortune)
-530. Tarot Card of Fate (The Hanged Man)
-531. Tarot Card of Fate (Death)
-532. Tarot Card of Fate (Temperance)
-533. Tarot Card of Fate (The Devil)
-534. Tarot Card of Fate (The Tower)
-535. Tarot Card of Fate (The Star)
-536. Tarot Card of Fate (The Sun)
-537. Acid Demonstration
-538. Player Become Green with Green Aura
-539. Throw Random Bottle
-540. Instant Small->Normal
-541. (Nothing)
-542. KA-Spell (1st Part)
-543. Kahii
-544. Warmth Red Sprite
-545. Sound And... PUFF Client Crash :P
-546. Kaupe
-547. Estin
-548. Instant Red Sprite
-549. Instant Blue Sprite
-550. Another Effect like Running Hit
-551. Effect Like Estun but with Circle
-552. (Nothing)
-553. Esma
-554. Large White Cloud
-555. Estun
-556. (Nothing)
-557. Juperos Energy Waterfall (Horizontal)
-558. Juperos Energy Waterfall (Vertical)
-559. Juperos Energy Waterfall Fast (Horizontal)
-560. Juperos Energy Waterfall Fast (Vertical)
-561. Juperos Warp
-562. Juperos Warp
-563. Earthquake Effect (Juperos Elevator)
-564. Wedding Cast
-565. Filir Moonlight Lvl 1
-566. Filir Moonlight Lvl 2
-567. Filir Moonlight Lvl 3
-568. Another Job Level Up
-569. Amistr Bulwark
-570. Amistr Castling
-571. Amistr Bloodlust
-572. Warmth Soul
-573. Twilight Alchemy 1
-574. Twilight Alchemy 2
-575. Twilight Alchemy 3
-576. Box Effect (Thunder)
-577. Box Effect (Cloud)
-578. Box Effect (Curse)
-579. Box Effect (Sleep)
-580. Box Effect (Rain)
-581. Box Effect (Sunlight)
-582. Another Super Novice/Taekwon Angel
-583. Warmth Hit
-584. Full Buster
-585. 5 Medium Size Explosion
-586. Somatology Lab Mobs Aura
-587. Big Purple Flame
-588. Little Red Flame
-589. Eswoo
-590. Running Stop
-591. (Nothing)
-592. Thanatos Tower Bloody Clouds
-593. Food Effect (STR)
-594. Food Effect (INT)
-595. Food Effect (VIT)
-596. Food Effect (AGI)
-597. Food Effect (DEX)
-598. Food Effect (LUK)
-599. Cast Time Sound and Flashing Animation on Player
-600. Throw Venom Knife
-601. Sight Blaster
-602. Close Confine (Grab Effect)
-603. Spinning fire ball (like 50, but smaller)
-604. Close Confine (Ground Effect)
-605. (Nothing)
-606. Pang Voice (Visual Effect)
-607. Wink of Charm (Visual Effect)
-608. Cooking Success
-609. Cooking Failed
-610. Success
-611. Failed
-612. Korean Words and /no1 Emoticon
-613. Throw Shuriken
-614. Throw Kunai
-615. Throw Fumma Shuriken
-616. Throw Money
-617. Illusionary Shadow
-618. Crimson Fire Bolossom
-619. Lightning Spear Of Ice
-620. Water Escape Technique
-621. Wind Blade
-622. Lightning Crash
-623. Piercing Shot
-624. Kamaitachi
-625. Madness Canceller
-626. Adjustment
-627. Disarm (Sound Effect)
-628. Dust
-629. (Nothing)
-630. Shadow Slash
-631. Reverse Tatami Map Unit
-632. Mist Slash
-633. Final Strike
-634. Crimson Fire Formation
-635. Dragon Fire Formation
-636. Falling Ice Pillar
-637. Desperado
-638. Ground Drift Grenade
-639. Ground Drift Grenade
-640. Ground Drift Grenade
-641. Ground Drift Grenade
-642. Ground Drift Grenade
-643. Rapid Shower
-644. Magic Bullet
-645. Spread Attack
-646. Tracking (Shown While Casting)
-647. Tracking
-648. Triple Action
-649. Bull's Eye
-650. Ice Cave Level 4 Circle
-651. Ice Cave Level 4 Big Circle
-652. Like Regeneration Number but Red with a Sound
-653. Like Regeneration Number but Red
-654. Like Regeneration Number but Purple
-655. Mobs Skill (Change Undead Element)
-656. Last animation before Change Undead Element finish
-657. (Nothing)
-658. (Nothing)
-659. (Nothing)
-660. (Nothing)
-661. (Nothing)
-662. (Nothing)
-663. (Nothing)
-664. (Nothing)
-665. Little Blue Ball Falling From the Sky
-666. Earthquake
-667. (Nothing)
-668. Dragonfear
-669. Wide Bleeding
-670. Dragon fear (Visual Effect)
-671. The Japan Earth Symbol (like 'Seven Wind Lv1', but on the ground)
-672. The Japan Wind Symbol (like 'Seven Wind Lv2', but on the ground)
-673. Map turns Blue (like Soul Link)
-674. Evil Land Cell
-675. Like Parrying/Kyrie Eleison barrier but Yellow with small Cross in every barrier piece
-676. Slow Casting
-677. Critical Wounds/Bleeding Attack
-678. White 99 Aura Bubbles
-679. Green Aura (Middle)
-680. Green Aura (Bottom)
-681. Dimensional Gorge Map Effect
-682. I Love You Banner
-683. Happy White Day Banner
-684. Happy Valentine Day Banner
-685. Happy Birthday Banner
-686. Merry Christmas Banner
-687. Cast Circle-Like effect 1
-688. Cast Circle-Like effect 2
-689. Endless Tower Map Effect
-690. Burning Flame (Red)
-691. Burning Flame (Green)
-692. Unknown Aura Bubbles (Small ghosts)
-693. Translucent yellow circle
-694. Translucent green circle
-695. Rotating green light
-696. The same of 690 and 691 but Blue/Purple
-697. (Nothing)
-698. (Nothing)
-699. Fall of powder from the sky and raise of some leaf
-700. Big Colored Green Sphere.
-701. Huge Blue Sphere
-702. Little Colored Violet Sphere
-703. Light Infiltration with fall of pownder
-704. Client Error (mobile_ef02.str)
-705. Client Error (mobile_ef01.str)
-706. Client Error (mobile_ef03.str)
-707. Client Crash :P
-708. Storm Gust (same as 89)
-709. A Firework that split in 4 mini fireworks
-710. A Sphere like Effect 701 but Green, and a bit more larger
-711. A big violet wall
-712. A Little Flame Sphere
-713. A lot of Very Small and Yellow Sphere
-714. (Nothing)
-715. Little blue Basilica
-716. Same as 715
-717. Christmas Carol (copy of Angelus)
-718. Judex (Visual Effect)
-719. Renovatio (light beam)
-720. Yellow version of Soul Breaker
-721. Adoramus (lightning bolt)
-722. Ignition Break (big explosion)
-723. Hundred Spear (sound effect)
-724. Green version of Detecting
-725. Oratorio (like Detecting)
-726. Frost Misty (blue vapor and bubbles)
-727. Crimson Rock
-728. Small fire (part of Hell Inferno)
-729. Marsh of Abyss (like Close Confine)
-730. Small, cartoony explosion (part of Soul Expansion)
-731. Dragon Howling (blinking, expanding circle)
-732. Spike from the ground
-733. Fluffy Ball flying by
-734. Chain Lightning
-735. (Nothing)
-736. (Nothing)
-737. (Nothing)
-738. (Nothing)
-739. Old Magenta Trap
-740. Old Cobald Trap
-741. Old Maize Trap
-742. Old Verdure Trap
-743. White Ranger Trap
-744. Camouflage
-745. Aimed Bolt (crosshairs)
-746. Arrow Storm
-747. Falling white feathers
-748. Falling blue feathers
-749. Millennium Shield
-750. Detonator (blue sparkles)
-751. Releasing summoned warlock spheres
-752. Like Energy Coat, but not as dark
-753. Clearance
-754. Green warp portal (root of Epiclesis)
-755. Oratio (spinning blue symbol)
-756. Enchant Blade (like Berserk Potion)
-757. Third Class Aura (Middle)
-758. Rolling Cutter - Spin Count 1
-759. Rolling Cutter - Spin Count 2
-760. Rolling Cutter - Spin Count 3
-761. Rolling Cutter - Spin Count 4
-762. Rolling Cutter - Spin Count 5
-763. Rolling Cutter - Spin Count 6
-764. Rolling Cutter - Spin Count 7
-765. Rolling Cutter - Spin Count 8
-766. Rolling Cutter - Spin Count 9
-767. Rolling Cutter - Spin Count 10
-768. Blinking
-769. Cross Ripper Slasher (flying knives)
-770. Strip sound
-771. Poison sound
-772. Poison particles
-773. Expanding purple aura (part of Phantom Menace)
-774. Axe Boomerang
-775. Spinning character sprite
-776. Like Desperado sound effect
-777. Faded light from the ground [S]
-778. Expanding white aura (like Clearance)
-779. Faded light from the ground [S]
-780. Expanding red aura (from Infrared Scan)
-781. Magnetic Field (purple chains)
-782. All-around shield [S]
-783. Yellow shaft of light
-784. White shaft of light
-785. Upward flying wrenches
-786. Symbol with bleeping sound [S]
-787. Flare Launcher (line of fire)
-788. Venom Impress (green skull)
-789. Freezing Status Effect (two ancillas)
-790. Burning Status Effect (flame symbol)
-791. Two ice shots
-792. Upward streaming white particles
-793. Same, but more brief
-794. Infrared Scan (red lasers)
-795. Power Swing (axe crash)
-796. Spinning blue triangles
-797. Stapo
-798. Red triangles (like Intimidate)
-799. Stasis (expanding blue mist) [S]
-800. Hell Inferno (red lights)
-801. Jack Frost unit (ice spikes)
-802. White Imprison
-803. Recognized Spell
-804. Tetra Vortex [S]
-805. Tetra Vortex cast animation (blinking colors)
-806. Flying by as fast as a rocket
-807. Kidnapping sound
-808. Like Recognized Spell, but one symbol
-809. Shadowy filter [S]
-810. Damp thud sound [S]
-811. Body Painting
-812. Black expanding aura
-813. Masquerade - Enervation
-814. Masquerade - Groomy
-815. Masquerade - Ignorance
-816. Masquerade - Laziness
-817. Masquerade - Unlucky
-818. Masquerade - Weakness
-819. (Nothing)
-820. Strip Accessory
-821. Waterfall
-822. Dimension Door (spinning blue aura)
-823. in-the-manhole effect
-824. Some filter
-825. Dimension Door (aura + blue light)
-826. Expanding black casting anim.
-827. Chaos Panic (spinning brown aura)
-828. Maelstrom (spinning pink aura)
-829. Bloody Lust (spinning red aura)
-830. Blue aura (Arch Bishop cast animation)
-831. Blue cone [S]
-832. Sonic Wave
-833. (Nothing)
-834. Light shooting away circlish
-835. Fastness yellow-reddish
-836. Fastness yellow-pinkish
-837. Casting [S]
-838. Watery aura
-839. [Client Error]
-840. Red cone
-841. Green cone
-842. Yellow cone
-843. White cone
-844. Purple cone
-845. light-bluish turquoise cone
-846. (Nothing)
-847. Gloomy Day (white/red light rays)
-848. Gloomy Day (white/blue light rays)
-849. (Nothing)
-850. (Nothing)
-851. Green mushy-foggy stuff (dull)
-852. Green mushy-foggy stuff (bright)
-853. Bright green flower area
-854. Blue beam of light with notes
-855. (Nothing)
-856. Reverberation (red eighth notes)
-857. Severe Rainstorm (falling red and blue beams)
-858. Deep Sleep Lullaby (two red beams and music notes)
-859. Holograph of text (blue)
-860. Distorted note (blue)
-861. Green aura (from Circle of Life's Melody)
-862. Randomize Spell (holograph of text)
-863. Dominion Impulse (two spears of light)
-864. Gloomy Day (colorful lines)
-865. Blue aura (from Song of Mana)
-866. Dance with a Warg (Wargs)
-867. Yellow aura (from Dance with a Warg)
-868. Song of Mana (Violies)
-869. Strip sound [S]
-870. Ghostly Succubuses of fire
-871. Red aura (from Lerad's Dew)
-872. Lerad's Dew (Minerals)
-873. Stargate-wormhole stuff (bright purple)
-874. Melody of Sink (Ktullanuxes)
-875. Stargate-wormhole stuff (bright turquoise)
-876. Warcry of Beyond (Garms)
-877. Stargate-wormhole stuff (white)
-878. Unlimited Humming Voice (Miyabi Ningyos)
-879. Siren's Voice (heart-like)
-880. Bluish castish cone
-881. Blue aura
-882. Whirl of fireflies (red)
-883. Epiclesis (transparent green tree)
-884. Green beam
-885. Blue light beams
-886. Blue castish cone
-887. Wavy sparks
-888. Earth Shaker (same as 432)
-889. Fast light beams
-890. Rotation
-891. Magic shots [S]
-892. Fastness with hitting sound[S]
-893. Blue-white light passing by
-894. (Nothing)
-895. Big wheel of flat light beams
-896. Still sun shaped lightning aura
-897. Animated sun shaped lightning aura
-898. Animated, curvy sun shaped lightning aura
-899. White/red light shots from below
-900. Animated, slow curvy sun shaped lightning aura
-901. Explosion
-902. Floating bedtable texture
-903. Castish flamey cone
-904. Yellow/pink lights passing by
-905. Expanding circle
-906. Shield Press (falling shield)
-907. Chainy, metalish sound [S]
-908. Prestige (sphere of yellow particles)
-909. Banding (sphere of red particles)
-910. Inspiration (sphere of blue particles)
-911. Green castish animation [S]
-912. Wall of Thorns unit (green fog cloud)
-913. Magic projectiles
-914. (Nothing)
-915. Crazy Weed
-916. Demonic Fire
-917. More angry, demonic flames
-918. Fire Insignia (demonic flames)
-919. Hell's Plant (green snapping plant)
-920. Fire Walk unit
-921. Vacuum Extreme (whirlwind)
-922. Psychic Wave
-923. Poison Buster
-924. Poisoning animation
-925. Some filter
-926. Electric Walk unit
-927. Earth Grave (speary roots)
-928. Ice cloud projectiles
-929. Warmer (field of flames)
-930. Varetyr Spear (falling spear)
-931. (Nothing)
-932. Firefly
-933. [Client Crash]
-934. White, castishly expanding cone
-935. Green magic projectile
-936. Red, castishly expanding cone
-937. Yellow, castishly expanding cone
-938. Dark-red, castishly expanding cone
-939. Blue, conish aura
-940. Snow flake
-941. Explosion of red, demonic fire
-942. Expanding, white dome
-943. Green, fluffy projectile
-944. Falling gems
-945. (Nothing)
-946. Floating lights
-947. Blue lightning sphere
-948. Two blue lightning spheres
-949. Flat, spinning diamond
-950. Circling, planetlike spheres
-951. Three lightning spheres
-952. Flat, spinning gem and two lightning spheres
-953. Spinning, planetlike spheres
-954. Two lightblue glowing spheres
-955. Three spinning flame spheres
-956. Flame
-957. Spinning planetlike sphere
-958. Two flames
-959. Purple flame
-960. Small yellow explosion
-961. Cartoony whirlwind
-962. Rising fire
-963. Dark filter (like Stone Curse)
-964. Same as 920
-965. Small white explosion
-966. Bone crack
-967. Another little explosion
diff --git a/doc/global_configuration.md b/doc/global_configuration.md
new file mode 100644
index 000000000..b0e99e698
--- /dev/null
+++ b/doc/global_configuration.md
@@ -0,0 +1,65 @@
+# Global configuration reference
+
+## What is global configuration?
+
+Global configuration is an import system that allows configuration files to be
+shared between servers (login, char, map), but can also be used independently
+in each server.
+
+
+## How does it work?
+
+It works by using the `@include` directive from libconfig:
+
+> "A configuration file may "include" the contents of another file using an
+> include directive. This directive has the effect of inlining the contents of
+> the named file at the point of inclusion.
+
+An include directive must appear on its own line and takes this form:
+
+```
+ @include "filename"
+```
+
+Any backslashes or double quotes in the filename must be escaped as `\\` and
+`\"`, respectively.
+
+
+## How do I stop using global configurations?
+
+To stop using global configuration, all you have to do is copy the contents of
+the file being imported and paste it _exactly_ where the include directive was.
+
+### Example
+
+If you want map server and char server to have their own separate SQL connection
+settings, you would search in `conf/map/map-server.conf` and
+`conf/char/char-server.conf` for this line:
+
+```
+ @include "conf/global/sql_connection.conf"
+```
+
+And replace it with:
+
+```
+ sql_connection: {
+ // [INTER] You can specify the codepage to use in your mySQL tables here.
+ // (Note that this feature requires MySQL 4.1+)
+ //default_codepage: ""
+
+ // [LOGIN] Is `userid` in account_db case sensitive?
+ //case_sensitive: false
+
+ // For IPs, ideally under linux, you want to use localhost instead of 127.0.0.1.
+ // Under windows, you want to use 127.0.0.1. If you see a message like
+ // "Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)"
+ // and you have localhost, switch it to 127.0.0.1
+ db_hostname: "127.0.0.1"
+ db_port: 3306
+ db_username: "ragnarok"
+ db_password: "ragnarok"
+ db_database: "ragnarok"
+ //codepage:""
+ }
+```
diff --git a/doc/global_configuration.txt b/doc/global_configuration.txt
deleted file mode 100644
index a000a4572..000000000
--- a/doc/global_configuration.txt
+++ /dev/null
@@ -1,69 +0,0 @@
-//===== Hercules Documentation ===============================
-//= Global configuration reference
-//===== By: ==================================================
-//= Panikon (Hercules Dev. Team)
-//===== Current Version: =====================================
-//= 20140616
-//===== Description: =========================================
-//= Global configurations found in conf/global/
-//============================================================
-
-- What are global configurations?
-
-Global configurations are configurations that can be shared between servers,
-but can also be set independently in each server.
-
-- How do they work?
-
-They work by using an include system that is available with libconfig:
-
- "A configuration file may "include" the contents of another file using an
- include directive. This directive has the effect of inlining the contents of
- the named file at the point of inclusion.
-
- An include directive must appear on its own line in the input. It has the
- form:
-
- @include "filename"
-
- Any backslashes or double quotes in the filename must be escaped as '\\' and
- '\"', respectively."
- From libconfig's documentation
-
-So each file that is included is actually inside each one of the main
-configuration files and thus a change in the first will be a change in the
-latter.
-Note: the @include directive is read by the server executable, so any path
-should be from were it is and NOT from where the main configuration file is!
-
-- How do I stop using global configurations?
-
-To stop using global configurations is very simple, all you have to do is copy
-the contents that are inside the global configuration file and put them
-_exactly_ where the include directive were in the main configuration file.
-
-E.g.
- Find in any file:
- @include "conf/global/sql_connection.conf"
- Replace it with:
- sql_connection: {
- // [INTER] You can specify the codepage to use in your mySQL tables here.
- // (Note that this feature requires MySQL 4.1+)
- //default_codepage: ""
-
- // [LOGIN] Is `userid` in account_db case sensitive?
- //case_sensitive: false
-
- // For IPs, ideally under linux, you want to use localhost instead of 127.0.0.1
- // Under windows, you want to use 127.0.0.1. If you see a message like
- // "Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)"
- // and you have localhost, switch it to 127.0.0.1
- db_hostname: "127.0.0.1"
- db_port: 3306
- db_username: "ragnarok"
- db_password: "ragnarok"
- db_database: "ragnarok"
- //codepage:""
- }
- If the main configuration file belongs to the map server, for instance, you
- don't need to include default_codepage and case_sensitive.
diff --git a/doc/permissions.md b/doc/permissions.md
new file mode 100644
index 000000000..7d29b59fd
--- /dev/null
+++ b/doc/permissions.md
@@ -0,0 +1,51 @@
+# Group Permission List
+A list of player group permission, configured in `conf/groups.conf`.
+
+## Copyright
+> This file is part of Hercules.
+> http://herc.ws - http://github.com/HerculesWS/Hercules
+>
+> Copyright (C) 2012-2018 Hercules Dev Team
+> Copyright (C) Athena Dev Teams
+>
+> 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 <http://www.gnu.org/licenses/>.
+
+## Description
+The Hercules emulator has a permission system that enables certain groups of players to perform certain actions, or have access to certain visual enhancements or in-game activity.
+
+Permission | Description
+:------------------------ | :---------------------------------------------
+can_trade | Ability to trade or otherwise distribute items (drop, storage, vending etc).
+can_party | Ability to join parties.
+all_skill | Ability to use all skills.
+all_equipment | Ability to equip anything (can cause client errors).
+skill_unconditional | Ability to use skills without meeting the required conditions (SP, items, etc).
+join_chat | Ability to join a password protected chatrooms.
+kick_chat | Protection from being kicked from a chat.
+hide_session | Hides player session from being displayed by `@commands`.
+who_display_aid | Ability to see GMs and Account/Char IDs in the `@who` command.
+hack_info | Ability to receive all informations about any player that try to hack, spoof a name, etc.
+any_warp | Ability to bypass nowarp, nowarpto, noteleport and nomemo mapflags. This option is mainly used in commands which modify a character's map/coordinates (like `@memo`, `@mapmove`, `@go`, `@jump`, etc).
+view_hpmeter | Ability to see HP bar of every player.
+view_equipment | Ability to view players equipment regardless of their setting.
+use_check | Ability to use client command `/check` (display character status).
+use_changemaptype | Ability to use client command `/changemaptype`.
+all_commands | Ability to use all atcommands and charcommands.
+receive_requests | Ability to receive `@requests`.
+show_bossmobs | Ability to see boss mobs with `@showmobs`.
+disable_pvm | Ability to disable Player vs. Monster (PvM).
+disable_pvp | Ability to disable Player vs. Player (PvP).
+disable_commands_when_dead | Ability to disable atcommands usage when dead.
+can_trade_bound | Ability to trade or otherwise distribute bound items (drop, storage, vending etc).
+hchsys_admin | Hercules Chat System Admin (Ability to modify channel settings regardless of ownership and join password-protected channels without requiring a password.)
+disable_pickup | Ability to disable the player from picking up any item from ground, they can still receive items picked up by others means like party share píck.
+disable_exp | Ability to disable the player from gaining any experience point.
+disable_store | Ability to disable the player from using/openning npc and player stores.
+disable_skill_usage | Ability to disable the player from using any skill.
+
diff --git a/doc/permissions.txt b/doc/permissions.txt
deleted file mode 100644
index bc84f86b6..000000000
--- a/doc/permissions.txt
+++ /dev/null
@@ -1,39 +0,0 @@
-//===== Hercules Documentation ===============================
-//= Permission List
-//===== By: ==================================================
-//= Hercules Dev Team
-//===== Current Version: =====================================
-//= 20131031
-//===== Description: =========================================
-//= Player group permissions, configured in conf/groups.conf.
-//============================================================
-
-can_trade : Ability to trade or otherwise distribute items (drop, storage, vending etc...).
-can_party : Ability to join parties.
-all_skill : Ability to use all skills.
-all_equipment : Ability to equip anything (can cause client errors).
-skill_unconditional : Ability to use skills without meeting the required conditions (SP, items, etc...).
-join_chat : Ability to join a password protected chatrooms.
-kick_chat : Protection from being kicked from a chat.
-hide_session : Hides player session from being displayed by @commands.
-who_display_aid : Ability to see GMs and Account/Char IDs in the @who command.
-hack_info : Ability to receive all informations about any player that try to hack, spoof a name, etc.
-any_warp : Ability to bypass nowarp, nowarpto, noteleport and nomemo mapflags.
- This option is mainly used in commands which modify a character's
- map/coordinates (like @memo, @mapmove, @go, @jump, etc...).
-view_hpmeter : Ability to see HP bar of every player.
-view_equipment : Ability to view players equipment regardless of their setting.
-use_check : Ability to use client command /check (display character status).
-use_changemaptype : Ability to use client command /changemaptype.
-all_commands : Ability to use all atcommands and charcommands.
-receive_requests : Ability to receive @requests.
-show_bossmobs : Ability to see boss mobs with @showmobs.
-disable_pvm : Ability to disable Player vs. Monster.
-disable_pvp : Ability to disable Player vs. Player.
-disable_commands_when_dead : Ability to disable @command usage when dead.
-can_trade_bound: Ability to trade or otherwise distribute bound items (drop, storage, vending etc...).
-hchsys_admin : Hercules Chat System Admin (Ability to modify channel settings regardless of ownership and join password-protected channels without requiring a password.)
-disable_pickup: Ability to disable the player from picking up any item from ground, they can still receive items picked up by others means like party share píck.
-disable_exp: Ability to disable the player from gaining any experience point.
-disable_store: Ability to disable the player from using/openning npc and player stores.
-disable_skill_usage: Ability to disable the player from using any skill.
diff --git a/doc/sample/getiteminfo.txt b/doc/sample/getiteminfo.txt
index 57407c072..9d5121635 100644
--- a/doc/sample/getiteminfo.txt
+++ b/doc/sample/getiteminfo.txt
@@ -9,12 +9,12 @@
//============================================================
prontera,156,179,6 script test_getiteminfo 4_F_KAFRA1,{
- mes "Please enter an item ID.";
- input .@value;
+ mes("Please enter an item ID.");
+ input(.@value);
// This line uses an INTERNAL function of your client to show item name by its ID!
// ^nItemID^XXXX -> Item Name
- mes "Item ID: "+.@value+" ^nItemID^"+.@value;
+ mesf("Item ID: %d ^nItemID^%d", .@value, .@value);
mes("Current item info:");
mesf("Buy Price: %d", getiteminfo(.@value, ITEMINFO_BUYPRICE));
@@ -34,5 +34,8 @@ prontera,156,179,6 script test_getiteminfo 4_F_KAFRA1,{
mesf("View ID: %d", getiteminfo(.@value, ITEMINFO_VIEWID));
mesf("MATK: %d", getiteminfo(.@value, ITEMINFO_MATK));
mesf("View Sprite: %d", getiteminfo(.@value, ITEMINFO_VIEWSPRITE));
+
+ .@trade$ = callfunc("F_GetTradeRestriction", .@value);
+ mesf("Trade Restriction: %s", .@trade$);
close;
}
diff --git a/doc/script_commands.txt b/doc/script_commands.txt
index 343eb02cb..4812a2cf2 100644
--- a/doc/script_commands.txt
+++ b/doc/script_commands.txt
@@ -3239,6 +3239,7 @@ Valid types are:
ITEMINFO_VIEWID - View ID ("Sprite" field in the Item DB)
ITEMINFO_MATK - MATK (only relevant if RENEWAL is set)
ITEMINFO_VIEWSPRITE - View Sprite ("ViewSprite" field in the Item DB)
+ ITEMINFO_TRADE - Trade Restriction (see "doc/constant.md": item trade restriction)
Check sample in doc/sample/getiteminfo.txt
@@ -5992,6 +5993,17 @@ Example usage:
---------------------------------------
+*removespecialeffect(<effect number>{, <send_target>{, <unit id>{, <account id>}}})
+*removespecialeffect(<effect number>{, <send_target>{, "<NPC Name>"{, <account id>}}})
+
+Works for:
+ main client from version 2018-10-02
+ re client from version 2018-10-02
+This command will remove special effect. All parameters same with specialeffect.
+Examples and detailed explanation about parameters see in specialeffect.
+
+---------------------------------------
+
*specialeffect2(<effect number>{, <send_target>{, "<Player Name>"}})
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@ -8114,7 +8126,7 @@ built-in atcommands and custom atcommands.
*has_permission("<permission>"{, <account id>})
Check if the attached or specified player has the specified permission
-and returns true or false accordingly. See doc/permissions.txt for
+and returns true or false accordingly. See doc/permissions.md for
details about permissions.
Valid <permission> are:
@@ -9418,6 +9430,7 @@ supported types: values
QINFO_HOMUN_LEVEL: min
QINFO_HOMUN_TYPE: homunculus_type (0 - regular, 1 - evolved, 2 - S)
QINFO_QUEST: quest_id, state // append to the quests list on each use
+ QINFO_MERCENARY_CLASS: mercenary_class
---------------------------------------
@@ -10172,3 +10185,41 @@ Show in client message by <message_id> from msg string table.
Optional <color> can be used for set color for whole message.
---------------------------------------
+
+*camerainfo()
+
+Show or hide camera info window.
+Works for 20160525 clients or newer.
+
+---------------------------------------
+
+*changecamera(<range>, <rotation>, <latitude>{, <target>})
+
+Change camera range, rotation, latitude.
+The optional target parameter specifies who will get changed
+camera.
+Works for 20160525 clients or newer.
+
+---------------------------------------
+
+*achievement_progress(<ach_id>, <obj_idx>, <progress>, <incremental>{, <account_id>});
+
+Make the player progress in the specified achievement.
+aid - achievement ID
+obj_idx - achievement objective index.
+progress - objective progress towards goal.
+incremental - (boolean) true to add the progress towards the goal,
+ false to use the progress only as a comparand.
+account_id - (optional) AID to perform on (default to attached player).
+
+returns progress on success and false on failure
+
+---------------------------------------
+
+*itempreview(<index>)
+
+Update already opened preview window with item from
+ inventory with given index.
+Works for 20181017 RE and main clients or newer.
+
+---------------------------------------
diff --git a/npc/dev/test.txt b/npc/dev/test.txt
index bdbc52ed4..c2f07ab2f 100644
--- a/npc/dev/test.txt
+++ b/npc/dev/test.txt
@@ -651,6 +651,12 @@ function script HerculesSelfTestHelper {
setd(".@x", getd(".@y"));
callsub(OnCheck, "setd getd", .@x, .@y);
+ // getd types
+ callsub(OnCheck, "Getdatatype (getd: param)", getdatatype(getd("Hp")), DATATYPE_INT | DATATYPE_PARAM);
+ callsub(OnCheck, "Getdatatype (getd: const)", getdatatype(getd("DATATYPE_CONST")), DATATYPE_INT | DATATYPE_CONST);
+ callsub(OnCheck, "Getdatatype (getd: numeric var)", getdatatype(getd(".@foo")), DATATYPE_INT | DATATYPE_VAR);
+ callsub(OnCheck, "Getdatatype (getd: string var)", getdatatype(getd(".@foo$")), DATATYPE_STR | DATATYPE_VAR);
+
// getvariableofnpc
.x = 2;
set getvariableofnpc(.x, "TestVarOfAnotherNPC"), 1;
diff --git a/npc/other/Global_Functions.txt b/npc/other/Global_Functions.txt
index 9882e9d71..904ed7165 100644
--- a/npc/other/Global_Functions.txt
+++ b/npc/other/Global_Functions.txt
@@ -438,3 +438,40 @@ function script F_ShuffleNumbers {
function script F_MesColor {
return sprintf("^%06X", min(getarg(0), 0xFFFFFF));
}
+
+//== Function F_GetTradeRestriction ========================
+// Function to get item trade restriction
+// Examples:
+// mes "Red Potion Restriction: "+ callfunc("F_GetTradeRestriction", Red_Potion);
+function script F_GetTradeRestriction {
+ .@trade = getiteminfo(getarg(0), ITEMINFO_TRADE);
+
+ if (.@trade == 0) {
+ return "None";
+ }
+ .@trade$ = "";
+ if (.@trade & ITR_NODROP) {
+ .@trade$ += "NoDrop|";
+ }
+ if (.@trade & ITR_NOTRADE) {
+ .@trade$ += "NoTrade|";
+ }
+ if (.@trade & ITR_PARTNEROVERRIDE) {
+ .@trade$ += "PartnerOverride|";
+ }
+ if (.@trade & ITR_NOSELLTONPC) {
+ .@trade$ += "NoSellToNpc|";
+ }
+ if (.@trade & ITR_NOSTORAGE) {
+ .@trade$ += "NoStorage|";
+ }
+ if (.@trade & ITR_NOGSTORAGE) {
+ .@trade$ += "NoGuildStorage|";
+ }
+ if (.@trade & ITR_NOMAIL) {
+ .@trade$ += "NoMail|";
+ }
+ if (.@trade & ITR_NOAUCTION) {
+ .@trade$ += "NoAuction|";
+ }
+}
diff --git a/src/common/HPMDataCheck.h b/src/common/HPMDataCheck.h
index f5875fe11..21b90ee50 100644
--- a/src/common/HPMDataCheck.h
+++ b/src/common/HPMDataCheck.h
@@ -660,6 +660,7 @@ 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_ITEM_TO_STORE", sizeof(struct PACKET_ZC_ADD_ITEM_TO_STORE), SERVER_TYPE_MAP },
{ "PACKET_ZC_ADD_MEMBER_TO_GROUP", sizeof(struct PACKET_ZC_ADD_MEMBER_TO_GROUP), SERVER_TYPE_MAP },
+ { "PACKET_ZC_CAMERA_INFO", sizeof(struct PACKET_ZC_CAMERA_INFO), SERVER_TYPE_MAP },
{ "PACKET_ZC_CASH_ITEM_DELETE", sizeof(struct PACKET_ZC_CASH_ITEM_DELETE), SERVER_TYPE_MAP },
{ "PACKET_ZC_CASH_TIME_COUNTER", sizeof(struct PACKET_ZC_CASH_TIME_COUNTER), SERVER_TYPE_MAP },
{ "PACKET_ZC_CHECKNAME", sizeof(struct PACKET_ZC_CHECKNAME), SERVER_TYPE_MAP },
@@ -707,6 +708,7 @@ HPExport const struct s_HPMDataCheck HPMDataCheck[] = {
{ "PACKET_ZC_PRIVATE_AIRSHIP_RESPONSE", sizeof(struct PACKET_ZC_PRIVATE_AIRSHIP_RESPONSE), SERVER_TYPE_MAP },
{ "PACKET_ZC_PROPERTY_HOMUN", sizeof(struct PACKET_ZC_PROPERTY_HOMUN), SERVER_TYPE_MAP },
{ "PACKET_ZC_READ_MAIL", sizeof(struct PACKET_ZC_READ_MAIL), SERVER_TYPE_MAP },
+ { "PACKET_ZC_REMOVE_EFFECT", sizeof(struct PACKET_ZC_REMOVE_EFFECT), SERVER_TYPE_MAP },
{ "PACKET_ZC_REPAIRITEMLIST", sizeof(struct PACKET_ZC_REPAIRITEMLIST), SERVER_TYPE_MAP },
{ "PACKET_ZC_REPAIRITEMLIST_sub", sizeof(struct PACKET_ZC_REPAIRITEMLIST_sub), SERVER_TYPE_MAP },
{ "PACKET_ZC_SEARCH_STORE_INFO_ACK", sizeof(struct PACKET_ZC_SEARCH_STORE_INFO_ACK), SERVER_TYPE_MAP },
diff --git a/src/common/mmo.h b/src/common/mmo.h
index d6946cecc..9bcf82cc7 100644
--- a/src/common/mmo.h
+++ b/src/common/mmo.h
@@ -1331,7 +1331,8 @@ enum questinfo_type {
QINFO_ITEM,
QINFO_HOMUN_LEVEL,
QINFO_HOMUN_TYPE,
- QINFO_QUEST
+ QINFO_QUEST,
+ QINFO_MERCENARY_CLASS
};
/* packet size constant for itemlist */
diff --git a/src/map/achievement.c b/src/map/achievement.c
index 1fb513ea0..7148acae8 100644
--- a/src/map/achievement.c
+++ b/src/map/achievement.c
@@ -772,6 +772,10 @@ static void achievement_validate_refine(struct map_session_data *sd, unsigned in
criteria.goal = sd->status.inventory[idx].refine;
+ // achievement should not trigger if refine is 0
+ if (criteria.goal == 0)
+ return;
+
/* Universal */
achievement->validate_type(sd,
success ? ACH_EQUIP_REFINE_SUCCESS : ACH_EQUIP_REFINE_FAILURE,
@@ -1016,44 +1020,56 @@ static bool achievement_check_title(struct map_session_data *sd, int title_id) {
return false;
}
-/**
- * Achievement rewards are given to player
- * @param sd session data
- * @param ad achievement data
- */
-static void achievement_get_rewards(struct map_session_data *sd, const struct achievement_data *ad) {
- int i = 0;
- struct achievement *ach = NULL;
-
+static void achievement_get_rewards_buffs(struct map_session_data *sd, const struct achievement_data *ad)
+{
nullpo_retv(sd);
nullpo_retv(ad);
- if ((ach = achievement->ensure(sd, ad)) == NULL)
- return;
-
- /* Buff */
if (ad->rewards.bonus != NULL)
script->run(ad->rewards.bonus, 0, sd->bl.id, 0);
+}
- /* Give Items */
- for (i = 0; i < VECTOR_LENGTH(ad->rewards.item); i++) {
- struct item it = { 0 };
- int total = 0;
+// TODO: kro send items by rodex
+static void achievement_get_rewards_items(struct map_session_data *sd, const struct achievement_data *ad)
+{
+ nullpo_retv(sd);
+ nullpo_retv(ad);
- it.nameid = VECTOR_INDEX(ad->rewards.item, i).id;
- total = VECTOR_INDEX(ad->rewards.item, i).amount;
+ struct item it = { 0 };
+ it.identify = 1;
- it.identify = 1;
+ for (int i = 0; i < VECTOR_LENGTH(ad->rewards.item); i++) {
+ it.nameid = VECTOR_INDEX(ad->rewards.item, i).id;
+ int total = VECTOR_INDEX(ad->rewards.item, i).amount;
//Check if it's stackable.
if (!itemdb->isstackable(it.nameid)) {
- int j = 0;
- for (j = 0; j < total; ++j)
- pc->additem(sd, &it, (it.amount = 1), LOG_TYPE_SCRIPT);
+ it.amount = 1;
+ for (int j = 0; j < total; ++j)
+ pc->additem(sd, &it, 1, LOG_TYPE_SCRIPT);
} else {
- pc->additem(sd, &it, (it.amount = total), LOG_TYPE_SCRIPT);
+ it.amount = total;
+ pc->additem(sd, &it, total, LOG_TYPE_SCRIPT);
}
}
+}
+
+/**
+ * Achievement rewards are given to player
+ * @param sd session data
+ * @param ad achievement data
+ */
+static bool achievement_get_rewards(struct map_session_data *sd, const struct achievement_data *ad)
+{
+ nullpo_retr(false, sd);
+ nullpo_retr(false, ad);
+
+ struct achievement *ach = achievement->ensure(sd, ad);
+ if (ach == NULL)
+ return false;
+
+ /* Buff */
+ achievement->get_rewards_buffs(sd, ad);
ach->rewarded_at = time(NULL);
@@ -1062,9 +1078,14 @@ static void achievement_get_rewards(struct map_session_data *sd, const struct ac
VECTOR_PUSH(sd->title_ids, ad->rewards.title_id);
clif->achievement_send_list(sd->fd, sd);
} else {
- clif->achievement_reward_ack(sd->fd, sd, ad);
clif->achievement_send_update(sd->fd, sd, ad); // send update.
+ clif->achievement_reward_ack(sd->fd, sd, ad);
}
+
+ /* Give Items */
+ achievement->get_rewards_items(sd, ad);
+
+ return true;
}
/**
@@ -1977,4 +1998,6 @@ void achievement_defaults(void)
achievement->init_titles = achievement_init_titles;
achievement->check_title = achievement_check_title;
achievement->get_rewards = achievement_get_rewards;
+ achievement->get_rewards_buffs = achievement_get_rewards_buffs;
+ achievement->get_rewards_items = achievement_get_rewards_items;
}
diff --git a/src/map/achievement.h b/src/map/achievement.h
index beba120a2..de5eaa060 100644
--- a/src/map/achievement.h
+++ b/src/map/achievement.h
@@ -277,7 +277,9 @@ struct achievement_interface {
/* */
void (*init_titles) (struct map_session_data *sd);
bool (*check_title) (struct map_session_data *sd, int title_id);
- void (*get_rewards) (struct map_session_data *sd, const struct achievement_data *ad);
+ bool (*get_rewards) (struct map_session_data *sd, const struct achievement_data *ad);
+ void (*get_rewards_buffs) (struct map_session_data *sd, const struct achievement_data *ad);
+ void (*get_rewards_items) (struct map_session_data *sd, const struct achievement_data *ad);
};
#ifdef HERCULES_CORE
diff --git a/src/map/atcommand.c b/src/map/atcommand.c
index 9211169ed..809a740d7 100644
--- a/src/map/atcommand.c
+++ b/src/map/atcommand.c
@@ -9799,6 +9799,24 @@ ACMD(reloadclans)
return true;
}
+// show camera window or change camera parameters
+ACMD(camerainfo)
+{
+ if (*message == '\0') {
+ clif->camera_showWindow(sd);
+ return true;
+ }
+ float range = 0;
+ float rotation = 0;
+ float latitude = 0;
+ if (sscanf(message, "%15f %15f %15f", &range, &rotation, &latitude) < 3) {
+ clif->message(fd, msg_fd(fd, 452)); // usage @camerainfo range rotation latitude
+ return false;
+ }
+ clif->camera_change(sd, range, rotation, latitude, SELF);
+ return true;
+}
+
/**
* Fills the reference of available commands in atcommand DBMap
**/
@@ -10081,6 +10099,7 @@ static void atcommand_basecommands(void)
ACMD_DEF(leaveclan),
ACMD_DEF(reloadclans),
ACMD_DEF(setzone),
+ ACMD_DEF(camerainfo),
};
int i;
diff --git a/src/map/battle.c b/src/map/battle.c
index fceb30be1..44241bf23 100644
--- a/src/map/battle.c
+++ b/src/map/battle.c
@@ -4339,6 +4339,8 @@ static struct Damage battle_calc_misc_attack(struct block_list *src, struct bloc
}
break;
}
+
+ battle->reflect_trap(target, src, &md, skill_id);
return md;
}
@@ -6008,6 +6010,37 @@ static void battle_reflect_damage(struct block_list *target, struct block_list *
#undef NORMALIZE_RDAMAGE
}
+/**
+ * Reflects damage from certain traps, if battle_config.trap_reflect is true.
+ * @param target : Player who triggered the trap
+ * @param src : Player who set the trap
+ * @param md : Trap damage structure
+ * @param skill_id : Trap skill ID
+ */
+static void battle_reflect_trap(struct block_list *target, struct block_list *src, struct Damage *md, uint16 skill_id)
+{
+ if (battle_config.trap_reflect == true) {
+ if (src != target) { // Don't reflect your own damage
+ switch (skill_id) {
+ case HT_CLAYMORETRAP:
+ case HT_LANDMINE:
+ case HT_FREEZINGTRAP:
+ case HT_BLASTMINE:
+ // Needs official info
+ //case RA_CLUSTERBOMB:
+ //case RA_FIRINGTRAP:
+ //case RA_ICEBOUNDTRAP:
+ //case GN_THORNS_TRAP:
+ //case KO_MAKIBISHI:
+ case MA_LANDMINE:
+ case MA_FREEZINGTRAP:
+ battle->reflect_damage(target, src, md, skill_id);
+ break;
+ }
+ }
+ }
+}
+
static void battle_drain(struct map_session_data *sd, struct block_list *tbl, int64 rdamage, int64 ldamage, int race, int boss)
{
struct weapon_data *wd;
@@ -7325,6 +7358,7 @@ static const struct battle_data {
* Hercules
**/
{ "skill_trap_type", &battle_config.skill_trap_type, 0, 0, 1, },
+ { "trap_reflect", &battle_config.trap_reflect, 1, 0, 1, },
{ "item_restricted_consumption_type", &battle_config.item_restricted_consumption_type,1, 0, 1, },
{ "unequip_restricted_equipment", &battle_config.unequip_restricted_equipment, 0, 0, 3, },
{ "max_walk_path", &battle_config.max_walk_path, 17, 1, MAX_WALKPATH, },
@@ -7371,6 +7405,8 @@ static const struct battle_data {
{ "storage_use_item", &battle_config.storage_use_item, 0, 0, 1, },
{ "features/enable_attendance_system", &battle_config.feature_enable_attendance_system,1, 0, 1, },
{ "features/feature_attendance_endtime",&battle_config.feature_attendance_endtime, 1, 0, 99999999, },
+ { "min_item_buy_price", &battle_config.min_item_buy_price, 1, 0, INT_MAX, },
+ { "min_item_sell_price", &battle_config.min_item_sell_price, 0, 0, INT_MAX, },
};
static bool battle_set_value_sub(int index, int value)
@@ -7614,6 +7650,7 @@ void battle_defaults(void)
battle->delay_damage = battle_delay_damage;
battle->drain = battle_drain;
battle->reflect_damage = battle_reflect_damage;
+ battle->reflect_trap = battle_reflect_trap;
battle->attr_ratio = battle_attr_ratio;
battle->attr_fix = battle_attr_fix;
battle->calc_cardfix = battle_calc_cardfix;
diff --git a/src/map/battle.h b/src/map/battle.h
index 9f5207e95..02536e4a1 100644
--- a/src/map/battle.h
+++ b/src/map/battle.h
@@ -506,6 +506,7 @@ struct Battle_Config {
/** Hercules **/
int skill_trap_type;
+ int trap_reflect;
int item_restricted_consumption_type;
int unequip_restricted_equipment;
int max_walk_path;
@@ -570,6 +571,9 @@ struct Battle_Config {
int feature_enable_attendance_system;
int feature_attendance_endtime;
+
+ int min_item_buy_price;
+ int min_item_sell_price;
};
/* criteria for battle_config.idletime_critera */
@@ -636,6 +640,8 @@ struct battle_interface {
void (*drain) (struct map_session_data *sd, struct block_list *tbl, int64 rdamage, int64 ldamage, int race, int boss);
/* damage reflect */
void (*reflect_damage) (struct block_list *target, struct block_list *src, struct Damage *wd,uint16 skill_id);
+ /* trap reflect */
+ void(*reflect_trap) (struct block_list *target, struct block_list *src, struct Damage *md, uint16 skill_id);
/* attribute rate */
int (*attr_ratio) (int atk_elem, int def_type, int def_lv);
/* applies attribute modifiers */
diff --git a/src/map/clif.c b/src/map/clif.c
index 76625f0ba..62b9a4ca9 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -2789,11 +2789,11 @@ static void clif_item_normal(short idx, struct NORMALITEM_INFO *p, struct item *
static void clif_inventoryList(struct map_session_data *sd)
{
-#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919
+#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919 || PACKETVER_MAIN_NUM >= 20181002
clif->inventoryStart(sd, INVTYPE_INVENTORY, "");
#endif
clif->inventoryItems(sd, INVTYPE_INVENTORY);
-#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919
+#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919 || PACKETVER_MAIN_NUM >= 20181002
clif->inventoryEnd(sd, INVTYPE_INVENTORY);
#endif
}
@@ -2816,7 +2816,7 @@ static void clif_inventoryItems(struct map_session_data *sd, enum inventory_type
if (normal) {
itemlist_normal.PacketType = inventorylistnormalType;
itemlist_normal.PacketLength = (sizeof(itemlist_normal) - sizeof(itemlist_normal.list)) + (sizeof(struct NORMALITEM_INFO) * normal);
-#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919
+#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919 || PACKETVER_MAIN_NUM >= 20181002
itemlist_normal.invType = type;
#endif
@@ -2829,7 +2829,7 @@ static void clif_inventoryItems(struct map_session_data *sd, enum inventory_type
if( equip ) {
itemlist_equip.PacketType = inventorylistequipType;
itemlist_equip.PacketLength = (sizeof(itemlist_equip) - sizeof(itemlist_equip.list)) + (sizeof(struct EQUIPITEM_INFO) * equip);
-#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919
+#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919 || PACKETVER_MAIN_NUM >= 20181002
itemlist_equip.invType = type;
#endif
@@ -2849,7 +2849,7 @@ static void clif_inventoryItems(struct map_session_data *sd, enum inventory_type
static void clif_equipList(struct map_session_data *sd)
{
-#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919
+#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919 || PACKETVER_MAIN_NUM >= 20181002
clif->inventoryStart(sd, INVTYPE_INVENTORY, "");
clif->inventoryItems(sd, INVTYPE_INVENTORY);
clif->inventoryEnd(sd, INVTYPE_INVENTORY);
@@ -2876,7 +2876,7 @@ static void clif_equipItems(struct map_session_data *sd, enum inventory_type typ
if (equip) {
itemlist_equip.PacketType = inventorylistequipType;
itemlist_equip.PacketLength = (sizeof(itemlist_equip) - sizeof(itemlist_equip.list)) + (sizeof(struct EQUIPITEM_INFO) * equip);
-#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919
+#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919 || PACKETVER_MAIN_NUM >= 20181002
itemlist_equip.invType = type;
#endif
@@ -2914,7 +2914,7 @@ static void clif_guildStorageList(struct map_session_data *sd, struct item *item
static void clif_inventoryStart(struct map_session_data *sd, enum inventory_type type, const char *name)
{
-#if PACKETVER_RE_NUM >= 20180829 || PACKETVER_ZERO_NUM >= 20180919
+#if PACKETVER_RE_NUM >= 20180829 || PACKETVER_ZERO_NUM >= 20180919 || PACKETVER_MAIN_NUM >= 20181002
nullpo_retv(sd);
nullpo_retv(name);
@@ -2922,10 +2922,10 @@ static void clif_inventoryStart(struct map_session_data *sd, enum inventory_type
memset(buf, 0, sizeof(buf));
struct ZC_INVENTORY_START *p = (struct ZC_INVENTORY_START *)buf;
p->packetType = 0xb08;
-#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919
+#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919 || PACKETVER_MAIN_NUM >= 20181002
p->invType = type;
#endif
-#if PACKETVER_RE_NUM >= 20180919 || PACKETVER_ZERO_NUM >= 20180919
+#if PACKETVER_RE_NUM >= 20180919 || PACKETVER_ZERO_NUM >= 20180919 || PACKETVER_MAIN_NUM >= 20181002
int strLen = (int)safestrnlen(name, 24);
if (strLen > 24)
strLen = 24;
@@ -2942,12 +2942,12 @@ static void clif_inventoryStart(struct map_session_data *sd, enum inventory_type
static void clif_inventoryEnd(struct map_session_data *sd, enum inventory_type type)
{
-#if PACKETVER_RE_NUM >= 20180829 || PACKETVER_ZERO_NUM >= 20180919
+#if PACKETVER_RE_NUM >= 20180829 || PACKETVER_ZERO_NUM >= 20180919 || PACKETVER_MAIN_NUM >= 20181002
nullpo_retv(sd);
struct ZC_INVENTORY_END p;
p.packetType = 0xb0b;
-#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919
+#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919 || PACKETVER_MAIN_NUM >= 20181002
p.invType = type;
#endif
p.flag = 0;
@@ -2983,10 +2983,10 @@ static void clif_storageItems(struct map_session_data *sd, enum inventory_type t
storelist_normal.PacketType = storageListNormalType;
storelist_normal.PacketLength = ( sizeof( storelist_normal ) - sizeof( storelist_normal.list ) ) + (sizeof(struct NORMALITEM_INFO) * normal);
-#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919
+#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919 || PACKETVER_MAIN_NUM >= 20181002
storelist_normal.invType = type;
#endif
-#if PACKETVER >= 20120925 && PACKETVER_RE_NUM < 20180829 && PACKETVER_ZERO_NUM < 20180919
+#if PACKETVER >= 20120925 && PACKETVER_RE_NUM < 20180829 && PACKETVER_ZERO_NUM < 20180919 && PACKETVER_MAIN_NUM < 20181002
safestrncpy(storelist_normal.name, "Storage", NAME_LENGTH);
#endif
@@ -2997,10 +2997,10 @@ static void clif_storageItems(struct map_session_data *sd, enum inventory_type t
storelist_equip.PacketType = storageListEquipType;
storelist_equip.PacketLength = ( sizeof( storelist_equip ) - sizeof( storelist_equip.list ) ) + (sizeof(struct EQUIPITEM_INFO) * equip);
-#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919
+#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919 || PACKETVER_MAIN_NUM >= 20181002
storelist_equip.invType = type;
#endif
-#if PACKETVER >= 20120925 && PACKETVER_RE_NUM < 20180829 && PACKETVER_ZERO_NUM < 20180919
+#if PACKETVER >= 20120925 && PACKETVER_RE_NUM < 20180829 && PACKETVER_ZERO_NUM < 20180919 && PACKETVER_MAIN_NUM < 20181002
safestrncpy(storelist_equip.name, "Storage", NAME_LENGTH);
#endif
@@ -3013,11 +3013,11 @@ static void clif_storageItems(struct map_session_data *sd, enum inventory_type t
static void clif_cartList(struct map_session_data *sd)
{
-#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919
+#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919 || PACKETVER_MAIN_NUM >= 20181002
clif->inventoryStart(sd, INVTYPE_CART, "");
#endif
clif->cartItems(sd, INVTYPE_CART);
-#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919
+#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919 || PACKETVER_MAIN_NUM >= 20181002
clif->inventoryEnd(sd, INVTYPE_CART);
#endif
}
@@ -3043,7 +3043,7 @@ static void clif_cartItems(struct map_session_data *sd, enum inventory_type type
if (normal) {
itemlist_normal.PacketType = cartlistnormalType;
itemlist_normal.PacketLength = (sizeof(itemlist_normal) - sizeof(itemlist_normal.list)) + (sizeof(struct NORMALITEM_INFO) * normal);
-#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919
+#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919 || PACKETVER_MAIN_NUM >= 20181002
itemlist_normal.invType = type;
#endif
@@ -3053,7 +3053,7 @@ static void clif_cartItems(struct map_session_data *sd, enum inventory_type type
if (equip) {
itemlist_equip.PacketType = cartlistequipType;
itemlist_equip.PacketLength = (sizeof(itemlist_equip) - sizeof(itemlist_equip.list)) + (sizeof(struct EQUIPITEM_INFO) * equip);
-#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919
+#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919 || PACKETVER_MAIN_NUM >= 20181002
itemlist_equip.invType = type;
#endif
@@ -7721,6 +7721,7 @@ static void clif_mvp_noitem(struct map_session_data *sd)
/// 1 = "You are already in a Guild."
/// 2 = "That Guild Name already exists."
/// 3 = "You need the necessary item to create a Guild."
+/// 4 = "Can't create a Guild in this area."
static void clif_guild_created(struct map_session_data *sd, int flag)
{
int fd;
@@ -8207,6 +8208,7 @@ static void clif_guild_invite(struct map_session_data *sd, struct guild *g)
/// 1 = Offer rejected.
/// 2 = Offer accepted.
/// 3 = Guild full.
+/// 4 = Offline or not exists
static void clif_guild_inviteack(struct map_session_data *sd, int flag)
{
int fd;
@@ -8863,6 +8865,45 @@ static void clif_specialeffect_value(struct block_list *bl, int effect_id, int n
clif->send(buf, packet_len(0x284), bl, SELF);
}
}
+
+/// Remove special effects (ZC_REMOVE_EFFECT).
+/// 0b0d <id>.L <effect id>.L
+/// effect id:
+/// @see doc/effect_list.txt
+static void clif_removeSpecialEffect(struct block_list *bl, int effectId, enum send_target target)
+{
+#if PACKETVER_MAIN_NUM >= 20181002 || PACKETVER_RE_NUM >= 20181002 || PACKETVER_ZERO_NUM >= 20181010
+ nullpo_retv(bl);
+
+ struct PACKET_ZC_REMOVE_EFFECT p;
+ p.packetType = 0xb0d;
+ p.aid = bl->id;
+ p.effectId = effectId;
+
+ clif->send(&p, sizeof(p), bl, target);
+
+ if (clif->isdisguised(bl)) {
+ p.aid = -bl->id;
+ clif->send(&p, sizeof(p), bl, SELF);
+ }
+#endif
+}
+
+static void clif_removeSpecialEffect_single(struct block_list *bl, int effectId, struct block_list *targetBl)
+{
+#if PACKETVER_MAIN_NUM >= 20181002 || PACKETVER_RE_NUM >= 20181002 || PACKETVER_ZERO_NUM >= 20181010
+ nullpo_retv(bl);
+ nullpo_retv(targetBl);
+
+ struct PACKET_ZC_REMOVE_EFFECT p;
+ p.packetType = 0xb0d;
+ p.aid = bl->id;
+ p.effectId = effectId;
+
+ clif->send(&p, sizeof(p), targetBl, SELF);
+#endif
+}
+
/**
* Modification of clif_messagecolor to send colored messages to players to chat log only (doesn't display overhead).
*
@@ -16831,7 +16872,11 @@ static void clif_quest_send_list(struct map_session_data *sd)
real_len += sizeof(info->objectives[j]);
mob_data = mob->db(qi->objectives[j].mob);
-#if PACKETVER >= 20150513
+#if PACKETVER_ZERO_NUM >= 20181010 || PACKETVER >= 20181017
+ info->objectives[j].huntIdent = sd->quest_log[i].quest_id;
+ info->objectives[j].huntIdent2 = j;
+ info->objectives[j].mobType = 0; // Info Needed
+#elif PACKETVER >= 20150513
info->objectives[j].huntIdent = (sd->quest_log[i].quest_id * 1000) + j;
info->objectives[j].mobType = 0; // Info Needed
#endif
@@ -16920,7 +16965,11 @@ static void clif_quest_add(struct map_session_data *sd, struct quest *qd)
monster = mob->db(qi->objectives[i].mob);
-#if PACKETVER >= 20150513
+#if PACKETVER_ZERO_NUM >= 20181010 || PACKETVER >= 20181017
+ packet->objectives[i].huntIdent = qd->quest_id;
+ packet->objectives[i].huntIdent2 = i;
+ packet->objectives[i].mobType = 0; // Info Needed
+#elif PACKETVER >= 20150513
packet->objectives[i].huntIdent = (qd->quest_id * 1000) + i;
packet->objectives[i].mobType = 0; // Info Needed
#endif
@@ -16981,7 +17030,10 @@ static void clif_quest_update_objective(struct map_session_data *sd, struct ques
real_len += sizeof(packet->objectives[i]);
packet->objectives[i].questID = qd->quest_id;
-#if PACKETVER >= 20150513
+#if PACKETVER_ZERO_NUM >= 20181010 || PACKETVER >= 20181017
+ packet->objectives[i].huntIdent = qd->quest_id;
+ packet->objectives[i].huntIdent2 = i;
+#elif PACKETVER >= 20150513
packet->objectives[i].huntIdent = (qd->quest_id * 1000) + i;
#else
packet->objectives[i].mob_id = qi->objectives[i].mob;
@@ -17556,6 +17608,7 @@ static int clif_instance(int instance_id, int type, int flag)
case 2:
// S 0x2cc <Standby Position>.W
// To announce Instancing queue creation if no maps available
+ // flag is priority, negative value mean cancel reservation
WBUFW(buf,0) = 0x02CC;
WBUFW(buf,2) = flag;
clif->send(buf,packet_len(0x02CC),&sd->bl,target);
@@ -18837,8 +18890,20 @@ static void clif_monster_hp_bar(struct mob_data *md, struct map_session_data *sd
}
/* [Ind/Hercules] placeholder for unsupported incoming packets (avoids server disconnecting client) */
-static void __attribute__ ((unused)) clif_parse_dull(int fd, struct map_session_data *sd)
+static void clif_parse_dull(int fd, struct map_session_data *sd)
{
+ const int cmd = clif->cmd;
+ Assert_retv(cmd <= MAX_PACKET_DB && cmd >= MIN_PACKET_DB);
+
+ int packet_len = packet_db[cmd].len;
+ if (packet_len == -1) { // variable-length packet
+ packet_len = RFIFOW(fd, 2);
+ }
+ if (sd) {
+ ShowWarning("Unhandled packet 0x%04d (length %d), %s session #%d, %d/%d (AID/CID)\n", cmd, packet_len, sd->state.active ? "authed" : "unauthed", fd, sd->status.account_id, sd->status.char_id);
+ } else {
+ ShowWarning("Unhandled packet 0x%04d (length %d), session #%d\n", cmd, packet_len, fd);
+ }
return;
}
@@ -20624,7 +20689,7 @@ static void clif_achievement_reward_ack(int fd, struct map_session_data *sd, con
nullpo_retv(ad);
p.packet_id = achievementRewardAckType;
- p.received = 1;
+ p.failed = 0;
p.ach_id = ad->id;
clif->send(&p, packet_len(achievementRewardAckType), &sd->bl, SELF);
@@ -21868,6 +21933,54 @@ static void clif_parse_memorial_dungeon_command(int fd, struct map_session_data
}
}
+static void clif_camera_showWindow(struct map_session_data *sd)
+{
+#if PACKETVER >= 20160525
+ nullpo_retv(sd);
+ struct PACKET_ZC_CAMERA_INFO p;
+ p.packetType = 0xa78;
+ p.action = 1;
+ p.range = 0;
+ p.rotation = 0;
+ p.latitude = 0;
+ clif->send(&p, sizeof(p), &sd->bl, SELF);
+#endif
+}
+
+static void clif_camera_change(struct map_session_data *sd, float range, float rotation, float latitude, enum send_target target)
+{
+#if PACKETVER >= 20160525
+ nullpo_retv(sd);
+ struct PACKET_ZC_CAMERA_INFO p;
+ p.packetType = 0xa78;
+ p.action = 0;
+ p.range = range;
+ p.rotation = rotation;
+ p.latitude = latitude;
+ clif->send(&p, sizeof(p), &sd->bl, target);
+#endif
+}
+
+// show item preview in already opened preview window
+static void clif_item_preview(struct map_session_data *sd, int n)
+{
+#if PACKETVER_MAIN_NUM >= 20170726 || PACKETVER_RE_NUM >= 20170621 || defined(PACKETVER_ZERO)
+ nullpo_retv(sd);
+ Assert_retv(n >= 0 && n < MAX_INVENTORY);
+
+ struct PACKET_ZC_ITEM_PREVIEW p;
+ p.packetType = itemPreview;
+ p.index = n + 2;
+#if PACKETVER_MAIN_NUM >= 20181017 || PACKETVER_RE_NUM >= 20181017
+ p.isDamaged = (sd->status.inventory[n].attribute & ATTR_BROKEN) != 0 ? 1 : 0;
+#endif
+ p.refiningLevel = sd->status.inventory[n].refine;
+ clif->addcards(&p.slot, &sd->status.inventory[n]);
+ clif->add_item_options(&p.option_data[0], &sd->status.inventory[n]);
+ clif->send(&p, sizeof(p), &sd->bl, SELF);
+#endif
+}
+
/*==========================================
* Main client packet processing function
*------------------------------------------*/
@@ -21919,6 +22032,7 @@ static int clif_parse(int fd)
parse_cmd_func = clif->parse_cmd;
cmd = parse_cmd_func(fd,sd);
+ clif->cmd = cmd;
if (VECTOR_LENGTH(HPM->packets[hpClif_Parse]) > 0) {
int result = HPM->parse_packets(fd,cmd,hpClif_Parse);
@@ -21982,8 +22096,8 @@ static int clif_parse(int fd)
else
packet_db[cmd].func(fd, sd);
}
-#ifdef DUMP_UNKNOWN_PACKET
else {
+#ifdef DUMP_UNKNOWN_PACKET
const char* packet_txt = "save/packet.txt";
FILE* fp;
@@ -22009,8 +22123,10 @@ static int clif_parse(int fd)
ShowDump(RFIFOP(fd,0), packet_len);
}
- }
+#else
+ clif->pDull(fd, sd);
#endif
+ }
RFIFOSKIP(fd, packet_len);
@@ -22182,6 +22298,7 @@ void clif_defaults(void)
clif->map_port = 5121;
clif->ally_only = false;
clif->delayed_damage_ers = NULL;
+ clif->cmd = -1;
/* core */
clif->init = do_init_clif;
clif->final = do_final_clif;
@@ -22416,6 +22533,8 @@ void clif_defaults(void)
clif->specialeffect = clif_specialeffect;
clif->specialeffect_single = clif_specialeffect_single;
clif->specialeffect_value = clif_specialeffect_value;
+ clif->removeSpecialEffect = clif_removeSpecialEffect;
+ clif->removeSpecialEffect_single = clif_removeSpecialEffect_single;
clif->millenniumshield = clif_millenniumshield;
clif->spiritcharm = clif_charm;
clif->charm_single = clif_charm_single;
@@ -23026,6 +23145,10 @@ void clif_defaults(void)
clif->cz_req_style_change_sub = clif_cz_req_style_change_sub;
clif->style_change_response = clif_style_change_response;
+ clif->camera_showWindow = clif_camera_showWindow;
+ clif->camera_change = clif_camera_change;
+ clif->item_preview = clif_item_preview;
+
// -- Pet Evolution
clif->pPetEvolution = clif_parse_pet_evolution;
clif->petEvolutionResult = clif_pet_evolution_result;
diff --git a/src/map/clif.h b/src/map/clif.h
index 86e53e1e9..b76c5ed70 100644
--- a/src/map/clif.h
+++ b/src/map/clif.h
@@ -684,6 +684,7 @@ struct clif_interface {
uint16 map_port;
char map_ip_str[128];
int map_fd;
+ int cmd;
/* for clif_clearunit_delayed */
struct eri *delay_clearunit_ers;
/* Cash Shop [Ind/Hercules] */
@@ -939,6 +940,8 @@ struct clif_interface {
void (*specialeffect) (struct block_list* bl, int type, enum send_target target);
void (*specialeffect_single) (struct block_list* bl, int type, int fd);
void (*specialeffect_value) (struct block_list* bl, int effect_id, int num, send_target target);
+ void (*removeSpecialEffect) (struct block_list *bl, int effectId, enum send_target target);
+ void (*removeSpecialEffect_single) (struct block_list *bl, int effectId, struct block_list *targetBl);
void (*millenniumshield) (struct block_list *bl, short shields );
void (*spiritcharm) (struct map_session_data *sd);
void (*charm_single) (int fd, struct map_session_data *sd);
@@ -1549,6 +1552,9 @@ struct clif_interface {
void (*petEvolutionResult) (int fd, enum pet_evolution_result result);
void (*party_dead_notification) (struct map_session_data *sd);
void (*pMemorialDungeonCommand) (int fd, struct map_session_data *sd);
+ void (*camera_showWindow) (struct map_session_data *sd);
+ void (*camera_change) (struct map_session_data *sd, float range, float rotation, float latitude, enum send_target target);
+ void (*item_preview) (struct map_session_data *sd, int n);
};
#ifdef HERCULES_CORE
diff --git a/src/map/guild.c b/src/map/guild.c
index 780d21326..757dbb445 100644
--- a/src/map/guild.c
+++ b/src/map/guild.c
@@ -721,7 +721,6 @@ static int guild_reply_invite(struct map_session_data *sd, int guild_id, int fla
}
else
{// accepted
- struct guild_member m;
struct guild* g;
int i;
@@ -741,8 +740,8 @@ static int guild_reply_invite(struct map_session_data *sd, int guild_id, int fla
return 0;
}
- guild->makemember(&m,sd);
- intif->guild_addmember(guild_id, &m);
+ guild->makemember(&g->member[i], sd);
+ intif->guild_addmember(guild_id, &g->member[i]);
//TODO: send a minimap update to this player
}
diff --git a/src/map/map.h b/src/map/map.h
index d50666d4b..cb025e9c1 100644
--- a/src/map/map.h
+++ b/src/map/map.h
@@ -815,6 +815,7 @@ struct questinfo {
struct s_homunculus homunculus;
int homunculus_type;
VECTOR_DECL(struct questinfo_qreq) quest_requirement;
+ int mercenary_class;
};
diff --git a/src/map/messages_main.h b/src/map/messages_main.h
index f26fdb50b..e56eb42a1 100644
--- a/src/map/messages_main.h
+++ b/src/map/messages_main.h
@@ -23,7 +23,7 @@
/* This file is autogenerated, please do not commit manual changes
-Latest version: 20180829
+Latest version: 20181002
*/
enum clif_messages {
@@ -17569,9 +17569,11 @@ DEATH: %.1f%% (Basic 100.0%% VIP Bonus %.1f%% + %s %.1f%%)
MSG_ID_AFB = 0xafb,
#endif
#if PACKETVER >= 20150826
-/*20150826 to latest
+/*20150826 to 20180919
해당 태그는 이름으로 사용하실 수 없습니다.
Name with this tag cannot be used.
+20181002 to latest
+ 해당 내용은 이름으로 사용하실 수 없습니다.
*/
MSG_ID_AFC = 0xafc,
#endif
@@ -21285,6 +21287,44 @@ NOW LOADING..
*/
MSG_ID_DD5 = 0xdd5,
#endif
+#if PACKETVER >= 20181002
+/*20181002 to latest
+삭제
+*/
+ MSG_ID_DD6 = 0xdd6,
+/*20181002 to latest
+답장
+*/
+ MSG_ID_DD7 = 0xdd7,
+/*20181002 to latest
+전송
+*/
+ MSG_ID_DD8 = 0xdd8,
+/*20181002 to latest
+이름확인
+*/
+ MSG_ID_DD9 = 0xdd9,
+/*20181002 to latest
+공지
+Notice
+*/
+ MSG_ID_DDA = 0xdda,
+/*20181002 to latest
+일반
+General
+*/
+ MSG_ID_DDB = 0xddb,
+/*20181002 to latest
+반송
+Clear
+*/
+ MSG_ID_DDC = 0xddc,
+/*20181002 to latest
+검색
+Search
+*/
+ MSG_ID_DDD = 0xddd,
+#endif
};
#endif /* MAP_MESSAGES_MAIN_H */
diff --git a/src/map/messages_re.h b/src/map/messages_re.h
index c263150e3..474030df1 100644
--- a/src/map/messages_re.h
+++ b/src/map/messages_re.h
@@ -23,7 +23,7 @@
/* This file is autogenerated, please do not commit manual changes
-Latest version: 20180919
+Latest version: 20181002
*/
enum clif_messages {
@@ -17045,9 +17045,11 @@ DEATH: %.1f%% (Basic 100.0%% VIP Bonus %.1f%% + %s %.1f%%)
MSG_ID_AFB = 0xafb,
#endif
#if PACKETVER >= 20150826
-/*20150826 to latest
+/*20150826 to 20180919
해당 태그는 이름으로 사용하실 수 없습니다.
Name with this tag cannot be used.
+20181002 to latest
+ 해당 내용은 이름으로 사용하실 수 없습니다.
*/
MSG_ID_AFC = 0xafc,
#endif
diff --git a/src/map/messages_zero.h b/src/map/messages_zero.h
index c562bb07c..348bc00c8 100644
--- a/src/map/messages_zero.h
+++ b/src/map/messages_zero.h
@@ -23,7 +23,7 @@
/* This file is autogenerated, please do not commit manual changes
-Latest version: 20180919
+Latest version: 20181010
*/
enum clif_messages {
@@ -13926,9 +13926,11 @@ DEATH : %.1f%% ( basic 100.0%% VIP Bonus %.1f%% + %s %.1f%%)
DEATH: %.1f%% (Basic 100.0%% VIP Bonus %.1f%% + %s %.1f%%)
*/
MSG_ID_AFB = 0xafb,
-/*20171018 to latest
+/*20171018 to 20180928
해당 태그는 이름으로 사용하실 수 없습니다.
Name with this tag cannot be used.
+20181010 to latest
+ 해당 내용은 이름으로 사용하실 수 없습니다.
*/
MSG_ID_AFC = 0xafc,
/*20171018 to latest
diff --git a/src/map/packets.h b/src/map/packets.h
index a897601b3..fb48d953b 100644
--- a/src/map/packets.h
+++ b/src/map/packets.h
@@ -4337,4 +4337,46 @@ packet(0x96e,-1,clif->ackmergeitems);
packet(0x0b0d,10,clif->pDull/*,XXX*/);
#endif
+
+// 2018-10-02aRagexe
+#if PACKETVER_MAIN_NUM >= 20181002
+// new packets
+ packet(0x0b10,10,clif->pDull/*,XXX*/);
+ packet(0x0b11,4,clif->pDull/*,XXX*/);
+// changed packet sizes
+ packet(0x0b08,-1); // ZC_INVENTORY_START
+#endif
+
+// 2018-10-02aRagexeRE
+#if PACKETVER_RE_NUM >= 20181002
+// new packets
+ packet(0x0b10,10,clif->pDull/*,XXX*/);
+ packet(0x0b11,4,clif->pDull/*,XXX*/);
+// changed packet sizes
+#endif
+
+// 2018-10-10_2aRagexe_zero
+#if PACKETVER_ZERO_NUM >= 20181010
+// new packets
+ packet(0x0b10,10,clif->pDull/*,XXX*/);
+ packet(0x0b11,4,clif->pDull/*,XXX*/);
+// changed packet sizes
+#endif
+
+// 2018-10-17bRagexe
+#if PACKETVER_MAIN_NUM >= 20181017
+// new packets
+ packet(0x0b12,2,clif->pDull/*,XXX*/);
+ packet(0x0b13,40);
+// changed packet sizes
+#endif
+
+// 2018-10-17bRagexeRE
+#if PACKETVER_RE_NUM >= 20181017
+// new packets
+ packet(0x0b12,2,clif->pDull/*,XXX*/);
+ packet(0x0b13,48);
+// changed packet sizes
+#endif
+
#endif /* MAP_PACKETS_H */
diff --git a/src/map/packets_keys_main.h b/src/map/packets_keys_main.h
index a9d9a7020..c94e44525 100644
--- a/src/map/packets_keys_main.h
+++ b/src/map/packets_keys_main.h
@@ -874,7 +874,7 @@
packetKeys(0x6A596301,0x76866D0E,0x32294A45);
#endif
-// 2013-12-23aRagexeRE, 2014-05-08aRagexe, 2014-05-08aRagexeRE, 2014-06-11eRagexe, 2015-02-25hRagexe, 2018-03-15aRagexe, 2018-03-21aRagexe, 2018-03-21aRagexeRE, 2018-03-28bRagexe, 2018-03-28bRagexeRE, 2018-04-04bRagexe, 2018-04-04cRagexeRE, 2018-04-18aRagexe, 2018-04-18bRagexeRE, 2018-04-25cRagexe, 2018-04-25cRagexeRE, 2018-05-02bRagexe, 2018-05-02bRagexeRE, 2018-05-02dRagexeRE, 2018-05-09aRagexe, 2018-05-16cRagexe, 2018-05-16cRagexeRE, 2018-05-23aRagexe, 2018-05-23aRagexeRE, 2018-05-30aRagexe, 2018-05-30bRagexeRE, 2018-05-30cRagexeRE, 2018-06-05bRagexe, 2018-06-05bRagexeRE, 2018-06-12aRagexeRE, 2018-06-12bRagexeRE, 2018-06-20cRagexe, 2018-06-20dRagexeRE, 2018-06-20eRagexe, 2018-06-20eRagexeRE, 2018-06-21aRagexe, 2018-06-21aRagexeRE, 2018-07-04aRagexe, 2018-07-04aRagexeRE, 2018-07-11aRagexeRE, 2018-07-18bRagexe, 2018-07-18bRagexeRE, 2018-07-18bRagexeRE1, 2018-07-18cRagexe, 2018-07-18cRagexeRE, 2018-08-01cRagexe, 2018-08-01cRagexeRE, 2018-08-08bRagexe, 2018-08-08bRagexeRE, 2018-08-22cRagexe, 2018-08-22cRagexeRE, 2018-08-29aRagexe, 2018-08-29aRagexeRE, 2018-08-29bRagexeRE, 2018-08-31aRagexe, 2018-09-12dRagexe, 2018-09-12dRagexeRE, 2018-09-19aRagexe, 2018-09-19aRagexeRE
+// 2013-12-23aRagexeRE, 2014-05-08aRagexe, 2014-05-08aRagexeRE, 2014-06-11eRagexe, 2015-02-25hRagexe, 2018-03-15aRagexe, 2018-03-21aRagexe, 2018-03-21aRagexeRE, 2018-03-28bRagexe, 2018-03-28bRagexeRE, 2018-04-04bRagexe, 2018-04-04cRagexeRE, 2018-04-18aRagexe, 2018-04-18bRagexeRE, 2018-04-25cRagexe, 2018-04-25cRagexeRE, 2018-05-02bRagexe, 2018-05-02bRagexeRE, 2018-05-02dRagexeRE, 2018-05-09aRagexe, 2018-05-16cRagexe, 2018-05-16cRagexeRE, 2018-05-23aRagexe, 2018-05-23aRagexeRE, 2018-05-30aRagexe, 2018-05-30bRagexeRE, 2018-05-30cRagexeRE, 2018-06-05bRagexe, 2018-06-05bRagexeRE, 2018-06-12aRagexeRE, 2018-06-12bRagexeRE, 2018-06-20cRagexe, 2018-06-20dRagexeRE, 2018-06-20eRagexe, 2018-06-20eRagexeRE, 2018-06-21aRagexe, 2018-06-21aRagexeRE, 2018-07-04aRagexe, 2018-07-04aRagexeRE, 2018-07-11aRagexeRE, 2018-07-18bRagexe, 2018-07-18bRagexeRE, 2018-07-18bRagexeRE1, 2018-07-18cRagexe, 2018-07-18cRagexeRE, 2018-08-01cRagexe, 2018-08-01cRagexeRE, 2018-08-08bRagexe, 2018-08-08bRagexeRE, 2018-08-22cRagexe, 2018-08-22cRagexeRE, 2018-08-29aRagexe, 2018-08-29aRagexeRE, 2018-08-29bRagexeRE, 2018-08-31aRagexe, 2018-09-12dRagexe, 2018-09-12dRagexeRE, 2018-09-19aRagexe, 2018-09-19aRagexeRE, 2018-10-02aRagexe, 2018-10-02aRagexeRE, 2018-10-02bRagexe, 2018-10-02bRagexeRE, 2018-10-17bRagexe, 2018-10-17bRagexeRE
#if PACKETVER == 20131223 || \
PACKETVER == 20140508 || \
PACKETVER == 20140611 || \
@@ -903,7 +903,9 @@
PACKETVER == 20180829 || \
PACKETVER == 20180831 || \
PACKETVER == 20180912 || \
- PACKETVER >= 20180919
+ PACKETVER == 20180919 || \
+ PACKETVER == 20181002 || \
+ PACKETVER >= 20181017
packetKeys(0x00000000,0x00000000,0x00000000);
#endif
diff --git a/src/map/packets_keys_zero.h b/src/map/packets_keys_zero.h
index bbc1f7332..2d1f35e94 100644
--- a/src/map/packets_keys_zero.h
+++ b/src/map/packets_keys_zero.h
@@ -29,7 +29,7 @@
/* This file is autogenerated, please do not commit manual changes */
-// 2017-10-18aRagexe_zero, 2017-10-19aRagexe_zero, 2017-10-23aRagexe_zero, 2017-10-23bRagexe_zero, 2017-10-23cRagexe_zero, 2017-10-24aRagexe_2_zero, 2017-10-24aRagexe_zero, 2017-10-25bRagexe_zero, 2017-10-27aRagexe_zero, 2017-10-27bRagexe_zero, 2017-10-30aRagexe_zero, 2017-10-31aRagexe_zero, 2017-11-09aRagexe_zero, 2017-11-13aRagexe_zero, 2017-11-13bRagexe_zero, 2018-03-15aRagexe_zero, 2018-03-21aRagexe_zero, 2018-03-21bRagexe_zero, 2018-03-28_1aRagexe_zero, 2018-03-28cRagexe_zero, 2018-04-11aRagexe_zero, 2018-04-25_3aRagexe_zero, 2018-05-09_3aRagexe_zero, 2018-05-23aRagexe_zero, 2018-06-05bRagexe_zero, 2018-06-05cRagexe_zero, 2018-06-27aRagexe_zero, 2018-07-03aRagexe_zero, 2018-07-11_2aRagexe_zero, 2018-07-25_2aRagexe_zero, 2018-08-01aRagexe_zero, 2018-08-08_2aRagexe_zero, 2018-08-22aRagexe_zero, 2018-08-29aRagexe_zero, 2018-09-05aRagexe_zero, 2018-09-12aRagexe_zero, 2018-09-19aRagexe_zero
+// 2017-10-18aRagexe_zero, 2017-10-19aRagexe_zero, 2017-10-23aRagexe_zero, 2017-10-23bRagexe_zero, 2017-10-23cRagexe_zero, 2017-10-24aRagexe_2_zero, 2017-10-24aRagexe_zero, 2017-10-25bRagexe_zero, 2017-10-27aRagexe_zero, 2017-10-27bRagexe_zero, 2017-10-30aRagexe_zero, 2017-10-31aRagexe_zero, 2017-11-09aRagexe_zero, 2017-11-13aRagexe_zero, 2017-11-13bRagexe_zero, 2018-03-15aRagexe_zero, 2018-03-21aRagexe_zero, 2018-03-21bRagexe_zero, 2018-03-28_1aRagexe_zero, 2018-03-28cRagexe_zero, 2018-04-11aRagexe_zero, 2018-04-25_3aRagexe_zero, 2018-05-09_3aRagexe_zero, 2018-05-23aRagexe_zero, 2018-06-05bRagexe_zero, 2018-06-05cRagexe_zero, 2018-06-27aRagexe_zero, 2018-07-03aRagexe_zero, 2018-07-11_2aRagexe_zero, 2018-07-25_2aRagexe_zero, 2018-08-01aRagexe_zero, 2018-08-08_2aRagexe_zero, 2018-08-22aRagexe_zero, 2018-08-29aRagexe_zero, 2018-09-05aRagexe_zero, 2018-09-12aRagexe_zero, 2018-09-19aRagexe_zero, 2018-09-28aRagexe_zero, 2018-10-10_2aRagexe_zero
#if PACKETVER == 20171018 || \
PACKETVER == 20171019 || \
PACKETVER == 20171023 || \
@@ -58,7 +58,9 @@
PACKETVER == 20180829 || \
PACKETVER == 20180905 || \
PACKETVER == 20180912 || \
- PACKETVER >= 20180919
+ PACKETVER == 20180919 || \
+ PACKETVER == 20180928 || \
+ PACKETVER >= 20181010
packetKeys(0x00000000,0x00000000,0x00000000);
#endif
diff --git a/src/map/packets_shuffle_main.h b/src/map/packets_shuffle_main.h
index 8bc395da1..32396ad99 100644
--- a/src/map/packets_shuffle_main.h
+++ b/src/map/packets_shuffle_main.h
@@ -3344,7 +3344,7 @@
packet(0x0969,2,clif->pSearchStoreInfoNextPage,0); // CZ_SEARCH_STORE_INFO_NEXT_PAGE
#endif
-// 2014-06-11eRagexe, 2015-02-25hRagexe, 2018-03-15aRagexe, 2018-03-21aRagexe, 2018-03-28bRagexe, 2018-04-04bRagexe, 2018-04-18aRagexe, 2018-04-25cRagexe, 2018-05-02bRagexe, 2018-05-09aRagexe, 2018-05-16cRagexe, 2018-05-23aRagexe, 2018-05-30aRagexe, 2018-06-05bRagexe, 2018-06-20cRagexe, 2018-06-20eRagexe, 2018-06-21aRagexe, 2018-07-04aRagexe, 2018-07-18bRagexe, 2018-07-18cRagexe, 2018-08-01cRagexe, 2018-08-08bRagexe, 2018-08-22cRagexe, 2018-08-29aRagexe, 2018-08-31aRagexe, 2018-09-12dRagexe, 2018-09-19aRagexe
+// 2014-06-11eRagexe, 2015-02-25hRagexe, 2018-03-15aRagexe, 2018-03-21aRagexe, 2018-03-28bRagexe, 2018-04-04bRagexe, 2018-04-18aRagexe, 2018-04-25cRagexe, 2018-05-02bRagexe, 2018-05-09aRagexe, 2018-05-16cRagexe, 2018-05-23aRagexe, 2018-05-30aRagexe, 2018-06-05bRagexe, 2018-06-20cRagexe, 2018-06-20eRagexe, 2018-06-21aRagexe, 2018-07-04aRagexe, 2018-07-18bRagexe, 2018-07-18cRagexe, 2018-08-01cRagexe, 2018-08-08bRagexe, 2018-08-22cRagexe, 2018-08-29aRagexe, 2018-08-31aRagexe, 2018-09-12dRagexe, 2018-09-19aRagexe, 2018-10-02aRagexe, 2018-10-02bRagexe, 2018-10-17bRagexe
#if PACKETVER == 20140611 || \
PACKETVER == 20150225 || \
PACKETVER == 20180315 || \
@@ -3369,7 +3369,9 @@
PACKETVER == 20180829 || \
PACKETVER == 20180831 || \
PACKETVER == 20180912 || \
- PACKETVER >= 20180919
+ PACKETVER == 20180919 || \
+ PACKETVER == 20181002 || \
+ PACKETVER >= 20181017
packet(0x0202,26,clif->pFriendsListAdd,2); // CZ_ADD_FRIENDS
packet(0x022d,5,clif->pHomMenu,2,4); // CZ_COMMAND_MER
packet(0x023b,36,clif->pStoragePassword,0); // CZ_ACK_STORE_PASSWORD
diff --git a/src/map/packets_shuffle_re.h b/src/map/packets_shuffle_re.h
index 157a8a431..bf44faa7c 100644
--- a/src/map/packets_shuffle_re.h
+++ b/src/map/packets_shuffle_re.h
@@ -9662,7 +9662,7 @@
packet(0x083c,12,clif->pSearchStoreInfoListItemClick,2,6,10); // CZ_SSILIST_ITEM_CLICK
#endif
-// 2018-07-04aRagexeRE, 2018-07-11aRagexeRE, 2018-07-18bRagexeRE, 2018-07-18bRagexeRE1, 2018-07-18cRagexeRE, 2018-08-01cRagexeRE, 2018-08-08bRagexeRE, 2018-08-22cRagexeRE, 2018-08-29aRagexeRE, 2018-08-29bRagexeRE, 2018-09-12dRagexeRE, 2018-09-19aRagexeRE
+// 2018-07-04aRagexeRE, 2018-07-11aRagexeRE, 2018-07-18bRagexeRE, 2018-07-18bRagexeRE1, 2018-07-18cRagexeRE, 2018-08-01cRagexeRE, 2018-08-08bRagexeRE, 2018-08-22cRagexeRE, 2018-08-29aRagexeRE, 2018-08-29bRagexeRE, 2018-09-12dRagexeRE, 2018-09-19aRagexeRE, 2018-10-02aRagexeRE, 2018-10-02bRagexeRE, 2018-10-17bRagexeRE
#if PACKETVER == 20180704 || \
PACKETVER == 20180711 || \
PACKETVER == 20180718 || \
@@ -9671,7 +9671,9 @@
PACKETVER == 20180822 || \
PACKETVER == 20180829 || \
PACKETVER == 20180912 || \
- PACKETVER >= 20180919
+ PACKETVER == 20180919 || \
+ PACKETVER == 20181002 || \
+ PACKETVER >= 20181017
packet(0x0202,26,clif->pFriendsListAdd,2); // CZ_ADD_FRIENDS
packet(0x022d,5,clif->pHomMenu,2,4); // CZ_COMMAND_MER
packet(0x023b,36,clif->pStoragePassword,0); // CZ_ACK_STORE_PASSWORD
diff --git a/src/map/packets_shuffle_zero.h b/src/map/packets_shuffle_zero.h
index b7253fdda..db83c0ba0 100644
--- a/src/map/packets_shuffle_zero.h
+++ b/src/map/packets_shuffle_zero.h
@@ -36,7 +36,7 @@
/* This file is autogenerated, please do not commit manual changes */
-// 2017-10-18aRagexe_zero, 2017-10-19aRagexe_zero, 2017-10-23aRagexe_zero, 2017-10-23bRagexe_zero, 2017-10-23cRagexe_zero, 2017-10-24aRagexe_2_zero, 2017-10-24aRagexe_zero, 2017-10-25bRagexe_zero, 2017-10-27aRagexe_zero, 2017-10-27bRagexe_zero, 2017-10-30aRagexe_zero, 2017-10-31aRagexe_zero, 2017-11-09aRagexe_zero, 2017-11-13aRagexe_zero, 2017-11-13bRagexe_zero, 2018-03-15aRagexe_zero, 2018-03-21aRagexe_zero, 2018-03-21bRagexe_zero, 2018-03-28_1aRagexe_zero, 2018-03-28cRagexe_zero, 2018-04-11aRagexe_zero, 2018-04-25_3aRagexe_zero, 2018-05-09_3aRagexe_zero, 2018-05-23aRagexe_zero, 2018-06-05bRagexe_zero, 2018-06-05cRagexe_zero, 2018-06-27aRagexe_zero, 2018-07-03aRagexe_zero, 2018-07-11_2aRagexe_zero, 2018-07-25_2aRagexe_zero, 2018-08-01aRagexe_zero, 2018-08-08_2aRagexe_zero, 2018-08-22aRagexe_zero, 2018-08-29aRagexe_zero, 2018-09-05aRagexe_zero, 2018-09-12aRagexe_zero, 2018-09-19aRagexe_zero
+// 2017-10-18aRagexe_zero, 2017-10-19aRagexe_zero, 2017-10-23aRagexe_zero, 2017-10-23bRagexe_zero, 2017-10-23cRagexe_zero, 2017-10-24aRagexe_2_zero, 2017-10-24aRagexe_zero, 2017-10-25bRagexe_zero, 2017-10-27aRagexe_zero, 2017-10-27bRagexe_zero, 2017-10-30aRagexe_zero, 2017-10-31aRagexe_zero, 2017-11-09aRagexe_zero, 2017-11-13aRagexe_zero, 2017-11-13bRagexe_zero, 2018-03-15aRagexe_zero, 2018-03-21aRagexe_zero, 2018-03-21bRagexe_zero, 2018-03-28_1aRagexe_zero, 2018-03-28cRagexe_zero, 2018-04-11aRagexe_zero, 2018-04-25_3aRagexe_zero, 2018-05-09_3aRagexe_zero, 2018-05-23aRagexe_zero, 2018-06-05bRagexe_zero, 2018-06-05cRagexe_zero, 2018-06-27aRagexe_zero, 2018-07-03aRagexe_zero, 2018-07-11_2aRagexe_zero, 2018-07-25_2aRagexe_zero, 2018-08-01aRagexe_zero, 2018-08-08_2aRagexe_zero, 2018-08-22aRagexe_zero, 2018-08-29aRagexe_zero, 2018-09-05aRagexe_zero, 2018-09-12aRagexe_zero, 2018-09-19aRagexe_zero, 2018-09-28aRagexe_zero, 2018-10-10_2aRagexe_zero
#if PACKETVER == 20171018 || \
PACKETVER == 20171019 || \
PACKETVER == 20171023 || \
@@ -65,7 +65,9 @@
PACKETVER == 20180829 || \
PACKETVER == 20180905 || \
PACKETVER == 20180912 || \
- PACKETVER >= 20180919
+ PACKETVER == 20180919 || \
+ PACKETVER == 20180928 || \
+ PACKETVER >= 20181010
packet(0x0202,26,clif->pFriendsListAdd,2); // CZ_ADD_FRIENDS
packet(0x022d,5,clif->pHomMenu,2,4); // CZ_COMMAND_MER
packet(0x023b,36,clif->pStoragePassword,0); // CZ_ACK_STORE_PASSWORD
diff --git a/src/map/packets_struct.h b/src/map/packets_struct.h
index af76a66d7..c786e2457 100644
--- a/src/map/packets_struct.h
+++ b/src/map/packets_struct.h
@@ -198,7 +198,7 @@ enum packet_headers {
#else
dropflooritemType = 0x9e,
#endif
-#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919
+#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919 || PACKETVER_MAIN_NUM >= 20181002
inventorylistnormalType = 0xb09,
#elif PACKETVER >= 20120925
inventorylistnormalType = 0x991,
@@ -209,7 +209,7 @@ enum packet_headers {
#else
inventorylistnormalType = 0xa3,
#endif
-#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919
+#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919 || PACKETVER_MAIN_NUM >= 20181002
inventorylistequipType = 0xb0a,
#elif PACKETVER >= 20150226
inventorylistequipType = 0xa0d,
@@ -222,7 +222,7 @@ enum packet_headers {
#else
inventorylistequipType = 0xa4,
#endif
-#if PACKETVER_RE_NUM >= 20180829 || PACKETVER_ZERO_NUM >= 20180919
+#if PACKETVER_RE_NUM >= 20180829 || PACKETVER_ZERO_NUM >= 20180919 || PACKETVER_MAIN_NUM >= 20181002
storageListNormalType = 0xb09,
#elif PACKETVER >= 20120925
storageListNormalType = 0x995,
@@ -233,7 +233,7 @@ enum packet_headers {
#else
storageListNormalType = 0xa5,
#endif
-#if PACKETVER_RE_NUM >= 20180829 || PACKETVER_ZERO_NUM >= 20180919
+#if PACKETVER_RE_NUM >= 20180829 || PACKETVER_ZERO_NUM >= 20180919 || PACKETVER_MAIN_NUM >= 20181002
storageListEquipType = 0xb0a,
#elif PACKETVER >= 20150226
storageListEquipType = 0xa10,
@@ -246,7 +246,7 @@ enum packet_headers {
#else
storageListEquipType = 0xa6,
#endif
-#if PACKETVER_RE_NUM >= 20180829 || PACKETVER_ZERO_NUM >= 20180919
+#if PACKETVER_RE_NUM >= 20180829 || PACKETVER_ZERO_NUM >= 20180919 || PACKETVER_MAIN_NUM >= 20181002
cartlistnormalType = 0xb09,
#elif PACKETVER >= 20120925
cartlistnormalType = 0x993,
@@ -257,7 +257,7 @@ enum packet_headers {
#else
cartlistnormalType = 0x123,
#endif
-#if PACKETVER_RE_NUM >= 20180829 || PACKETVER_ZERO_NUM >= 20180919
+#if PACKETVER_RE_NUM >= 20180829 || PACKETVER_ZERO_NUM >= 20180919 || PACKETVER_MAIN_NUM >= 20181002
cartlistequipType = 0xb0a,
#elif PACKETVER >= 20150226
cartlistequipType = 0xa0f,
@@ -324,7 +324,9 @@ enum packet_headers {
achievementUpdateType = 0xa24,
achievementRewardAckType = 0xa26,
#endif // PACKETVER >= 20141016
-#if PACKETVER >= 20150513 // [4144] 0x09f8 handling in client from 2014-10-29aRagexe and 2014-03-26cRagexeRE
+#if PACKETVER_ZERO_NUM >= 20181010 || PACKETVER >= 20181017
+ questListType = 0xaff, ///< ZC_ALL_QUEST_LIST4
+#elif PACKETVER >= 20150513 // [4144] 0x09f8 handling in client from 2014-10-29aRagexe and 2014-03-26cRagexeRE
questListType = 0x9f8, ///< ZC_ALL_QUEST_LIST3
#elif PACKETVER >= 20141022
questListType = 0x97a, ///< ZC_ALL_QUEST_LIST2
@@ -378,12 +380,16 @@ enum packet_headers {
clanLeave = 0x0989, ///< ZC_ACK_CLAN_LEAVE
clanMessage = 0x098E, ///< ZC_NOTIFY_CLAN_CHAT
#endif
-#if PACKETVER >= 20150513 // [4144] 0x09f9 handled in client from 2014-10-29aRagexe and 2014-03-26cRagexeRE
+#if PACKETVER_ZERO_NUM >= 20181010 || PACKETVER >= 20181017
+ questAddType = 0xb0c,
+#elif PACKETVER >= 20150513 // [4144] 0x09f9 handled in client from 2014-10-29aRagexe and 2014-03-26cRagexeRE
questAddType = 0x9f9,
#else
questAddType = 0x2b3,
#endif // PACKETVER < 20150513
-#if PACKETVER >= 20150513
+#if PACKETVER_ZERO_NUM >= 20181010 || PACKETVER >= 20181017
+ questUpdateType = 0xafe,
+#elif PACKETVER >= 20150513
questUpdateType = 0x9fa,
#else
questUpdateType = 0x2b5,
@@ -445,6 +451,11 @@ enum packet_headers {
#else
guildLeave = 0x15a,
#endif
+#if PACKETVER_MAIN_NUM >= 20181017 || PACKETVER_RE_NUM >= 20181017
+ itemPreview = 0xb13,
+#else
+ itemPreview = 0xab9,
+#endif
};
#if !defined(sun) && (!defined(__NETBSD__) || __NetBSD_Version__ >= 600000000) // NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute
@@ -1174,7 +1185,7 @@ struct packet_roulette_itemrecv_ack {
struct packet_itemlist_normal {
int16 PacketType;
int16 PacketLength;
-#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919
+#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919 || PACKETVER_MAIN_NUM >= 20181002
uint8 invType;
#endif
struct NORMALITEM_INFO list[MAX_ITEMLIST];
@@ -1183,7 +1194,7 @@ struct packet_itemlist_normal {
struct packet_itemlist_equip {
int16 PacketType;
int16 PacketLength;
-#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919
+#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919 || PACKETVER_MAIN_NUM >= 20181002
uint8 invType;
#endif
struct EQUIPITEM_INFO list[MAX_ITEMLIST];
@@ -1192,10 +1203,10 @@ struct packet_itemlist_equip {
struct ZC_STORE_ITEMLIST_NORMAL {
int16 PacketType;
int16 PacketLength;
-#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919
+#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919 || PACKETVER_MAIN_NUM >= 20181002
uint8 invType;
#endif
-#if PACKETVER >= 20120925 && PACKETVER_RE_NUM < 20180829 && PACKETVER_ZERO_NUM < 20180919
+#if PACKETVER >= 20120925 && PACKETVER_RE_NUM < 20180829 && PACKETVER_ZERO_NUM < 20180919 && PACKETVER_MAIN_NUM < 20181002
char name[NAME_LENGTH];
#endif
struct NORMALITEM_INFO list[MAX_ITEMLIST];
@@ -1203,13 +1214,13 @@ struct ZC_STORE_ITEMLIST_NORMAL {
struct ZC_INVENTORY_START {
int16 packetType;
-#if PACKETVER_RE_NUM >= 20180919 || PACKETVER_ZERO_NUM >= 20180919
+#if PACKETVER_RE_NUM >= 20180919 || PACKETVER_ZERO_NUM >= 20180919 || PACKETVER_MAIN_NUM >= 20181002
int16 packetLength;
#endif
-#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919
+#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919 || PACKETVER_MAIN_NUM >= 20181002
uint8 invType;
#endif
-#if PACKETVER_RE_NUM >= 20180919 || PACKETVER_ZERO_NUM >= 20180919
+#if PACKETVER_RE_NUM >= 20180919 || PACKETVER_ZERO_NUM >= 20180919 || PACKETVER_MAIN_NUM >= 20181002
char name[];
#else
char name[NAME_LENGTH];
@@ -1218,7 +1229,7 @@ struct ZC_INVENTORY_START {
struct ZC_INVENTORY_END {
int16 packetType;
-#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919
+#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919 || PACKETVER_MAIN_NUM >= 20181002
uint8 invType;
#endif
char flag;
@@ -1227,10 +1238,10 @@ struct ZC_INVENTORY_END {
struct ZC_STORE_ITEMLIST_EQUIP {
int16 PacketType;
int16 PacketLength;
-#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919
+#if PACKETVER_RE_NUM >= 20180912 || PACKETVER_ZERO_NUM >= 20180919 || PACKETVER_MAIN_NUM >= 20181002
uint8 invType;
#endif
-#if PACKETVER >= 20120925 && PACKETVER_RE_NUM < 20180829 && PACKETVER_ZERO_NUM < 20180919
+#if PACKETVER >= 20120925 && PACKETVER_RE_NUM < 20180829 && PACKETVER_ZERO_NUM < 20180919 && PACKETVER_MAIN_NUM < 20181002
char name[NAME_LENGTH];
#endif
struct EQUIPITEM_INFO list[MAX_ITEMLIST];
@@ -1449,7 +1460,11 @@ struct packet_hotkey {
* MISSION_HUNT_INFO_EX (PACKETVER >= 20150513)
*/
struct packet_mission_info_sub {
-#if PACKETVER >= 20150513
+#if PACKETVER_ZERO_NUM >= 20181010 || PACKETVER >= 20181017
+ uint32 huntIdent;
+ uint32 huntIdent2;
+ uint32 mobType;
+#elif PACKETVER >= 20150513
uint32 huntIdent;
uint32 mobType;
#endif
@@ -1819,7 +1834,11 @@ struct PACKET_ZC_NOTIFY_CLAN_CHAT {
* PACKET_ZC_MISSION_HUNT_EX (PACKETVER >= 20150513)
*/
struct packet_quest_hunt_sub {
-#if PACKETVER >= 20150513
+#if PACKETVER_ZERO_NUM >= 20181010 || PACKETVER >= 20181017
+ uint32 huntIdent;
+ uint32 huntIdent2;
+ uint32 mobType;
+#elif PACKETVER >= 20150513
uint32 huntIdent;
uint32 mobType;
#endif
@@ -1853,7 +1872,10 @@ struct packet_quest_add_header {
*/
struct packet_quest_update_hunt {
uint32 questID;
-#if PACKETVER >= 20150513
+#if PACKETVER_ZERO_NUM >= 20181010 || PACKETVER >= 20181017
+ uint32 huntIdent;
+ uint32 huntIdent2;
+#elif PACKETVER >= 20150513
uint32 huntIdent;
#else
uint32 mob_id;
@@ -2274,8 +2296,13 @@ struct PACKET_ZC_PROPERTY_HOMUN {
uint16 mdef;
uint16 flee;
uint16 amotion;
+#if PACKETVER < 20150513
+ uint16 hp;
+ uint16 maxHp;
+#else
uint32 hp;
uint32 maxHp;
+#endif
uint16 sp;
uint16 maxSp;
uint32 exp;
@@ -2722,7 +2749,7 @@ struct packet_achievement_update {
struct packet_achievement_reward_ack {
uint16 packet_id;
- uint8 received;
+ uint8 failed;
uint32 ach_id;
} __attribute__((packed));
@@ -2836,6 +2863,32 @@ struct PACKET_CZ_MEMORIALDUNGEON_COMMAND {
int32 command;
} __attribute__((packed));
+struct PACKET_ZC_REMOVE_EFFECT {
+ int16 packetType;
+ uint32 aid;
+ uint32 effectId;
+} __attribute__((packed));
+
+struct PACKET_ZC_CAMERA_INFO {
+ int16 packetType;
+ int8 action;
+ float range;
+ float rotation;
+ float latitude;
+} __attribute__((packed));
+
+struct PACKET_ZC_ITEM_PREVIEW {
+ int16 packetType;
+ int16 index;
+#if PACKETVER_MAIN_NUM >= 20181017 || PACKETVER_RE_NUM >= 20181017
+ int8 isDamaged;
+#endif
+ int16 refiningLevel;
+ struct EQUIPSLOTINFO slot;
+ struct ItemOptions option_data[MAX_ITEM_OPTIONS];
+} __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 961dda9f5..b8a6912ee 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -4402,8 +4402,6 @@ static int pc_insert_card(struct map_session_data *sd, int idx_card, int idx_equ
static int pc_modifybuyvalue(struct map_session_data *sd, int orig_value)
{
int skill_lv, rate1 = 0, rate2 = 0;
- if (orig_value <= 0)
- return 0;
if ((skill_lv=pc->checkskill(sd,MC_DISCOUNT)) > 0) // merchant discount
rate1 = 5+skill_lv*2-((skill_lv==10)? 1:0);
if ((skill_lv=pc->checkskill(sd,RG_COMPULSION)) > 0) // rogue discount
@@ -4412,8 +4410,9 @@ static int pc_modifybuyvalue(struct map_session_data *sd, int orig_value)
rate1 = rate2;
if (rate1 != 0)
orig_value = apply_percentrate(orig_value, 100-rate1, 100);
- if (orig_value < 1)
- orig_value = 1;
+
+ if (orig_value < battle_config.min_item_buy_price)
+ orig_value = battle_config.min_item_buy_price;
return orig_value;
}
@@ -4423,14 +4422,13 @@ static int pc_modifybuyvalue(struct map_session_data *sd, int orig_value)
static int pc_modifysellvalue(struct map_session_data *sd, int orig_value)
{
int skill_lv, rate = 0;
- if (orig_value <= 0)
- return 0;
if ((skill_lv=pc->checkskill(sd,MC_OVERCHARGE)) > 0) //OverCharge
rate = 5+skill_lv*2-((skill_lv==10)? 1:0);
if (rate != 0)
orig_value = apply_percentrate(orig_value, 100+rate, 100);
- if (orig_value < 1)
- orig_value = 1;
+
+ if (orig_value < battle_config.min_item_sell_price)
+ orig_value = battle_config.min_item_sell_price;
return orig_value;
}
@@ -4506,14 +4504,15 @@ static int pc_payzeny(struct map_session_data *sd, int zeny, enum e_log_pick_typ
sd->status.zeny -= zeny;
clif->updatestatus(sd,SP_ZENY);
- achievement->validate_zeny(sd, -zeny); // Achievements [Smokexyz/Hercules]
+ if (zeny > 0) {
+ achievement->validate_zeny(sd, -zeny); // Achievements [Smokexyz/Hercules]
+ logs->zeny(sd, type, tsd ? tsd : sd, -zeny);
- if(!tsd) tsd = sd;
- logs->zeny(sd, type, tsd, -zeny);
- if( zeny > 0 && sd->state.showzeny ) {
- char output[255];
- sprintf(output, "Removed %dz.", zeny);
- clif_disp_onlyself(sd, output);
+ if (sd->state.showzeny) {
+ char output[255];
+ sprintf(output, "Removed %dz.", zeny);
+ clif_disp_onlyself(sd, output);
+ }
}
return 0;
@@ -4644,14 +4643,15 @@ static int pc_getzeny(struct map_session_data *sd, int zeny, enum e_log_pick_typ
sd->status.zeny += zeny;
clif->updatestatus(sd,SP_ZENY);
- achievement->validate_zeny(sd, zeny); // Achievements [Smokexyz/Hercules]
+ if (zeny > 0) {
+ achievement->validate_zeny(sd, zeny); // Achievements [Smokexyz/Hercules]
+ logs->zeny(sd, type, tsd ? tsd : sd, zeny);
- if(!tsd) tsd = sd;
- logs->zeny(sd, type, tsd, zeny);
- if( zeny > 0 && sd->state.showzeny ) {
- char output[255];
- sprintf(output, "Gained %dz.", zeny);
- clif_disp_onlyself(sd, output);
+ if (sd->state.showzeny) {
+ char output[255];
+ sprintf(output, "Gained %dz.", zeny);
+ clif_disp_onlyself(sd, output);
+ }
}
return 0;
@@ -4689,7 +4689,7 @@ static int pc_search_inventory(struct map_session_data *sd, int item_id)
* 6 = ?
* 7 = stack limitation
*------------------------------------------*/
-static int pc_additem(struct map_session_data *sd, struct item *item_data, int amount, e_log_pick_type log_type)
+static int pc_additem(struct map_session_data *sd, const struct item *item_data, int amount, e_log_pick_type log_type)
{
struct item_data *data;
int i;
diff --git a/src/map/pc.h b/src/map/pc.h
index 17a9b8200..4ee5f560b 100644
--- a/src/map/pc.h
+++ b/src/map/pc.h
@@ -937,7 +937,7 @@ END_ZEROED_BLOCK; /* End */
int (*inventoryblank) (struct map_session_data *sd);
int (*search_inventory) (struct map_session_data *sd,int item_id);
int (*payzeny) (struct map_session_data *sd,int zeny, enum e_log_pick_type type, struct map_session_data *tsd);
- int (*additem) (struct map_session_data *sd,struct item *item_data,int amount,e_log_pick_type log_type);
+ int (*additem) (struct map_session_data *sd, const struct item *item_data, int amount, e_log_pick_type log_type);
int (*getzeny) (struct map_session_data *sd,int zeny, enum e_log_pick_type type, struct map_session_data *tsd);
int (*delitem) (struct map_session_data *sd,int n,int amount,int type, short reason, e_log_pick_type log_type);
diff --git a/src/map/quest.c b/src/map/quest.c
index 02bf7638b..f10d6847f 100644
--- a/src/map/quest.c
+++ b/src/map/quest.c
@@ -30,6 +30,7 @@
#include "map/itemdb.h"
#include "map/log.h"
#include "map/map.h"
+#include "map/mercenary.h"
#include "map/mob.h"
#include "map/npc.h"
#include "map/party.h"
@@ -719,6 +720,8 @@ static bool quest_questinfo_validate(struct map_session_data *sd, struct questin
return false;
if (VECTOR_LENGTH(qi->quest_requirement) > 0 && quest->questinfo_validate_quests(sd, qi) == false)
return false;
+ if (qi->mercenary_class != 0 && quest->questinfo_validate_mercenary_class(sd, qi) == false)
+ return false;
return true;
}
@@ -901,6 +904,29 @@ static bool quest_questinfo_validate_quests(struct map_session_data *sd, struct
}
/**
+ * Validate mercenary class required for the questinfo
+ *
+ * @param sd session data.
+ * @param qi questinfo data.
+ *
+ * @retval true if player have a mercenary with the given class.
+ * @retval false if player does NOT have a mercenary with the given class.
+ */
+static bool quest_questinfo_validate_mercenary_class(struct map_session_data *sd, struct questinfo *qi)
+{
+ nullpo_retr(false, sd);
+ nullpo_retr(false, qi);
+
+ if (sd->md == NULL)
+ return false;
+
+ if (sd->md->mercenary.class_ != qi->mercenary_class)
+ return false;
+
+ return true;
+}
+
+/**
* Clears the questinfo data vector
*
* @param m mapindex.
@@ -993,5 +1019,6 @@ void quest_defaults(void)
quest->questinfo_validate_homunculus_level = quest_questinfo_validate_homunculus_level;
quest->questinfo_validate_homunculus_type = quest_questinfo_validate_homunculus_type;
quest->questinfo_validate_quests = quest_questinfo_validate_quests;
+ quest->questinfo_validate_mercenary_class = quest_questinfo_validate_mercenary_class;
quest->questinfo_vector_clear = quest_questinfo_vector_clear;
}
diff --git a/src/map/quest.h b/src/map/quest.h
index 305a48df1..206a7902f 100644
--- a/src/map/quest.h
+++ b/src/map/quest.h
@@ -92,6 +92,7 @@ struct quest_interface {
bool (*questinfo_validate_homunculus_level) (struct map_session_data *sd, struct questinfo *qi);
bool (*questinfo_validate_homunculus_type) (struct map_session_data *sd, struct questinfo *qi);
bool (*questinfo_validate_quests) (struct map_session_data *sd, struct questinfo *qi);
+ bool (*questinfo_validate_mercenary_class) (struct map_session_data *sd, struct questinfo *qi);
void (*questinfo_vector_clear) (int m);
};
diff --git a/src/map/script.c b/src/map/script.c
index b787d0138..e7a2fdb14 100644
--- a/src/map/script.c
+++ b/src/map/script.c
@@ -3316,95 +3316,28 @@ static void set_reg_npcscope_str(struct script_state *st, struct reg_db *n, int6
static void set_reg_pc_ref_str(struct script_state *st, struct reg_db *n, int64 num, const char *name, const char *str)
{
- struct script_reg_str *p = NULL;
- unsigned int index = script_getvaridx(num);
-
- nullpo_retv(n);
-
- if ((p = i64db_get(n->vars, num)) != NULL) {
- if (str[0]) {
- if (p->value) {
- aFree(p->value);
- } else if (index) {
- script->array_update(n, num, false);
- }
- p->value = aStrdup(str);
- } else {
- p->value = NULL;
- if (index) {
- script->array_update(n, num, true);
- }
- }
-
- if (!pc->reg_load) {
- p->flag.update = 1;
- }
- } else if (str[0]) {
- struct DBData prev;
- if (index) {
- script->array_update(n, num, false);
- }
-
- p = ers_alloc(pc->str_reg_ers, struct script_reg_str);
- p->value = aStrdup(str);
+ struct DBIterator *iter = db_iterator(map->pc_db);
- if (!pc->reg_load) {
- p->flag.update = 1;
- }
- p->flag.type = 1;
-
- if(n->vars->put(n->vars, DB->i642key(num), DB->ptr2data(p), &prev)) {
- p = DB->data2ptr(&prev);
- if (p->value) {
- aFree(p->value);
- }
- ers_free(pc->str_reg_ers, p);
+ for (struct map_session_data *sd = dbi_first(iter); dbi_exists(iter); sd = dbi_next(iter)) {
+ if (sd != NULL && n == &sd->regs) {
+ pc->setregistry_str(sd, num, str);
+ break;
}
}
+ dbi_destroy(iter);
}
static void set_reg_pc_ref_num(struct script_state *st, struct reg_db *n, int64 num, const char *name, int val)
{
- struct script_reg_num *p = NULL;
- unsigned int index = script_getvaridx(num);
-
- nullpo_retv(n);
-
- if ((p = i64db_get(n->vars, num)) != NULL) {
- if (val) {
- if (!p->value && index) {
- script->array_update(n, num, false);
- }
- p->value = val;
- } else {
- p->value = 0;
- if (index) {
- script->array_update(n, num, true);
- }
- }
+ struct DBIterator *iter = db_iterator(map->pc_db);
- if (!pc->reg_load) {
- p->flag.update = 1;
- }
- } else if (val) {
- struct DBData prev;
- if (index) {
- script->array_update(n, num, false);
- }
-
- p = ers_alloc(pc->num_reg_ers, struct script_reg_num);
- p->value = val;
-
- if (!pc->reg_load) {
- p->flag.update = 1;
- }
- p->flag.type = 1;
-
- if(n->vars->put(n->vars, DB->i642key(num), DB->ptr2data(p), &prev)) {
- p = DB->data2ptr(&prev);
- ers_free(pc->num_reg_ers, p);
+ for (struct map_session_data *sd = dbi_first(iter); dbi_exists(iter); sd = dbi_next(iter)) {
+ if (sd != NULL && n == &sd->regs) {
+ pc->setregistry(sd, num, val);
+ break;
}
}
+ dbi_destroy(iter);
}
static void set_reg_npcscope_num(struct script_state *st, struct reg_db *n, int64 num, const char *name, int val)
@@ -12335,7 +12268,9 @@ static BUILDIN(sc_end)
}
//This should help status_change_end force disabling the SC in case it has no limit.
- sce->val1 = sce->val2 = sce->val3 = sce->val4 = 0;
+ if (type != SC_BERSERK)
+ sce->val1 = 0; // SC_BERSERK requires skill_lv that's stored in sce->val1 when being removed [KirieZ]
+ sce->val2 = sce->val3 = sce->val4 = 0;
status_change_end(bl, (sc_type)type, INVALID_TIMER);
}
else
@@ -14480,6 +14415,9 @@ static BUILDIN(getiteminfo)
case ITEMINFO_VIEWSPRITE:
script_pushint(st, it->view_sprite);
break;
+ case ITEMINFO_TRADE:
+ script_pushint(st, it->flag.trade_restriction);
+ break;
default:
ShowError("buildin_getiteminfo: Invalid item type %d.\n", n);
script_pushint(st,-1);
@@ -14746,6 +14684,9 @@ static BUILDIN(setiteminfo)
case ITEMINFO_VIEWSPRITE:
it->view_sprite = value;
break;
+ case ITEMINFO_TRADE:
+ it->flag.trade_restriction = value;
+ break;
default:
ShowError("buildin_setiteminfo: invalid type %d.\n", n);
script_pushint(st,-1);
@@ -15428,6 +15369,50 @@ static BUILDIN(specialeffect2)
return true;
}
+static BUILDIN(removespecialeffect)
+{
+ struct block_list *bl = NULL;
+ int type = script_getnum(st, 2);
+ enum send_target target = AREA;
+
+ if (script_hasdata(st, 3)) {
+ target = script_getnum(st, 3);
+ }
+
+ if (script_hasdata(st, 4)) {
+ if (script_isstringtype(st, 4)) {
+ struct npc_data *nd = npc->name2id(script_getstr(st, 4));
+ if (nd != NULL) {
+ bl = &nd->bl;
+ }
+ } else {
+ bl = map->id2bl(script_getnum(st, 4));
+ }
+ } else {
+ bl = map->id2bl(st->oid);
+ }
+
+ if (bl == NULL) {
+ return true;
+ }
+
+ if (target == SELF) {
+ struct map_session_data *sd;
+ if (script_hasdata(st, 5)) {
+ sd = map->id2sd(script_getnum(st, 5));
+ } else {
+ sd = script->rid2sd(st);
+ }
+ if (sd != NULL) {
+ clif->removeSpecialEffect_single(bl, type, &sd->bl);
+ }
+ } else {
+ clif->removeSpecialEffect(bl, type, target);
+ }
+
+ return true;
+}
+
/*==========================================
* Nude [Valaris]
*------------------------------------------*/
@@ -17870,7 +17855,9 @@ static BUILDIN(getd)
id = script->add_variable(varname);
- if (script->str_data[id].type != C_NAME) {
+ if (script->str_data[id].type != C_NAME && // variable
+ script->str_data[id].type != C_PARAM && // param
+ script->str_data[id].type != C_INT) { // constant
ShowError("script:getd: `%s` is already used by something that is not a variable.\n", varname);
st->state = END;
return false;
@@ -20698,7 +20685,7 @@ static BUILDIN(getvariableofpc)
}
if (!sd->regs.vars)
- sd->regs.vars = i64db_alloc(DB_OPT_RELEASE_DATA);
+ sd->regs.vars = i64db_alloc(DB_OPT_BASE);
script->push_val(st->stack, C_NAME, reference_getuid(data), &sd->regs);
return true;
@@ -21190,6 +21177,17 @@ static BUILDIN(setquestinfo)
VECTOR_PUSH(qi->quest_requirement, quest_req);
break;
}
+ case QINFO_MERCENARY_CLASS:
+ {
+ int mer_class = script_getnum(st, 3);
+
+ if (!mercenary->class(mer_class)) {
+ ShowWarning("buildin_setquestinfo: invalid mercenary class given (%d).\n", mer_class);
+ return false;
+ }
+ qi->mercenary_class = mer_class;
+ break;
+ }
default:
ShowWarning("buildin_setquestinfo: invalid type given (%u).\n", type);
return false;
@@ -21343,18 +21341,7 @@ static BUILDIN(showevent)
}
}
-#if PACKETVER >= 20170315
- if (icon < 0 || (icon > 10 && icon != 9999))
- icon = 9999;
-#elif PACKETVER >= 20120410
- if (icon < 0 || (icon > 8 && icon != 9999) || icon == 7)
- icon = 9999; // Default to nothing if icon id is invalid.
-#else
- if (icon < 0 || icon > 7)
- icon = 0;
- else
- icon = icon + 1;
-#endif
+ icon = quest->questinfo_validate_icon(icon);
clif->quest_show_event(sd, &nd->bl, icon, color);
return true;
@@ -24803,6 +24790,42 @@ static BUILDIN(msgtable2)
return true;
}
+// show/hide camera info
+static BUILDIN(camerainfo)
+{
+ struct map_session_data *sd = script_rid2sd(st);
+ if (sd == NULL)
+ return false;
+
+ clif->camera_showWindow(sd);
+ return true;
+}
+
+// allow change some camera parameters
+static BUILDIN(changecamera)
+{
+ struct map_session_data *sd = script_rid2sd(st);
+ if (sd == NULL)
+ return false;
+
+ enum send_target target = SELF;
+ if (script_hasdata(st, 5)) {
+ target = script_getnum(st, 5);
+ }
+ clif->camera_change(sd, (float)script_getnum(st, 2), (float)script_getnum(st, 3), (float)script_getnum(st, 4), target);
+ return true;
+}
+
+// update preview window to given item
+static BUILDIN(itempreview)
+{
+ struct map_session_data *sd = script_rid2sd(st);
+ if (sd == NULL)
+ return false;
+ clif->item_preview(sd, script_getnum(st, 2));
+ return true;
+}
+
/**
* Adds a built-in script function.
*
@@ -25199,6 +25222,7 @@ static void script_parse_builtin(void)
BUILDIN_DEF(skilleffect,"vi"), // skill effect [Celest]
BUILDIN_DEF(npcskilleffect,"viii"), // npc skill effect [Valaris]
BUILDIN_DEF(specialeffect,"i???"), // npc skill effect [Valaris]
+ BUILDIN_DEF(removespecialeffect,"i???"),
BUILDIN_DEF_DEPRECATED(specialeffect2,"i??"), // skill effect on players[Valaris]
BUILDIN_DEF(nude,""), // nude command [Valaris]
BUILDIN_DEF(mapwarp,"ssii??"), // Added by RoVeRT
@@ -25532,6 +25556,12 @@ static void script_parse_builtin(void)
// -- HatEffect
BUILDIN_DEF(hateffect, "ii"),
+
+ // camera
+ BUILDIN_DEF(camerainfo, ""),
+ BUILDIN_DEF(changecamera, "iii?"),
+
+ BUILDIN_DEF(itempreview, "i"),
};
int i, len = ARRAYLENGTH(BUILDIN);
RECREATE(script->buildin, char *, script->buildin_count + len); // Pre-alloc to speed up
@@ -25847,6 +25877,7 @@ static void script_hardcoded_constants(void)
script->set_constant("ITEMINFO_VIEWID", ITEMINFO_VIEWID, false, false);
script->set_constant("ITEMINFO_MATK", ITEMINFO_MATK, false, false);
script->set_constant("ITEMINFO_VIEWSPRITE", ITEMINFO_VIEWSPRITE, false, false);
+ script->set_constant("ITEMINFO_TRADE", ITEMINFO_TRADE, false, false);
script->constdb_comment("monster skill states");
script->set_constant("MSS_ANY", MSS_ANY, false, false);
@@ -25930,6 +25961,7 @@ static void script_hardcoded_constants(void)
script->set_constant("QINFO_HOMUN_LEVEL", QINFO_HOMUN_LEVEL, false, false);
script->set_constant("QINFO_HOMUN_TYPE", QINFO_HOMUN_TYPE, false, false);
script->set_constant("QINFO_QUEST", QINFO_QUEST, false, false);
+ script->set_constant("QINFO_MERCENARY_CLASS", QINFO_MERCENARY_CLASS, false, false);
script->constdb_comment("function types");
script->set_constant("FUNCTION_IS_COMMAND", FUNCTION_IS_COMMAND, false, false);
@@ -25937,6 +25969,20 @@ static void script_hardcoded_constants(void)
script->set_constant("FUNCTION_IS_LOCAL", FUNCTION_IS_LOCAL, false, false);
script->set_constant("FUNCTION_IS_LABEL", FUNCTION_IS_LABEL, false, false);
+ script->constdb_comment("item trade restrictions");
+ script->set_constant("ITR_NONE", ITR_NONE, false, false);
+ script->set_constant("ITR_NODROP", ITR_NODROP, false, false);
+ script->set_constant("ITR_NOTRADE", ITR_NOTRADE, false, false);
+ script->set_constant("ITR_PARTNEROVERRIDE", ITR_PARTNEROVERRIDE, false, false);
+ script->set_constant("ITR_NOSELLTONPC", ITR_NOSELLTONPC, false, false);
+ script->set_constant("ITR_NOCART", ITR_NOCART, false, false);
+ script->set_constant("ITR_NOSTORAGE", ITR_NOSTORAGE, false, false);
+ script->set_constant("ITR_NOGSTORAGE", ITR_NOGSTORAGE, false, false);
+ script->set_constant("ITR_NOMAIL", ITR_NOMAIL, false, false);
+ script->set_constant("ITR_NOAUCTION", ITR_NOAUCTION, false, false);
+ script->set_constant("ITR_ALL", ITR_ALL, false, false);
+
+
script->constdb_comment("Renewal");
#ifdef RENEWAL
script->set_constant("RENEWAL", 1, false, false);
diff --git a/src/map/script.h b/src/map/script.h
index 9c72b793c..72210b05b 100644
--- a/src/map/script.h
+++ b/src/map/script.h
@@ -450,6 +450,7 @@ enum script_iteminfo_types {
ITEMINFO_VIEWID,
ITEMINFO_MATK,
ITEMINFO_VIEWSPRITE,
+ ITEMINFO_TRADE,
ITEMINFO_MAX
};
diff --git a/src/map/skill.c b/src/map/skill.c
index 4eaab5457..9857badbe 100644
--- a/src/map/skill.c
+++ b/src/map/skill.c
@@ -4138,7 +4138,7 @@ static int skill_activate_reverberation(struct block_list *bl, va_list ap)
if( su->alive && (sg = su->group) != NULL && sg->skill_id == WM_REVERBERATION && sg->unit_id == UNT_REVERBERATION ) {
int64 tick = timer->gettick();
clif->changetraplook(bl,UNT_USED_TRAPS);
- map->foreachinrange(skill->trap_splash, bl, skill->get_splash(sg->skill_id, sg->skill_lv), sg->bl_flag, bl, tick);
+ skill->trap_do_splash(bl, sg->skill_id, sg->skill_lv, sg->bl_flag, tick);
su->limit = DIFF_TICK32(tick,sg->tick)+1500;
sg->unit_id = UNT_USED_TRAPS;
}
@@ -12644,7 +12644,7 @@ static int skill_unit_onplace(struct skill_unit *src, struct block_list *bl, int
if (sg->src_id == bl->id)
break; //Does not affect the caster.
clif->changetraplook(&src->bl,UNT_USED_TRAPS);
- map->foreachinrange(skill->trap_splash,&src->bl, skill->get_splash(sg->skill_id, sg->skill_lv), sg->bl_flag, &src->bl,tick);
+ skill->trap_do_splash(&src->bl, sg->skill_id, sg->skill_lv, sg->bl_flag, tick);
sg->unit_id = UNT_USED_TRAPS;
sg->limit = DIFF_TICK32(tick,sg->tick) + 1500;
break;
@@ -12938,7 +12938,7 @@ static int skill_unit_onplace_timer(struct skill_unit *src, struct block_list *b
}
- map->foreachinrange(skill->trap_splash, &src->bl, skill->get_splash(sg->skill_id, sg->skill_lv), sg->bl_flag, &src->bl, tick);
+ skill->trap_do_splash(&src->bl, sg->skill_id, sg->skill_lv, sg->bl_flag, tick);
sg->unit_id = UNT_USED_TRAPS; //Changed ID so it does not invoke a for each in area again.
}
break;
@@ -12969,10 +12969,10 @@ static int skill_unit_onplace_timer(struct skill_unit *src, struct block_list *b
case UNT_FREEZINGTRAP:
case UNT_FIREPILLAR_ACTIVE:
case UNT_CLAYMORETRAP:
- if( sg->unit_id == UNT_FIRINGTRAP || sg->unit_id == UNT_ICEBOUNDTRAP || sg->unit_id == UNT_CLAYMORETRAP )
- map->foreachinrange(skill->trap_splash,&src->bl, skill->get_splash(sg->skill_id, sg->skill_lv), sg->bl_flag|BL_SKILL|~BCT_SELF, &src->bl,tick);
+ if (sg->unit_id == UNT_FIRINGTRAP || sg->unit_id == UNT_ICEBOUNDTRAP || sg->unit_id == UNT_CLAYMORETRAP)
+ skill->trap_do_splash(&src->bl, sg->skill_id, sg->skill_lv, sg->bl_flag | BL_SKILL | ~BCT_SELF, tick);
else
- map->foreachinrange(skill->trap_splash,&src->bl, skill->get_splash(sg->skill_id, sg->skill_lv), sg->bl_flag, &src->bl,tick);
+ skill->trap_do_splash(&src->bl, sg->skill_id, sg->skill_lv, sg->bl_flag, tick);
if (sg->unit_id != UNT_FIREPILLAR_ACTIVE)
clif->changetraplook(&src->bl, sg->unit_id==UNT_LANDMINE?UNT_FIREPILLAR_ACTIVE:UNT_USED_TRAPS);
sg->limit=DIFF_TICK32(tick,sg->tick)+1500 +
@@ -13203,9 +13203,7 @@ static int skill_unit_onplace_timer(struct skill_unit *src, struct block_list *b
case UNT_GROUNDDRIFT_POISON:
case UNT_GROUNDDRIFT_WATER:
case UNT_GROUNDDRIFT_FIRE:
- map->foreachinrange(skill->trap_splash,&src->bl,
- skill->get_splash(sg->skill_id, sg->skill_lv), sg->bl_flag,
- &src->bl,tick);
+ skill->trap_do_splash(&src->bl, sg->skill_id, sg->skill_lv, sg->bl_flag, tick);
sg->unit_id = UNT_USED_TRAPS;
//clif->changetraplook(&src->bl, UNT_FIREPILLAR_ACTIVE);
sg->limit=DIFF_TICK32(tick,sg->tick)+1500;
@@ -13266,7 +13264,7 @@ static int skill_unit_onplace_timer(struct skill_unit *src, struct block_list *b
case UNT_REVERBERATION:
clif->changetraplook(&src->bl,UNT_USED_TRAPS);
- map->foreachinrange(skill->trap_splash,&src->bl, skill->get_splash(sg->skill_id, sg->skill_lv), sg->bl_flag, &src->bl,tick);
+ skill->trap_do_splash(&src->bl, sg->skill_id, sg->skill_lv, sg->bl_flag, tick);
sg->limit = DIFF_TICK32(tick,sg->tick)+1500;
sg->unit_id = UNT_USED_TRAPS;
break;
@@ -16630,10 +16628,10 @@ static int skill_detonator(struct block_list *bl, va_list ap)
case UNT_CLAYMORETRAP:
case UNT_FIRINGTRAP:
case UNT_ICEBOUNDTRAP:
- map->foreachinrange(skill->trap_splash,bl,skill->get_splash(su->group->skill_id,su->group->skill_lv),su->group->bl_flag|BL_SKILL|~BCT_SELF,bl,su->group->tick);
+ skill->trap_do_splash(bl, su->group->skill_id, su->group->skill_lv, su->group->bl_flag | BL_SKILL | ~BCT_SELF, su->group->tick);
break;
default:
- map->foreachinrange(skill->trap_splash,bl,skill->get_splash(su->group->skill_id,su->group->skill_lv),su->group->bl_flag,bl,su->group->tick);
+ skill->trap_do_splash(bl, su->group->skill_id, su->group->skill_lv, su->group->bl_flag, su->group->tick);
}
clif->changetraplook(bl, UNT_USED_TRAPS);
su->group->limit = DIFF_TICK32(timer->gettick(),su->group->tick) +
@@ -16766,6 +16764,27 @@ static int skill_chastle_mob_changetarget(struct block_list *bl, va_list ap)
return 0;
}
+/**
+ * Does final adjustments (e.g. count enemies affected by splash) then runs trap splash function (skill_trap_splash).
+ *
+ * @param bl : trap skill unit's bl
+ * @param skill_id : Trap Skill ID
+ * @param skill_lv : Trap Skill Level
+ * @param bl_flag : Flag representing units affected by this trap
+ * @param tick : tick related to this trap
+ */
+static void skill_trap_do_splash(struct block_list *bl, uint16 skill_id, uint16 skill_lv, int bl_flag, int64 tick)
+{
+ int enemy_count = 0;
+
+ if (skill->get_nk(skill_id) & NK_SPLASHSPLIT) {
+ enemy_count = map->foreachinrange(skill->area_sub, bl, skill->get_splash(skill_id, skill_lv), BL_CHAR, bl, skill_id, skill_lv, tick, BCT_ENEMY, skill->area_sub_count);
+ enemy_count = max(1, enemy_count); // Don't let enemy_count be 0 when spliting trap damage
+ }
+
+ map->foreachinrange(skill->trap_splash, bl, skill->get_splash(skill_id, skill_lv), bl_flag, bl, tick, enemy_count);
+}
+
/*==========================================
*
*------------------------------------------*/
@@ -16776,6 +16795,7 @@ static int skill_trap_splash(struct block_list *bl, va_list ap)
struct skill_unit *src_su = NULL;
struct skill_unit_group *sg;
struct block_list *ss;
+ int enemy_count = va_arg(ap, int);
nullpo_ret(bl);
nullpo_ret(src);
@@ -16870,7 +16890,7 @@ static int skill_trap_splash(struct block_list *bl, va_list ap)
}
/* Fall through */
default:
- skill->attack(skill->get_type(sg->skill_id),ss,src,bl,sg->skill_id,sg->skill_lv,tick,0);
+ skill->attack(skill->get_type(sg->skill_id), ss, src, bl, sg->skill_id, sg->skill_lv, tick, enemy_count);
break;
}
return 1;
@@ -17585,7 +17605,7 @@ static int skill_unit_timer_sub(union DBKey key, struct DBData *data, va_list ap
break;
}
clif->changetraplook(bl,UNT_USED_TRAPS);
- map->foreachinrange(skill->trap_splash, bl, skill->get_splash(group->skill_id, group->skill_lv), group->bl_flag, bl, tick);
+ skill->trap_do_splash(bl, group->skill_id, group->skill_lv, group->bl_flag, tick);
group->limit = DIFF_TICK32(tick,group->tick)+1500;
su->limit = DIFF_TICK32(tick,group->tick)+1500;
group->unit_id = UNT_USED_TRAPS;
@@ -18973,7 +18993,7 @@ static int skill_destroy_trap(struct block_list *bl, va_list ap)
case UNT_CLAYMORETRAP:
case UNT_FIRINGTRAP:
case UNT_ICEBOUNDTRAP:
- map->foreachinrange(skill->trap_splash,&su->bl, skill->get_splash(sg->skill_id, sg->skill_lv), sg->bl_flag|BL_SKILL|~BCT_SELF, &su->bl,tick);
+ skill->trap_do_splash(&su->bl, sg->skill_id, sg->skill_lv, sg->bl_flag | BL_SKILL | ~BCT_SELF, tick);
break;
case UNT_LANDMINE:
case UNT_BLASTMINE:
@@ -18982,7 +19002,7 @@ static int skill_destroy_trap(struct block_list *bl, va_list ap)
case UNT_FLASHER:
case UNT_FREEZINGTRAP:
case UNT_CLUSTERBOMB:
- map->foreachinrange(skill->trap_splash,&su->bl, skill->get_splash(sg->skill_id, sg->skill_lv), sg->bl_flag, &su->bl,tick);
+ skill->trap_do_splash(&su->bl, sg->skill_id, sg->skill_lv, sg->bl_flag, tick);
break;
}
// Traps aren't recovered.
@@ -21578,6 +21598,7 @@ void skill_defaults(void)
skill->onskillusage = skill_onskillusage;
skill->cell_overlap = skill_cell_overlap;
skill->timerskill = skill_timerskill;
+ skill->trap_do_splash = skill_trap_do_splash;
skill->trap_splash = skill_trap_splash;
skill->check_condition_mercenary = skill_check_condition_mercenary;
skill->locate_element_field = skill_locate_element_field;
diff --git a/src/map/skill.h b/src/map/skill.h
index 97134224e..0ace19927 100644
--- a/src/map/skill.h
+++ b/src/map/skill.h
@@ -2059,6 +2059,7 @@ struct skill_interface {
int (*onskillusage) (struct map_session_data *sd, struct block_list *bl, uint16 skill_id, int64 tick);
int (*cell_overlap) (struct block_list *bl, va_list ap);
int (*timerskill) (int tid, int64 tick, int id, intptr_t data);
+ void (*trap_do_splash) (struct block_list *bl, uint16 skill_id, uint16 skill_lv, int bl_flag, int64 tick);
int (*trap_splash) (struct block_list *bl, va_list ap);
int (*check_condition_mercenary) (struct block_list *bl, int skill_id, int lv, int type);
struct skill_unit_group *(*locate_element_field) (struct block_list *bl);
diff --git a/src/plugins/HPMHooking/HPMHooking.Defs.inc b/src/plugins/HPMHooking/HPMHooking.Defs.inc
index f80dc9003..c60946baf 100644
--- a/src/plugins/HPMHooking/HPMHooking.Defs.inc
+++ b/src/plugins/HPMHooking/HPMHooking.Defs.inc
@@ -176,8 +176,12 @@ typedef void (*HPMHOOK_pre_achievement_init_titles) (struct map_session_data **s
typedef void (*HPMHOOK_post_achievement_init_titles) (struct map_session_data *sd);
typedef bool (*HPMHOOK_pre_achievement_check_title) (struct map_session_data **sd, int *title_id);
typedef bool (*HPMHOOK_post_achievement_check_title) (bool retVal___, struct map_session_data *sd, int title_id);
-typedef void (*HPMHOOK_pre_achievement_get_rewards) (struct map_session_data **sd, const struct achievement_data **ad);
-typedef void (*HPMHOOK_post_achievement_get_rewards) (struct map_session_data *sd, const struct achievement_data *ad);
+typedef bool (*HPMHOOK_pre_achievement_get_rewards) (struct map_session_data **sd, const struct achievement_data **ad);
+typedef bool (*HPMHOOK_post_achievement_get_rewards) (bool retVal___, struct map_session_data *sd, const struct achievement_data *ad);
+typedef void (*HPMHOOK_pre_achievement_get_rewards_buffs) (struct map_session_data **sd, const struct achievement_data **ad);
+typedef void (*HPMHOOK_post_achievement_get_rewards_buffs) (struct map_session_data *sd, const struct achievement_data *ad);
+typedef void (*HPMHOOK_pre_achievement_get_rewards_items) (struct map_session_data **sd, const struct achievement_data **ad);
+typedef void (*HPMHOOK_post_achievement_get_rewards_items) (struct map_session_data *sd, const struct achievement_data *ad);
#endif // MAP_ACHIEVEMENT_H
#ifdef MAP_ATCOMMAND_H /* atcommand */
typedef void (*HPMHOOK_pre_atcommand_init) (bool *minimal);
@@ -278,6 +282,8 @@ typedef void (*HPMHOOK_pre_battle_drain) (struct map_session_data **sd, struct b
typedef void (*HPMHOOK_post_battle_drain) (struct map_session_data *sd, struct block_list *tbl, int64 rdamage, int64 ldamage, int race, int boss);
typedef void (*HPMHOOK_pre_battle_reflect_damage) (struct block_list **target, struct block_list **src, struct Damage **wd, uint16 *skill_id);
typedef void (*HPMHOOK_post_battle_reflect_damage) (struct block_list *target, struct block_list *src, struct Damage *wd, uint16 skill_id);
+typedef void (*HPMHOOK_pre_battle_reflect_trap) (struct block_list **target, struct block_list **src, struct Damage **md, uint16 *skill_id);
+typedef void (*HPMHOOK_post_battle_reflect_trap) (struct block_list *target, struct block_list *src, struct Damage *md, uint16 skill_id);
typedef int (*HPMHOOK_pre_battle_attr_ratio) (int *atk_elem, int *def_type, int *def_lv);
typedef int (*HPMHOOK_post_battle_attr_ratio) (int retVal___, int atk_elem, int def_type, int def_lv);
typedef int64 (*HPMHOOK_pre_battle_attr_fix) (struct block_list **src, struct block_list **target, int64 *damage, int *atk_elem, int *def_type, int *def_lv);
@@ -1512,6 +1518,10 @@ typedef void (*HPMHOOK_pre_clif_specialeffect_single) (struct block_list **bl, i
typedef void (*HPMHOOK_post_clif_specialeffect_single) (struct block_list *bl, int type, int fd);
typedef void (*HPMHOOK_pre_clif_specialeffect_value) (struct block_list **bl, int *effect_id, int *num, send_target *target);
typedef void (*HPMHOOK_post_clif_specialeffect_value) (struct block_list *bl, int effect_id, int num, send_target target);
+typedef void (*HPMHOOK_pre_clif_removeSpecialEffect) (struct block_list **bl, int *effectId, enum send_target *target);
+typedef void (*HPMHOOK_post_clif_removeSpecialEffect) (struct block_list *bl, int effectId, enum send_target target);
+typedef void (*HPMHOOK_pre_clif_removeSpecialEffect_single) (struct block_list **bl, int *effectId, struct block_list **targetBl);
+typedef void (*HPMHOOK_post_clif_removeSpecialEffect_single) (struct block_list *bl, int effectId, struct block_list *targetBl);
typedef void (*HPMHOOK_pre_clif_millenniumshield) (struct block_list **bl, short *shields);
typedef void (*HPMHOOK_post_clif_millenniumshield) (struct block_list *bl, short shields);
typedef void (*HPMHOOK_pre_clif_spiritcharm) (struct map_session_data **sd);
@@ -2616,6 +2626,10 @@ typedef void (*HPMHOOK_pre_clif_party_dead_notification) (struct map_session_dat
typedef void (*HPMHOOK_post_clif_party_dead_notification) (struct map_session_data *sd);
typedef void (*HPMHOOK_pre_clif_pMemorialDungeonCommand) (int *fd, struct map_session_data **sd);
typedef void (*HPMHOOK_post_clif_pMemorialDungeonCommand) (int fd, struct map_session_data *sd);
+typedef void (*HPMHOOK_pre_clif_camera_showWindow) (struct map_session_data **sd);
+typedef void (*HPMHOOK_post_clif_camera_showWindow) (struct map_session_data *sd);
+typedef void (*HPMHOOK_pre_clif_camera_change) (struct map_session_data **sd, float *range, float *rotation, float *latitude, enum send_target *target);
+typedef void (*HPMHOOK_post_clif_camera_change) (struct map_session_data *sd, float range, float rotation, float latitude, enum send_target target);
#endif // MAP_CLIF_H
#ifdef COMMON_CORE_H /* cmdline */
typedef void (*HPMHOOK_pre_cmdline_init) (void);
@@ -5872,8 +5886,8 @@ typedef int (*HPMHOOK_pre_pc_search_inventory) (struct map_session_data **sd, in
typedef int (*HPMHOOK_post_pc_search_inventory) (int retVal___, struct map_session_data *sd, int item_id);
typedef int (*HPMHOOK_pre_pc_payzeny) (struct map_session_data **sd, int *zeny, enum e_log_pick_type *type, struct map_session_data **tsd);
typedef int (*HPMHOOK_post_pc_payzeny) (int retVal___, struct map_session_data *sd, int zeny, enum e_log_pick_type type, struct map_session_data *tsd);
-typedef int (*HPMHOOK_pre_pc_additem) (struct map_session_data **sd, struct item **item_data, int *amount, e_log_pick_type *log_type);
-typedef int (*HPMHOOK_post_pc_additem) (int retVal___, struct map_session_data *sd, struct item *item_data, int amount, e_log_pick_type log_type);
+typedef int (*HPMHOOK_pre_pc_additem) (struct map_session_data **sd, const struct item **item_data, int *amount, e_log_pick_type *log_type);
+typedef int (*HPMHOOK_post_pc_additem) (int retVal___, struct map_session_data *sd, const struct item *item_data, int amount, e_log_pick_type log_type);
typedef int (*HPMHOOK_pre_pc_getzeny) (struct map_session_data **sd, int *zeny, enum e_log_pick_type *type, struct map_session_data **tsd);
typedef int (*HPMHOOK_post_pc_getzeny) (int retVal___, struct map_session_data *sd, int zeny, enum e_log_pick_type type, struct map_session_data *tsd);
typedef int (*HPMHOOK_pre_pc_delitem) (struct map_session_data **sd, int *n, int *amount, int *type, short *reason, e_log_pick_type *log_type);
@@ -7186,6 +7200,8 @@ typedef int (*HPMHOOK_pre_skill_cell_overlap) (struct block_list **bl, va_list a
typedef int (*HPMHOOK_post_skill_cell_overlap) (int retVal___, struct block_list *bl, va_list ap);
typedef int (*HPMHOOK_pre_skill_timerskill) (int *tid, int64 *tick, int *id, intptr_t *data);
typedef int (*HPMHOOK_post_skill_timerskill) (int retVal___, int tid, int64 tick, int id, intptr_t data);
+typedef void (*HPMHOOK_pre_skill_trap_do_splash) (struct block_list **bl, uint16 *skill_id, uint16 *skill_lv, int *bl_flag, int64 *tick);
+typedef void (*HPMHOOK_post_skill_trap_do_splash) (struct block_list *bl, uint16 skill_id, uint16 skill_lv, int bl_flag, int64 tick);
typedef int (*HPMHOOK_pre_skill_trap_splash) (struct block_list **bl, va_list ap);
typedef int (*HPMHOOK_post_skill_trap_splash) (int retVal___, struct block_list *bl, va_list ap);
typedef int (*HPMHOOK_pre_skill_check_condition_mercenary) (struct block_list **bl, int *skill_id, int *lv, int *type);
diff --git a/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc b/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc
index 8762975e1..2a2290d6f 100644
--- a/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc
+++ b/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc
@@ -136,6 +136,10 @@ struct {
struct HPMHookPoint *HP_achievement_check_title_post;
struct HPMHookPoint *HP_achievement_get_rewards_pre;
struct HPMHookPoint *HP_achievement_get_rewards_post;
+ struct HPMHookPoint *HP_achievement_get_rewards_buffs_pre;
+ struct HPMHookPoint *HP_achievement_get_rewards_buffs_post;
+ struct HPMHookPoint *HP_achievement_get_rewards_items_pre;
+ struct HPMHookPoint *HP_achievement_get_rewards_items_post;
struct HPMHookPoint *HP_atcommand_init_pre;
struct HPMHookPoint *HP_atcommand_init_post;
struct HPMHookPoint *HP_atcommand_final_pre;
@@ -232,6 +236,8 @@ struct {
struct HPMHookPoint *HP_battle_drain_post;
struct HPMHookPoint *HP_battle_reflect_damage_pre;
struct HPMHookPoint *HP_battle_reflect_damage_post;
+ struct HPMHookPoint *HP_battle_reflect_trap_pre;
+ struct HPMHookPoint *HP_battle_reflect_trap_post;
struct HPMHookPoint *HP_battle_attr_ratio_pre;
struct HPMHookPoint *HP_battle_attr_ratio_post;
struct HPMHookPoint *HP_battle_attr_fix_pre;
@@ -1104,6 +1110,10 @@ struct {
struct HPMHookPoint *HP_clif_specialeffect_single_post;
struct HPMHookPoint *HP_clif_specialeffect_value_pre;
struct HPMHookPoint *HP_clif_specialeffect_value_post;
+ struct HPMHookPoint *HP_clif_removeSpecialEffect_pre;
+ struct HPMHookPoint *HP_clif_removeSpecialEffect_post;
+ struct HPMHookPoint *HP_clif_removeSpecialEffect_single_pre;
+ struct HPMHookPoint *HP_clif_removeSpecialEffect_single_post;
struct HPMHookPoint *HP_clif_millenniumshield_pre;
struct HPMHookPoint *HP_clif_millenniumshield_post;
struct HPMHookPoint *HP_clif_spiritcharm_pre;
@@ -2208,6 +2218,10 @@ struct {
struct HPMHookPoint *HP_clif_party_dead_notification_post;
struct HPMHookPoint *HP_clif_pMemorialDungeonCommand_pre;
struct HPMHookPoint *HP_clif_pMemorialDungeonCommand_post;
+ struct HPMHookPoint *HP_clif_camera_showWindow_pre;
+ struct HPMHookPoint *HP_clif_camera_showWindow_post;
+ struct HPMHookPoint *HP_clif_camera_change_pre;
+ struct HPMHookPoint *HP_clif_camera_change_post;
struct HPMHookPoint *HP_cmdline_init_pre;
struct HPMHookPoint *HP_cmdline_init_post;
struct HPMHookPoint *HP_cmdline_final_pre;
@@ -5702,6 +5716,8 @@ struct {
struct HPMHookPoint *HP_skill_cell_overlap_post;
struct HPMHookPoint *HP_skill_timerskill_pre;
struct HPMHookPoint *HP_skill_timerskill_post;
+ struct HPMHookPoint *HP_skill_trap_do_splash_pre;
+ struct HPMHookPoint *HP_skill_trap_do_splash_post;
struct HPMHookPoint *HP_skill_trap_splash_pre;
struct HPMHookPoint *HP_skill_trap_splash_post;
struct HPMHookPoint *HP_skill_check_condition_mercenary_pre;
@@ -6719,6 +6735,10 @@ struct {
int HP_achievement_check_title_post;
int HP_achievement_get_rewards_pre;
int HP_achievement_get_rewards_post;
+ int HP_achievement_get_rewards_buffs_pre;
+ int HP_achievement_get_rewards_buffs_post;
+ int HP_achievement_get_rewards_items_pre;
+ int HP_achievement_get_rewards_items_post;
int HP_atcommand_init_pre;
int HP_atcommand_init_post;
int HP_atcommand_final_pre;
@@ -6815,6 +6835,8 @@ struct {
int HP_battle_drain_post;
int HP_battle_reflect_damage_pre;
int HP_battle_reflect_damage_post;
+ int HP_battle_reflect_trap_pre;
+ int HP_battle_reflect_trap_post;
int HP_battle_attr_ratio_pre;
int HP_battle_attr_ratio_post;
int HP_battle_attr_fix_pre;
@@ -7687,6 +7709,10 @@ struct {
int HP_clif_specialeffect_single_post;
int HP_clif_specialeffect_value_pre;
int HP_clif_specialeffect_value_post;
+ int HP_clif_removeSpecialEffect_pre;
+ int HP_clif_removeSpecialEffect_post;
+ int HP_clif_removeSpecialEffect_single_pre;
+ int HP_clif_removeSpecialEffect_single_post;
int HP_clif_millenniumshield_pre;
int HP_clif_millenniumshield_post;
int HP_clif_spiritcharm_pre;
@@ -8791,6 +8817,10 @@ struct {
int HP_clif_party_dead_notification_post;
int HP_clif_pMemorialDungeonCommand_pre;
int HP_clif_pMemorialDungeonCommand_post;
+ int HP_clif_camera_showWindow_pre;
+ int HP_clif_camera_showWindow_post;
+ int HP_clif_camera_change_pre;
+ int HP_clif_camera_change_post;
int HP_cmdline_init_pre;
int HP_cmdline_init_post;
int HP_cmdline_final_pre;
@@ -12285,6 +12315,8 @@ struct {
int HP_skill_cell_overlap_post;
int HP_skill_timerskill_pre;
int HP_skill_timerskill_post;
+ int HP_skill_trap_do_splash_pre;
+ int HP_skill_trap_do_splash_post;
int HP_skill_trap_splash_pre;
int HP_skill_trap_splash_post;
int HP_skill_check_condition_mercenary_pre;
diff --git a/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc b/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc
index 2f3f1840f..051e6fbe2 100644
--- a/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc
+++ b/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc
@@ -83,6 +83,8 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(achievement->init_titles, HP_achievement_init_titles) },
{ HP_POP(achievement->check_title, HP_achievement_check_title) },
{ HP_POP(achievement->get_rewards, HP_achievement_get_rewards) },
+ { HP_POP(achievement->get_rewards_buffs, HP_achievement_get_rewards_buffs) },
+ { HP_POP(achievement->get_rewards_items, HP_achievement_get_rewards_items) },
/* atcommand_interface */
{ HP_POP(atcommand->init, HP_atcommand_init) },
{ HP_POP(atcommand->final, HP_atcommand_final) },
@@ -133,6 +135,7 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(battle->delay_damage, HP_battle_delay_damage) },
{ HP_POP(battle->drain, HP_battle_drain) },
{ HP_POP(battle->reflect_damage, HP_battle_reflect_damage) },
+ { HP_POP(battle->reflect_trap, HP_battle_reflect_trap) },
{ HP_POP(battle->attr_ratio, HP_battle_attr_ratio) },
{ HP_POP(battle->attr_fix, HP_battle_attr_fix) },
{ HP_POP(battle->calc_cardfix, HP_battle_calc_cardfix) },
@@ -576,6 +579,8 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(clif->specialeffect, HP_clif_specialeffect) },
{ HP_POP(clif->specialeffect_single, HP_clif_specialeffect_single) },
{ HP_POP(clif->specialeffect_value, HP_clif_specialeffect_value) },
+ { HP_POP(clif->removeSpecialEffect, HP_clif_removeSpecialEffect) },
+ { HP_POP(clif->removeSpecialEffect_single, HP_clif_removeSpecialEffect_single) },
{ HP_POP(clif->millenniumshield, HP_clif_millenniumshield) },
{ HP_POP(clif->spiritcharm, HP_clif_spiritcharm) },
{ HP_POP(clif->charm_single, HP_clif_charm_single) },
@@ -1128,6 +1133,8 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(clif->petEvolutionResult, HP_clif_petEvolutionResult) },
{ HP_POP(clif->party_dead_notification, HP_clif_party_dead_notification) },
{ HP_POP(clif->pMemorialDungeonCommand, HP_clif_pMemorialDungeonCommand) },
+ { HP_POP(clif->camera_showWindow, HP_clif_camera_showWindow) },
+ { HP_POP(clif->camera_change, HP_clif_camera_change) },
/* cmdline_interface */
{ HP_POP(cmdline->init, HP_cmdline_init) },
{ HP_POP(cmdline->final, HP_cmdline_final) },
@@ -2917,6 +2924,7 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(skill->onskillusage, HP_skill_onskillusage) },
{ HP_POP(skill->cell_overlap, HP_skill_cell_overlap) },
{ HP_POP(skill->timerskill, HP_skill_timerskill) },
+ { HP_POP(skill->trap_do_splash, HP_skill_trap_do_splash) },
{ HP_POP(skill->trap_splash, HP_skill_trap_splash) },
{ HP_POP(skill->check_condition_mercenary, HP_skill_check_condition_mercenary) },
{ HP_POP(skill->locate_element_field, HP_skill_locate_element_field) },
diff --git a/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc b/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc
index 860e47f1b..b177c12c0 100644
--- a/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc
+++ b/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc
@@ -1459,27 +1459,80 @@ bool HP_achievement_check_title(struct map_session_data *sd, int title_id) {
}
return retVal___;
}
-void HP_achievement_get_rewards(struct map_session_data *sd, const struct achievement_data *ad) {
+bool HP_achievement_get_rewards(struct map_session_data *sd, const struct achievement_data *ad) {
int hIndex = 0;
+ bool retVal___ = false;
if (HPMHooks.count.HP_achievement_get_rewards_pre > 0) {
- void (*preHookFunc) (struct map_session_data **sd, const struct achievement_data **ad);
+ bool (*preHookFunc) (struct map_session_data **sd, const struct achievement_data **ad);
*HPMforce_return = false;
for (hIndex = 0; hIndex < HPMHooks.count.HP_achievement_get_rewards_pre; hIndex++) {
preHookFunc = HPMHooks.list.HP_achievement_get_rewards_pre[hIndex].func;
- preHookFunc(&sd, &ad);
+ retVal___ = preHookFunc(&sd, &ad);
}
if (*HPMforce_return) {
*HPMforce_return = false;
- return;
+ return retVal___;
}
}
{
- HPMHooks.source.achievement.get_rewards(sd, ad);
+ retVal___ = HPMHooks.source.achievement.get_rewards(sd, ad);
}
if (HPMHooks.count.HP_achievement_get_rewards_post > 0) {
- void (*postHookFunc) (struct map_session_data *sd, const struct achievement_data *ad);
+ bool (*postHookFunc) (bool retVal___, struct map_session_data *sd, const struct achievement_data *ad);
for (hIndex = 0; hIndex < HPMHooks.count.HP_achievement_get_rewards_post; hIndex++) {
postHookFunc = HPMHooks.list.HP_achievement_get_rewards_post[hIndex].func;
+ retVal___ = postHookFunc(retVal___, sd, ad);
+ }
+ }
+ return retVal___;
+}
+void HP_achievement_get_rewards_buffs(struct map_session_data *sd, const struct achievement_data *ad) {
+ int hIndex = 0;
+ if (HPMHooks.count.HP_achievement_get_rewards_buffs_pre > 0) {
+ void (*preHookFunc) (struct map_session_data **sd, const struct achievement_data **ad);
+ *HPMforce_return = false;
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_achievement_get_rewards_buffs_pre; hIndex++) {
+ preHookFunc = HPMHooks.list.HP_achievement_get_rewards_buffs_pre[hIndex].func;
+ preHookFunc(&sd, &ad);
+ }
+ if (*HPMforce_return) {
+ *HPMforce_return = false;
+ return;
+ }
+ }
+ {
+ HPMHooks.source.achievement.get_rewards_buffs(sd, ad);
+ }
+ if (HPMHooks.count.HP_achievement_get_rewards_buffs_post > 0) {
+ void (*postHookFunc) (struct map_session_data *sd, const struct achievement_data *ad);
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_achievement_get_rewards_buffs_post; hIndex++) {
+ postHookFunc = HPMHooks.list.HP_achievement_get_rewards_buffs_post[hIndex].func;
+ postHookFunc(sd, ad);
+ }
+ }
+ return;
+}
+void HP_achievement_get_rewards_items(struct map_session_data *sd, const struct achievement_data *ad) {
+ int hIndex = 0;
+ if (HPMHooks.count.HP_achievement_get_rewards_items_pre > 0) {
+ void (*preHookFunc) (struct map_session_data **sd, const struct achievement_data **ad);
+ *HPMforce_return = false;
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_achievement_get_rewards_items_pre; hIndex++) {
+ preHookFunc = HPMHooks.list.HP_achievement_get_rewards_items_pre[hIndex].func;
+ preHookFunc(&sd, &ad);
+ }
+ if (*HPMforce_return) {
+ *HPMforce_return = false;
+ return;
+ }
+ }
+ {
+ HPMHooks.source.achievement.get_rewards_items(sd, ad);
+ }
+ if (HPMHooks.count.HP_achievement_get_rewards_items_post > 0) {
+ void (*postHookFunc) (struct map_session_data *sd, const struct achievement_data *ad);
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_achievement_get_rewards_items_post; hIndex++) {
+ postHookFunc = HPMHooks.list.HP_achievement_get_rewards_items_post[hIndex].func;
postHookFunc(sd, ad);
}
}
@@ -2806,6 +2859,32 @@ void HP_battle_reflect_damage(struct block_list *target, struct block_list *src,
}
return;
}
+void HP_battle_reflect_trap(struct block_list *target, struct block_list *src, struct Damage *md, uint16 skill_id) {
+ int hIndex = 0;
+ if (HPMHooks.count.HP_battle_reflect_trap_pre > 0) {
+ void (*preHookFunc) (struct block_list **target, struct block_list **src, struct Damage **md, uint16 *skill_id);
+ *HPMforce_return = false;
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_battle_reflect_trap_pre; hIndex++) {
+ preHookFunc = HPMHooks.list.HP_battle_reflect_trap_pre[hIndex].func;
+ preHookFunc(&target, &src, &md, &skill_id);
+ }
+ if (*HPMforce_return) {
+ *HPMforce_return = false;
+ return;
+ }
+ }
+ {
+ HPMHooks.source.battle.reflect_trap(target, src, md, skill_id);
+ }
+ if (HPMHooks.count.HP_battle_reflect_trap_post > 0) {
+ void (*postHookFunc) (struct block_list *target, struct block_list *src, struct Damage *md, uint16 skill_id);
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_battle_reflect_trap_post; hIndex++) {
+ postHookFunc = HPMHooks.list.HP_battle_reflect_trap_post[hIndex].func;
+ postHookFunc(target, src, md, skill_id);
+ }
+ }
+ return;
+}
int HP_battle_attr_ratio(int atk_elem, int def_type, int def_lv) {
int hIndex = 0;
int retVal___ = 0;
@@ -14403,6 +14482,58 @@ void HP_clif_specialeffect_value(struct block_list *bl, int effect_id, int num,
}
return;
}
+void HP_clif_removeSpecialEffect(struct block_list *bl, int effectId, enum send_target target) {
+ int hIndex = 0;
+ if (HPMHooks.count.HP_clif_removeSpecialEffect_pre > 0) {
+ void (*preHookFunc) (struct block_list **bl, int *effectId, enum send_target *target);
+ *HPMforce_return = false;
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_removeSpecialEffect_pre; hIndex++) {
+ preHookFunc = HPMHooks.list.HP_clif_removeSpecialEffect_pre[hIndex].func;
+ preHookFunc(&bl, &effectId, &target);
+ }
+ if (*HPMforce_return) {
+ *HPMforce_return = false;
+ return;
+ }
+ }
+ {
+ HPMHooks.source.clif.removeSpecialEffect(bl, effectId, target);
+ }
+ if (HPMHooks.count.HP_clif_removeSpecialEffect_post > 0) {
+ void (*postHookFunc) (struct block_list *bl, int effectId, enum send_target target);
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_removeSpecialEffect_post; hIndex++) {
+ postHookFunc = HPMHooks.list.HP_clif_removeSpecialEffect_post[hIndex].func;
+ postHookFunc(bl, effectId, target);
+ }
+ }
+ return;
+}
+void HP_clif_removeSpecialEffect_single(struct block_list *bl, int effectId, struct block_list *targetBl) {
+ int hIndex = 0;
+ if (HPMHooks.count.HP_clif_removeSpecialEffect_single_pre > 0) {
+ void (*preHookFunc) (struct block_list **bl, int *effectId, struct block_list **targetBl);
+ *HPMforce_return = false;
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_removeSpecialEffect_single_pre; hIndex++) {
+ preHookFunc = HPMHooks.list.HP_clif_removeSpecialEffect_single_pre[hIndex].func;
+ preHookFunc(&bl, &effectId, &targetBl);
+ }
+ if (*HPMforce_return) {
+ *HPMforce_return = false;
+ return;
+ }
+ }
+ {
+ HPMHooks.source.clif.removeSpecialEffect_single(bl, effectId, targetBl);
+ }
+ if (HPMHooks.count.HP_clif_removeSpecialEffect_single_post > 0) {
+ void (*postHookFunc) (struct block_list *bl, int effectId, struct block_list *targetBl);
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_removeSpecialEffect_single_post; hIndex++) {
+ postHookFunc = HPMHooks.list.HP_clif_removeSpecialEffect_single_post[hIndex].func;
+ postHookFunc(bl, effectId, targetBl);
+ }
+ }
+ return;
+}
void HP_clif_millenniumshield(struct block_list *bl, short shields) {
int hIndex = 0;
if (HPMHooks.count.HP_clif_millenniumshield_pre > 0) {
@@ -28782,6 +28913,58 @@ void HP_clif_pMemorialDungeonCommand(int fd, struct map_session_data *sd) {
}
return;
}
+void HP_clif_camera_showWindow(struct map_session_data *sd) {
+ int hIndex = 0;
+ if (HPMHooks.count.HP_clif_camera_showWindow_pre > 0) {
+ void (*preHookFunc) (struct map_session_data **sd);
+ *HPMforce_return = false;
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_camera_showWindow_pre; hIndex++) {
+ preHookFunc = HPMHooks.list.HP_clif_camera_showWindow_pre[hIndex].func;
+ preHookFunc(&sd);
+ }
+ if (*HPMforce_return) {
+ *HPMforce_return = false;
+ return;
+ }
+ }
+ {
+ HPMHooks.source.clif.camera_showWindow(sd);
+ }
+ if (HPMHooks.count.HP_clif_camera_showWindow_post > 0) {
+ void (*postHookFunc) (struct map_session_data *sd);
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_camera_showWindow_post; hIndex++) {
+ postHookFunc = HPMHooks.list.HP_clif_camera_showWindow_post[hIndex].func;
+ postHookFunc(sd);
+ }
+ }
+ return;
+}
+void HP_clif_camera_change(struct map_session_data *sd, float range, float rotation, float latitude, enum send_target target) {
+ int hIndex = 0;
+ if (HPMHooks.count.HP_clif_camera_change_pre > 0) {
+ void (*preHookFunc) (struct map_session_data **sd, float *range, float *rotation, float *latitude, enum send_target *target);
+ *HPMforce_return = false;
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_camera_change_pre; hIndex++) {
+ preHookFunc = HPMHooks.list.HP_clif_camera_change_pre[hIndex].func;
+ preHookFunc(&sd, &range, &rotation, &latitude, &target);
+ }
+ if (*HPMforce_return) {
+ *HPMforce_return = false;
+ return;
+ }
+ }
+ {
+ HPMHooks.source.clif.camera_change(sd, range, rotation, latitude, target);
+ }
+ if (HPMHooks.count.HP_clif_camera_change_post > 0) {
+ void (*postHookFunc) (struct map_session_data *sd, float range, float rotation, float latitude, enum send_target target);
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_camera_change_post; hIndex++) {
+ postHookFunc = HPMHooks.list.HP_clif_camera_change_post[hIndex].func;
+ postHookFunc(sd, range, rotation, latitude, target);
+ }
+ }
+ return;
+}
/* cmdline_interface */
void HP_cmdline_init(void) {
int hIndex = 0;
@@ -59054,11 +59237,11 @@ int HP_pc_payzeny(struct map_session_data *sd, int zeny, enum e_log_pick_type ty
}
return retVal___;
}
-int HP_pc_additem(struct map_session_data *sd, struct item *item_data, int amount, e_log_pick_type log_type) {
+int HP_pc_additem(struct map_session_data *sd, const struct item *item_data, int amount, e_log_pick_type log_type) {
int hIndex = 0;
int retVal___ = 0;
if (HPMHooks.count.HP_pc_additem_pre > 0) {
- int (*preHookFunc) (struct map_session_data **sd, struct item **item_data, int *amount, e_log_pick_type *log_type);
+ int (*preHookFunc) (struct map_session_data **sd, const struct item **item_data, int *amount, e_log_pick_type *log_type);
*HPMforce_return = false;
for (hIndex = 0; hIndex < HPMHooks.count.HP_pc_additem_pre; hIndex++) {
preHookFunc = HPMHooks.list.HP_pc_additem_pre[hIndex].func;
@@ -59073,7 +59256,7 @@ int HP_pc_additem(struct map_session_data *sd, struct item *item_data, int amoun
retVal___ = HPMHooks.source.pc.additem(sd, item_data, amount, log_type);
}
if (HPMHooks.count.HP_pc_additem_post > 0) {
- int (*postHookFunc) (int retVal___, struct map_session_data *sd, struct item *item_data, int amount, e_log_pick_type log_type);
+ int (*postHookFunc) (int retVal___, struct map_session_data *sd, const struct item *item_data, int amount, e_log_pick_type log_type);
for (hIndex = 0; hIndex < HPMHooks.count.HP_pc_additem_post; hIndex++) {
postHookFunc = HPMHooks.list.HP_pc_additem_post[hIndex].func;
retVal___ = postHookFunc(retVal___, sd, item_data, amount, log_type);
@@ -76185,6 +76368,32 @@ int HP_skill_timerskill(int tid, int64 tick, int id, intptr_t data) {
}
return retVal___;
}
+void HP_skill_trap_do_splash(struct block_list *bl, uint16 skill_id, uint16 skill_lv, int bl_flag, int64 tick) {
+ int hIndex = 0;
+ if (HPMHooks.count.HP_skill_trap_do_splash_pre > 0) {
+ void (*preHookFunc) (struct block_list **bl, uint16 *skill_id, uint16 *skill_lv, int *bl_flag, int64 *tick);
+ *HPMforce_return = false;
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_skill_trap_do_splash_pre; hIndex++) {
+ preHookFunc = HPMHooks.list.HP_skill_trap_do_splash_pre[hIndex].func;
+ preHookFunc(&bl, &skill_id, &skill_lv, &bl_flag, &tick);
+ }
+ if (*HPMforce_return) {
+ *HPMforce_return = false;
+ return;
+ }
+ }
+ {
+ HPMHooks.source.skill.trap_do_splash(bl, skill_id, skill_lv, bl_flag, tick);
+ }
+ if (HPMHooks.count.HP_skill_trap_do_splash_post > 0) {
+ void (*postHookFunc) (struct block_list *bl, uint16 skill_id, uint16 skill_lv, int bl_flag, int64 tick);
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_skill_trap_do_splash_post; hIndex++) {
+ postHookFunc = HPMHooks.list.HP_skill_trap_do_splash_post[hIndex].func;
+ postHookFunc(bl, skill_id, skill_lv, bl_flag, tick);
+ }
+ }
+ return;
+}
int HP_skill_trap_splash(struct block_list *bl, va_list ap) {
int hIndex = 0;
int retVal___ = 0;