summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog-Trunk.txt7637
-rw-r--r--src/common/socket.c2720
-rw-r--r--src/common/socket.h352
-rw-r--r--src/common/strlib.c388
-rw-r--r--src/map/intif.c3153
5 files changed, 7132 insertions, 7118 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt
index cc3a74dea..9056251d2 100644
--- a/Changelog-Trunk.txt
+++ b/Changelog-Trunk.txt
@@ -1,3814 +1,3823 @@
-Date Added
-
-AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
-IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
-
-2006/11/29
- * Fixed the new npc parsing code not accounting for windows-style line
- terminators, which as a side effect messed up mapflag parsing if the file
- had windows-style terminators, which coincidentally was the case for the
- nopvp file, which unfortunately meant that all towns became pvp! [Skotlex]
- * HT_PHANTASMIC no longer knocks back even when it misses. [Skotlex]
- * Earned exp by dead homuns will now be lost (same treatment as earned exp
- from players that died) [Skotlex]
- * Now gvg_dungeon mapflag will activate the other mapflags which are
- required: pvp, pvp_nocalcrank and pvp_noparty/pvp_noguild (they are forced
- to off if gvg_dungeon is on and viceversa) [Skotlex]
- * Cleaned the pvp ranking code so that it takes effect even if
- pvp_nocalcrank is active WHEN the map is a gvg_dungeon one. [Skotlex]
- * Now homuncs and their masters are the only ones who can use support
- skills on them. [Skotlex]
- * Some cleaning on the homunc speed calculating code, so that it correctly
- uses the default walk speed if the player has no speed yet. [Skotlex]
-2006/11/28
- * Fixed a typo which made the wedding_ignore_palette setting not work when
- you log on with them equipped [Skotlex]
- * Applied The Ultra Mage's patch to use strict npc header formatting
- parsing. Updated the relevant stock scripts/mapflags that didn't conform to
- the standard. [Skotlex]
- * Moved the blocking of casting supportive skills on homunculus from
- battle_check_target to status_check_skilluse as bct is not invoked unless
- the skill is offensive (or party/guild only) [Skotlex]
- * Cleaned up status_calc_bl_sub_hom, fixed recasting dex/str/vit/int
- bonuses skills making their atk/def/mdef stack with itself over and over.
- [Skotlex]
- * Updated sql files [Playtester]
- * Changing setting the Guild Master from pc_authok to clif_parse_LoadEndAck
- so that it will not fail to set the gmaster flag when the first person of a
- guild to log on is the guild master. [Skotlex]
- * Modified the way Storm Gust freeze's counter works. Now it checks for the
- caster of the Storm Gust, if it's the same as the previous hit, the counter
- is increased, otherwise, the ID is updated and the counter is changed to 1.
- [Skotlex]
- * Fixed always receiving at least 1 bexp/jexp even when the mob gives no
- exp at all. [Skotlex]
- * Changed write to send as suggested by TheUltraMage in:
- http://www.eathena.ws/board/index.php?showtopic=105417
- Hopefully that will take care of the SIGPIPE problem in Debian and cygwin. [FlavioJS]
- * Server name in core.c skipping '\\' characters. [FlavioJS]
- * Memory allocation functions using file,line,func from the invoking functions. [FlavioJS]
- * Other minor malloc changes. [FlavioJS]
-2006/11/27
- * Now when a player's "attack once" request fails due to range, the client
- is told to move to the target to attack it. This sort of fixes the problem
- of the client SPAMMING the server with attack requests from afar without
- even approaching the icewall. [Skotlex]
- * Updated the status change field "option" to an int rather than short.
- This fixes the option values for xmas/sightblaster not getting set, which
- could explain why some people crash when equipping weapons while in xmas
- suit. [Skotlex]
- * Fixed the Homunculus hungry timer not starting on login. [Skotlex]
- * Added logging for standard GM commands (/mm /b /kick etc) [KarLaeda]
- * Some cleanups on the trade_additem function. When specifying a qty of 0,
- an ack will be returned to the client so it doesn't gets stuck. [Skotlex]
- * Update sql files [Toms]
- * Corrected the skill animation for Absorb Spirits [Skotlex]
- * Cleaned up a bit the implementation of how Gravity Field blocks the
- caster from moving. [Skotlex]
- * Mob class-changing will fail if the new class is the same as the previous
- one. [Skotlex]
-2006/11/24
- * Homunc's min matk is now always equal to max matk [Skotlex]
- * Fixed EDP's damage being 100% more than it should (should be 4x, not 5x
- on normal attacks) [Skotlex]
- * Self Destruction will only hit everyone and not just enemies when used by
- mobs (non marine spheres) unless the map is a versus map. [Skotlex]
- * Spider Web's duration is now halved on players (before it was halved in
- pvp maps only) [Skotlex]
- * Likely fixed Homunculus not disappearing the second their intimacy hit 0.
- [Skotlex]
- * Fixed uninitialized variable fd being used in WFIFOHEAD in a few clif
- functions. [Skotlex]
- * Fixed the fact that the TURBO code breaks when you attempt to handle more
- than one connection at a time within the same function. However this broke
- map-server compilation, therefore, don't use TURBO yet! [Skotlex]
- * While at it, cleaned a few packet implementations in the char/login
- servers which were not only ugly, but had some really stupid flaws within.
- [Skotlex]
-2006/11/23
- * Completed Reddozen's hanging mapwarp code to support party and old syntax. [Lance]
- * Updated sql files [Playtester]
- * Made WFIFOHEAD() check for available buffer size remaining on the
- connection, and when there's not enough space, it will increase it.
- [Skotlex]
- * Added define TURBO to the Makefile. It enables MouseJstr's socket access
- optimization which should speed up the code when accessing the write/read
- buffers repeatedly within a function. [Skotlex]
- * Fixed the functions where the RFIFOHEAD/WFIFOHEAD functions were used
- incorrectly (prevents TURBO enabled compilations from finishing) [Skotlex]
-2006/11/22
- * Modified slaves_inherit_speed and slaves_inherit_mode so you get better
- control of when to copy/remove modes/speed. See the conf changelog for
- details. [Skotlex]
- * Reenabled usage of mode MD_CHANGETARGET, so mobs with mode 0x200 will be
- able to switch targets while attacking. [Skotlex]
- * Some cleanups around usage of session[] in the map server, hoping that it
- may fix some not very likely crashes. [Skotlex]
- * Rewrote a few messy @ commands. [Skotlex]
- * Fixed the homunc hungry timer being started when the homun data is
- received from the char-server and the homunc is NOT 'active'. [Skotlex]
-2006/11/21
- * Fixed the Auto-Berserk giving you back defense when it triggers during
- berserk's HP penalty. [Skotlex]
- * Some small changes in the pet ai to make it more responsive. [Skotlex]
- * Rewrote the pet looting behaviour (taken from the mob's), pets are much
- more smarter now when looting from multiple possible items. [Skotlex]
- * Fixed pets/homunc trying to be deleted twice when they had 0 intimacy and
- their master logs out. [Skotlex]
- * Added support for specifying ammo type = 99 in the skill_require_db file,
- it can be used to specify that any kind of ammo can be used with the skill,
- but you NEED to have ammo equipped. [Skotlex]
- * Corrected GS_DISARM, it is now a normal attack, which, when it connects,
- has a chance to do strip weapon at a 3*lv% rate (modified by dex) [Skotlex]
- * Fixed GS_PIERCINGSHOT, it should ignore defense [Skotlex]
- * Corrected Gatling Fever costing SP when trying to turn it off. Also,
- speed increases bonuses won't take effect while it's active. [Skotlex]
- * Updated the main makefile with a new OPT line. It is commented by default
- since it only works with GCC 4.X, when unset, it will hide away a huge
- amount of warnings that have to do with stuff that is not gonna be
- corrected in eA anyway. [Skotlex]
- * Corrected TripleAction's damage. It should do 150%*3 instead of 100*3%
- damage. [Skotlex]
- * Updated GS_CRACKER's stun chance using Doddler's info as reference.
- [Skotlex]
- * GS_FLING won't reduce armor defense when used on players. [Skotlex]
- * Moved ignoreAll to state.ignoreAll so it saves some space. [Skotlex]
- * Cleaned up clif_parse_Wis to prevent crashes from forged packets
- [Skotlex]
- * Cleaned up the implementation of the ignore list so it's more efficient.
- [Skotlex]
-2006/11/20
- * Implemented NPC_DEFENDER. Reduces ranged Physical+Misc damage by 80%
- [Skotlex]
- * Improved the battle config reader so it accepts hexadecimal values.
- Updated the monster_ai description to make use of this [Skotlex]
- * Added monster_ai&0x200. When set, mob skill delays are shared. That is,
- if the mob has several lines with the same skill, when the skill is used,
- the delay will be set to all of them, not just the one entry used.
- [Skotlex]
- * Corrected NPC_BARRIER so it grants 100 def/mdef (and not just mdef)
- [Skotlex]
- * Weapon ATK bonuses will now only apply to watk and NOT watk2 on players
- (on players watk2 is refine bonus) [Skotlex]
- * Corrected NPC_KEEPING. it should give 90 def, not 100 [Skotlex]
- * You now can't use other skills while a skill-induced "window" is up
- (teleport, refining, etc). However, be warned that we aren't quite sure how
- the server will clear this out if you decide to hit cancel on the window,
- so skill-blockage is likely to happen (temporary solution: whenever you
- change maps or warp the state is reset server-side). [Skotlex]
- * Fixed itemskill variable being cleared before parsing the skill, this
- causes auto-casted teleport to fail to skip the skill menu. It is now
- cleared on castend_pos/id directly. [Skotlex]
- * Skills with state 'move_enable' will now do a "walk path" check between
- target cell/object and caster instead of a "shoot path" check, this would
- fix skills like snap or charge from letting you "teleport" across pits.
- [Skotlex]
- * Raised the amount of skills that can stack on a single cell before the
- "in-area/out-area" detection code breaks to 24 (from 8) [Skotlex]
- * Fixed a crash in clif_SkillInfoBlock if the passed player already
- disconnected. [Skotlex]
- * Added limiting drop rate to 100% from item-bonuses that depend on the
- mob's level so that "@autoloot 100" will catch them. [Skotlex]
-2006/11/19
- * Removed security check since source level patch is applied.
- * Reverted select(), created prompt().
- * Hack protection from packet monkeys in clif_parse_NpcSelectMenu. [Lance]
- * Added 'cancel' button parsing in buildin_select menu system. Now scripts will continue
- to load if 'cancel' is pressed and 255 will be returned. [Lance]
-
-2006/11/17
- * Corrected use of the party invitation reply packet, thanks to FlavioJS.
- [Skotlex]
- * Fixed potential hack by modifying packet of whispers. [Lance]
- * Fixed potential crash in IRC processing message with '%' using *printf. [Lance]
- * Fixed memory leaking caused by homun_data not freed when removed. [Lance]
- * Fixed client not validating the chat-kick-request packet, which can cause
- crashes. [Skotlex]
- * Updated map_quit to handle removing of players who are not even
- authenticated yet. [Skotlex]
- * New connection requests are now also blocked when there's a player
- already online but hasn't finished loading yet. [Skotlex]
- * Because of these changes, the friendlist notification when people join
- has been moved to LoadEndAck from pc_authok [Skotlex]
-2006/11/16
- * Updated sql files [Toms]
- * For the sake of avoiding confusion, all script events are named with prefix 'On'
- from now on. [Lance]
- * Edited atcommand and charcommand syntax. Now it doesn't need the useless
- character name and ":". [Lance]
- * Shadow Jump and Kirikage won't "move" you if you use them in GvG grounds.
- Fixed Kirikage so it first warps you, and then you unhide. [Skotlex]
- * Corrected Zeny Nage so the Zeny spent on the attack is always the exact
- same value as the damage you are dealing. Also corrected it so it does half
- damage when used on players. [Skotlex]
- * Overlapping song/dances will now cause dissonance/ugly-dance level 1
- instead of retaining the level of their song/dance. [Skotlex]
- * Fixed wrong check in @petrename, thanks to The Ultra Mage.[Skotlex]
-2006/11/14
- * Early Christmas present. 3 new "features" which were very easy to code,
- and should help scripters tremendously. Eapp is quite a way from being
- ready, so these can't hurt:
- * Implemented Karma: It turns out that when someone has karma, the client
- believes this character is "evil", and will give you a cursor sword on top
- of them automatically. So now the code will let characters with karma to
- fight each other. This enables duels and other types of restricted pvp
- where only the characters with karma can hit each others, and the rest of
- players with neutral karma cannot be affected. Note that Karma cannot be
- negative, and it can have any value between 0 and 256 (any non-zero value
- makes them appear evil on the client). For now, characters with karma can
- hit each other regardless of karma value, but perhaps it may be better to
- let them to hit each other ONLY if they have the same karma (the whole
- duel implementation COULD be cleaned up using Karma instead!)
- * Added mapflags partylock and guildlock, which lock the state of the
- parties/guilds on said maps:
- partylock: blocks user party requests to create/invite/leave/kick
- guildlock: blocks user guild requests to create/invite/leave/expel/
- make alliance/make opposition/delete alliance/delete opposition/
- break guild
-2006/11/13
- * Fixed a bug where the char-txt server was incorrectly saving memos,
- causing character data to be lost on restart. [Skotlex]
- * HP Conversion will fail when used at max SP. It should not display any
- errors to the client. [Skotlex]
- * Modified yet again the login procedure to enable character variables to
- work on item scripts. It SHOULD work crashless now. Please report any
- problems it may cause.
- * Volcano/Deluge/Violent Gale are now interchangeable, in the sense that
- as long as one of these is out, casting any of the three will not consume
- gems, and will use the remaining time of the previous one. In turn, Land
- Protector will now always consume gems on every cast. [Skotlex]
- * Small cleanup in the Land protector code which may fix it not blocking
- AoE skills. [Skotlex]
- * Fixed the interpretation of "head_dir". Removed setting head_dir to match
- character direction in the whole code. Now it is only reset to 0 (look
- forward) when unit_setpos is invoked, or when a character begins walking.
- Thanks to FlavioJS for figuring out how the client parses the head
- direction. [Skotlex]
- * Moved status_calc_pc back to pc_authok. [Lance]
-2006/11/11
- * Fixed debug message in login_sql [KarLaeda]
-2006/11/10
- * Deluge/Violent Gale/Volcano tiles will now fail to be placed on cells
- that are already ocuppied by anything else. [Skotlex]
- * status_is_immune will now return 0 or the amount of immunity of the
- target. In which cases it returns 100 for WoH and the GTB bonus when they
- have passed the gtb_sc_immunity setting. This enables targetted spells to
- not "fail silently" unless GTB's magic reduction is 100. [Skotlex]
- * Fixed Homunculus being spawned as soon as they arrive from the
- char-server even if the Master has not spawned on the map yet. [Skotlex]
- * AL_TELEPORT now fails when used on top of Land Protector. [Skotlex]
- * Some minor cleanings in pc_setpos, it may (or not) help fix that
- homunc-caused "map_addblock" error message. [Skotlex]
- * Corrected fog of wall, so that the deleted/doubled-duration effects are
- calculated on a cell-by-cell basis. [Skotlex]
- * Updated Land Protector: It will now delete/block effects of ALL ground
- skills EXCEPT: Song/Dances/Traps (encores are still blocked). Land skills
- blocked/deleted by LP also can't be casted on top of an existing LP. The
- code uses the inf2 value of the skill to determine if it is a
- song/dance/trap. [Skotlex]
- * Ganbantein, mimicking LP, will now also remove ensembles. [Skotlex]
- * Fog of Wall will fail when casted on top of a Volcano/Violent Gale
- [Skotlex]
- * Applied FlavioJS's fix to the npc whisper system. [Skotlex]
-2006/11/09
- * Fixed status-change loading not working. [Skotlex]
- * Fixed permanent mob-spawn script-events not working. [Skotlex]
- * AL_CURE won't confuse undead players. [Skotlex]
- * Corrected the Fog of Wall check so that it lasts 2x when it is placed on
- TOP of a suiton/deluge, not when the caster is on top of them. [Skotlex]
- * Updated status_check_skilluse so that when the caster has a disabling
- status change (stun/petrify/etc) it will block the skill in all cases
- EXCEPT on cast-end when the skill is ground-targetted. [Skotlex]
- * Fixed Health Conversion skill formula bug. [Lupus]
-2006/11/08
- * Fixed Desperado's hit-rate, now it behaves as it should. [Skotlex]
- * The GVG map-packet will now also be sent for guild dungeon maps.
- [Skotlex]
- * Added clif_gospel_info which displays info about the buffs you are
- receiving. Thanks to Rayce for the packet information. [Skotlex]
- * Fixed Spider Web not ending when hit by a fireelemental attack. [Skotlex]
- * Cast-time reductions from status changes will not be executed until right
- before casting, to prevent status changes from ending when attempting to
- cast and the attempt fails (invalid cells, not enough sp, wrong target,
- etc, etc) [Skotlex]
- * Added check to prevent Wand of Hermod from seeking for a partner to
- encore, since the partner is supposed to be the warp. [Skotlex]
- * Corrected the mob spawn reading code so that the event-name can be up to
- 50 characters long (which is the actual event length) and so that it can
- read spaces within them, it will also strip the leading/trailing quotes if
- you use them so that the event is actually found on mob-death (so you can
- do stuff like "My NPC::OnDead" as a valid event). [Skotlex]
- * Moved the homunc inherit speed from the master from status_calc_pc to
- LoadEndAck, since the hom's speed matches that of the master each time the
- master changes maps. [Skotlex]
-2006/11/07
- * Applied FlavioJs's patch which enables colored console output for Windows
- systems. It also includes a config setting called
- "stdout_with_ansisequence" with which you can turn off the color codes (in
- case you are logging all output) [Skotlex]
- * Added error reporting when the max number of ground unit cells has been
- reached (this may be the reason why sometimes it fails to recognize when
- you step out of a song/dance/encore) [Skotlex]
- * Added passing the Endure effect to other devoted people. Note that the
- "hit count" is individual for each character, and only when it ends on the
- Crusader himself will that force it to end on everyone else. It also will
- not transfer on gvg grounds, but it does transfer in pvp. [Skotlex]
- * Fixed Reflect-Shield triggering Auto-Guard instead on devoted chars.
- [Skotlex]
- * Added a check to prevent casting ground skills on a target and vice-versa
- when said skill use packets are received. It really shouldn't be
- exploitable, but doing that certainly makes the server print a lot of
- "unknown skill used!" messages. [Skotlex]
- * Fixed map_foreachiddb and map_foreachpc so they don't encapsulate the
- variable arguments into a double va_arg list. Thanks to the Ultra Mage for
- the tip. [Skotlex]
- * Cleaned up the clif_hate/mob_info functions with the correct fields/usage
- as explained by Rayce. [Skotlex]
- * Implemented clif_feel_hate_reset packet to properly display the Angel of
- the Sun/Moon/Stars, thanks again to Rayce for the relevant information.
- [Skotlex]
- * LP will again block all land-stuff from being placed down on top of it
- for the exception of Song/Dance/Encores. [Skotlex]
-2006/11/06
- * Reapplied 'fix equipment scripts which are based on character variables not
- working.' [Lance]
- * Multiple Gunslinger skill corrections, refer to
- http://ro.doddlercon.com/guides/gunslinger.html for information source:
- [Skotlex]
- - Corrected Ground Drift. Splash range of 3x3, stackable and placeable
- underneath others, cast time is 2 secs. It's considered ranged, and it's
- bonus damage increase is defense ignoring, always neutral.
- - Corrected Bull's Eye implementation, it should deal normal damage against
- non brute/demi-human targets.
- - GS_DUST is now considered a short-range attack.
- - Implemented Desperado's hit rate based on distance to caster as it's
- believed to behave.
- - GS_TRACKING's range is no longer affected by Snake Eye.
- - GS_FLING's defense reduction is now 5*lv%
- * Suiton's Speed/Agi penalty will affect everyone when used in versus maps.
- * Corrected Kaupe so it doesn't ends on the first part of Soul Destroyer.
- [Skotlex]
- * Applied some cleaning to the way Tatami Gaeshi knocks back. [Skotlex]
- * Cleaned up the way mobskill_use checks for the correct event. It should
- fix unlimited mob-skill-casting issues. [Skotlex]
- * Removed the return code entry when logging GM reload-GM requests
- (login-sql),it'll just be stored as zero. [Skotlex]
- * Added a fix on socket.c to not pick INADDR_ANY when choosing our own IP.
- [Skotlex]
- * Applied the correction on maprespawnguildid so that it parses ALL players
- and not just those on a map. [Skotlex]
- * TK_JUMPKICK now dispels normal aspd/speed potions (not berserk pitched
- ones) and Preserve will be unable to block this. [Skotlex]
- * Soul Linkers are now inmune to SA_DISPEL [Skotlex]
- * You can now place everything (except magic skills) on top of LPs.
- [Skotlex]
- * Corrected Ganbantein to not touch song/dance/ensembles. [Skotlex]
- * Status_calc_pc will refuse to execute if the player is still tagged as a
- "new connection" and the invocation is not meant to be the first one.
- [Skotlex]
- * Swapped the order of checks in status_isimmune so that Wand of Hermod
- skill blocking takes precedence over GTB's [Skotlex]
- * Client packets will all be ignored while a player is not on a map until
- the LoadEndAck packet is received. [Skotlex]
- * Reverted changes, moved status_calc_pc(sd,1) back to pc_authok
- since it causes problems. [Lance]
- * Temperory fixed stability issue caused by initial status_calc_pc
- being placed AFTER another status_calc_pc. [Lance]
-2006/11/05
- * Updated sql files [Toms]
- * Updated perl files acording to rev 9135 [Toms]
-2006/11/04
- * Readded duel code in map_quit. Why it has been removed!? [LuzZza]
- * Converted itemdb tables to use smallint. Credits to ALZ. [Lance]
-2006/11/01
- * Reverted LK_Berserk HP requirement, as everything, including kRO X.2 and
- pRO X.3, points that way. [Vicious]
-2006/10/31
- * Fixed song/dance/encore cells not being placed down when casted on top of
- a land Protector. [Skotlex]
- * Update homunc's speed when master's speed changes, should avoid homunc's
- speed = 0 on login (homunc's stats are calculated before master's stats) [Toms]
- * When Kaizel (or super novice rebirth skill) triggers, you get debuffed
- now. [Skotlex]
- * Modified the player_cloak_check_type and monster_cloak_check_type
- settings. 1 makes it check for walls, 2 makes cloaking NOT end on normal
- attacks, and 4 makes cloaking NOT end when using skills. The default
- setting for players is still 1, but for mobs the default has been changed
- to 4. [Skotlex]
- * Non-players can now use all skills while hidden. [Skotlex]
- * Added a check to prevent adding negative damage to the total accumulated
- damage in mob_damage. It could fix some exploits, even though mob_damage
- should never be invoked with negative damage anyway. [Skotlex]
- * Implemented the property where the first attacker get's double exp-share
- than the others. Due to the way exp calculation is done, this bonus will
- not apply when you use exp_calc_type 1 (damage/max_hp) instead of the
- default (damage/total-damage). For now this bonus is done after calculating
- who is the MVP character instead of before. [Skotlex]
-2006/10/30
- * Fixed a little bug in event enqueue code [Toms]
- * Updated the code so mobs can use ChainAction as a targetted skill.
- [Skotlex]
- * Added GroundDrift effects for Wind (Stun) and Fire (knockback). The
- knockback value is unknown, so 3 is used for now. [Skotlex]
- * Cleaned up some more the steal code, now you can't steal the last slot
- regardless of skill level used. [Skotlex]
- * Added consideration of Chain Action when cloning GunSlingers. [Skotlex]
- * Modified battle_calc_return_damage to take the skill id as well, now
- magic damage return will not work on skills tagged as ground or self
- targetted. [Skotlex]
- * Fixed Gank not working at all with the default max steal tries setting.
- [Skotlex]
- * Soul Drain won't work with skills tagged as self-targetted. [Skotlex]
- * Improved the Suiton code so that the walk/agi penalty only applies to
- enemies of whoever casted the skill. [Skotlex]
- * Moved the initial status_calc_pc call to when you finish loading the map,
- should fix equipment scripts which are based on character variables not
- working. [Skotlex]
- * Fixed getcharid according to samples and docs. [Lupus]
- Thanks to joshuaali for pointing it out. eAPP has no such bug
-2006/10/27
- * Fixed mob-skill event "skillused" not triggering at all. [Skotlex]
- * Summoned mobs will only be removed from a map if their master is also
- removed (dynamic mobs) [Skotlex]
-2006/10/26
- * Updated sql files [Playtester]
- * Experimental tweak to npc_parse_function - Overwrite existing functions. [Lance]
-2006/10/25
- * Cleaned up some more the event dequeue code, it will no longer clear out
- the npc_id if there's no events waiting to be executed (why does it clears
- the npc_id anyway?) [Skotlex]
- * Because of possible conflicts with this change and the on-login script,
- now the on-login script is executed when the player has finished loading
- into their start-up map rather than as soon as receiving the registry
- variables from the char-server. [Skotlex]
- * Some cleaning of the pc_eventtimer and pc enqueue code, it should fix
- some memory leaks when the event counter does not matches with the actual
- number of queued timers during logout. [Skotlex]
- * Fixed "skill_sp_override_grffile: yes" causing crashes when parsing
- Homuncuus/Guild skills. [Skotlex]
- * Made the exp bonus settings be adjustable: [Skotlex]
- - exp_bonus_attacker: Indicates how much additional exp a mob gives per
- additional attacker (eg: 10 -> +10%*attacker)
- - exp_bonus_max_attacker: Indicates at which number of attackers the bonus
- is capped (eg: 5 -> 5 attackers, so a mob yield the same exp whether 5 or
- 10 people attack it)
- - Changed the way the party_even_share_bonus setting works. It now uses a
- simple linear bonus increase (eg: 10 -> +10%*party member)
- - The defaults are as explained by Tharis: +25%/attacker, capped at 12
- attackers, no party bonus. The first two can be found in exp.conf, the last
- one was left in party.conf
- * MG_STONECURSE and NPC_PETRIFYATTACK now use time1 to specify the
- "petrifying time". This value has been set to 5 seconds. [Skotlex]
- * Now when SC_STONE is triggered from status-change cards, it's petrifying
- duration will be passed as 0, causing the minimum (1 sec) to be used.
- [Skotlex]
- * Got rid of clones in src: old Novice Grounds map -> new_zone0? [Lupus]
-2006/10/24
- * Removed again your mdef reducing "petrifying" time as apparently it can't
- be reduced by mdef. [Skotlex]
- * Cleaned up the "show_steal_in_party" setting so it only takes effect when
- the item was successfully stolen (there was no point in telling you the
- item couldn't be stolen due to being overweight) [Skotlex]
- * Cleaned up the pc_steal_item implementation (again). It now uses a more
- random, simple approach in each steal attempt. [Skotlex]
- * Changed the way the skill_steal_max_tries work. Now it actually MEANS the
- max number of steal tries, use 0 to disable (unlimited tries). [Skotlex]
-2006/10/23
- * Added a bunch of important indexes when dealing with the log tables.
- Added upgrade_svn9050.sql which adds these indexes as well. [Skotlex]
- * Expanded the family check to work as it should, exp-share-range is
- respected, and the child is not considered for it (thanks to TheUltraMage
- for the investigation) [Skotlex]
- * Double Casting will no longer fail when used. [Skotlex]
- * Modified SC_STONE so that the duration of the "petrifying" time is 5 secs
- reduced by your natural resistance to petrify (which is mdef%) [Skotlex]
- * Modified the meaning of the third column in the skill_require_db. Instead
- of MaxHP, this is now called MaxHPTrigger. This column (which was
- previously unused by all skills) signals the limit HP% that you can have to
- be able to use the skill. For example, setting it to 20 means the skill is
- unusable if you have more than 20% life (note that this is merely a
- threshold setting, it won't actually substract HP when used!) [Skotlex]
- * Adjusted LK_BERSERK so you can only use it when you have 20% or less
- life. [Skotlex]
- * Removed NJ_TOBIDOUGU adding damage to W_HUUMA weapons which somehow got
- readded. [Skotlex]
- * When nonplayers use Cloaking, it will be forced to level 10 since mobs
- shouldn't have movement/attack restrictions while walking cloaked.
- [Skotlex]
-2006/10/20
- * Made HAMI_CASTLE use clif_slide rather than clif_fixpos. This should
- fix clientside problems when castling between two positions the (client)
- path finding can't find a walkable bath between anymore. [blackhole89]
- * Fixed the Homunc not spawning next to you after receiving it's data from
- the char-server. [Skotlex]
- * Fixed Charge Atk being able to go through chasm/pits. [Skotlex]
- * Moved the homunculus DB information from the player structure to the
- homun structure. Modified the homunculus creation packets to hold this
- information during creation, also, all initial values are handled by the
- map-server, the char server only assigns it a homun ID. [Skotlex]
- WARNING: This is yet untested! It's very possible something could had
- broken after changing the format/size of the homunc creation packets.
- * Added config setting "summon_flora_setting", which it you can decide now
- two things: a. Whether or not players can harm your floras outside versus
- grounds, and b. Whether or not you can summon out and mix different types
- of plants at the same time. [Skotlex]
- * Likely fixed pc_steal_item always failing to steal (it was attempting to
- steal random item IDs...) [Skotlex]
- * Cleaned up a bit the mob on-death event so that when the killer is a
- homunculus, it's master will be taken. Also, the variable killerrid will be
- set before running the script to specify who delivered the final blow. If
- the killerrid matches with the script attached player, you can be sure your
- player did the final blow to the mob, otherwise, the attached player is who
- did the most damage to the mob. [Skotlex]
-2006/10/19
- * Cleaned up the log.c file. [Skotlex]
- * Fixed log_chat not recording anything if the server is compiled in SQL
- mode and sql_logs is turned off (it should then record to a plain txt file)
- [Skotlex]
- * Fixed SG_FRIEND, it should be triggering when Monks do Combo Finish (not
- triple blows), and the trigger rate increase should be based on your known
- level of SG_FRIEND, not TK_COUNTER. [Skotlex]
- * Phantasmic arrow now knockbacks even if it misses. [Skotlex]
- * Adjusted the way Monk combo times work. The combo time is now always
- 300ms (adjusted by combo_delay_rate) which takes effect inmediately AFTER
- your current skill's canact-delay (which is why the particular skill delays
- were moved to skillcast_db) [Skotlex]
- * Modified skill_delayfix so it performs the can-act reduction from agi/dex
- for combos there. [Skotlex]
- * Modified pc_steal_item so that it behaves more closely to the way it does
- on Aegis. [Skotlex]
-2006/10/18
- * Added a overflow check when calculating party exp share. [Skotlex]
-2006/10/16
- * Adjusted UTSUSEMI/BUNSINJYUTSU so that they block range/melee weapon
- attacks and only melee misc attacks. This isn't 100% correct, but it's a
- better approximation to the way these skills behave. [Skotlex]
- * Emergency call &16 (disable skill from nowarpto maps) will now NOT block
- Emergency Call if that map is also a gvg-castle map. Makes it safe to turn
- on this option to prevent usage from special maps (like Lhz3) without
- crippling the skill during WoE. [Skotlex]
- * Applied most of Mpeg's work on Ninja Skills. For information see:
- http://gpegon.free.fr/ea/ninja_10-15-06_mpeg.txt [Skotlex]
- * When reinvoking a combo-time, the previous combo time will be terminated.
- This could fix the ongoing difficulties pulling off Monk combos. [Skotlex]
- * Fixed Esma-state not ending after casting it. [Skotlex]
- * Fixed @hominfo displaying intimacy on a 1/10k scale. [Skotlex]
-2006/10/14
- * Homun info window to show crit value. As default, homun does NOT crit,
- as monsters do not crit. This is purely for display purpose for players
- to identify their homon's luk value. [Vicious]
-2006/10/13
- * Base attack for non players is now calculated as str + [str/10]^2 (it
- does not has +dex/5+luk/5 which players do have) [Skotlex]
- * Fixed the char-sql server trying to read the gms off a "gm_db" config
- setting stead of "login_db" [Skotlex]
- * Corrected Throw Arrow/Musical Strike's damage formula [Skotlex]
- * Altered Trick Dead. It doesn't prevents skills from being casted on you
- now, but damage-based skills will do no damage. [Skotlex]
- * Made the battle_config.attack_attr_none apply to pets when using the
- "fixed damage" pet skill scripts. [Skotlex]
-2006/10/12
- * made @killmonster make the mobs drop items again. [Skotlex]
- * Added a temporary message when Angel of the Sun, Moon and Stars trigger
- so you know it triggered. [Skotlex]
- * When slaves_inherit_speed is set (which is also the default), homun will
- have the same speed of their master when spawned. [Skotlex]
- * When using Hatred and you already have a hate target, your current hate
- target is displayed now. [Skotlex]
-2006/10/11
- * Cleaned up the char-server code when the last point of a player is not
- found. First it'll check if there's any mapserver online, and then, if
- there is, it'll look for the major cities. If this fails, then the player
- will be told server is closed instead of trying to send him to a "random
- map". Will fix the char-server printing the misleading message "map
- server not found, sending to major city" when in reality there just
- aren't any map servers connected. [Skotlex]
- * Corrected the mob damagelog structure so that you can't exploit it by
- switching characters. [Skotlex]
-2006/10/09
- * Fixed crash when char-server sends to a "random" map-server online on
- connect. Thanks to TheUltraMage for pointing it out. [Skotlex]
- * Should have fixed being petrified not reducing your defense and
- increaseing your mdef. [Skotlex]
- * Fixed SC_NOCHAT printing the "skills are now available" message twice on
- natural expiration. [Skotlex]
-2006/10/08
- * Updated sql files [Playtester]
-2006/10/06
- * Updated Land Protector to block absolutely every land-based skills with
- the exception of Encores/Dances. [Skotlex]
- * Disabling status abnormalities will now reset a mob's target. [Skotlex]
- * Mob morphing also resets their target now. [Skotlex]
- * Monk combos no longer can ignore skill delay (delay skill for all their
- combo-related skills is ASPD) [Skotlex]
- * Now you can trade while in a chatroom. [Skotlex]
- * Fixed homun-txt reading when the file has DOS line-type delimiters (\r\n)
- [Skotlex]
-2006/10/05
- * skill_blown will now trigger on-touch npcs on the landing tile. [Skotlex]
- * Max trade distance has been reduced from 5 to 2. [Skotlex]
- * Undisguising will now resend the cart-contents. [Skotlex]
- * Added function npc_unload_duplicates(), it unloads all npcs that are a
- duplicate of the passed one. For use with @unloadnpc to prevent crashes
- when you unload the npc that has duplicates. [Skotlex]
-2006/10/04
- * Bowling bash now always hits twice regardless of situation. [Skotlex]
- * Added an underflow check to prevent sending to the client negative mdef2
- value (for Frenzy'ed characters) [Skotlex]
- * Modified pc_jobchange so that it automatically removes
- peco/falcon/cart/homun if the new job you are changing to does not possess
- the required skill for them. [Skotlex]
-2006/10/03
- * Fixed a possible crash with @reloadmobdb due to pet loot timers.
- [Skotlex]
- * Fixed a possible crash and a memory leak on the login-SQL server when
- parsing unban requests. [Skotlex]
- * Renamed setting delay_dependon_dex to delay_dependon_agi, the delay of
- skills is reduced now (when enabled) by AGI instead of DEX, which makes a
- lot more sense than DEX. [Skotlex]
-2006/10/02
- * Modified item-granded status resistance reduction to behave as explained
- by Vicious (Ragnarok Monthly magazine) [Skotlex]
- * Added the opt3 values to Eske [Skotlex]
- * Fixed the txt->sql converter only saving the very first character
- permanent variable. [Skotlex]
- * Fixed the txt->sql converter saving account-wide variables as
- character-wide ones. [Skotlex]
- * Renamed nopenalty mapflag to noexppenalty. Using nopenalty will turn
- on/off both noexppenalty and nozenypenalty now. [Skotlex]
-2006/10/01
- * Removed the speed adjustment per level of Increase/Decrease Agility
- [Skotlex]
- * Fixed humunculi skill exploit, thanks to mr.rkit [Lupus]
-2006/09/30
- * Rewrote the txt->sql converter. It now links directly to the char server
- files so that it should get auto-updated with any code changes in the
- later. [Skotlex]
- * The converter will now also convert: account-wide variables, parties,
- guilds, guild storage and guild castles. At this point the only two things
- not converted are login-server-wide account variables (##, they belong to
- the login converter) and homunculus (the SQL save function is messy and
- doesn't lends itself to be integrated with the converter the way all the
- other functions are). [Skotlex]
- * misceffect2 will no longer cause the effect on top of the source object
- when it is the fake npc. [Skotlex]
- * Added check so that Frost Nova doesn't hides hitting animation on
- targets. [Skotlex]
- * Added the missing brackets around the trade logs condition check, thanks
- to Coltaro. [Skotlex]
-2006/09/29
- * Spurt state will now trigger on Soul Linkers as well. [Skotlex]
- * Added a check un unit_run when unit_walktoxy fails. Should fix running
- getting you stuck sometimes when running on diagonals near obstacles.
- [Skotlex]
-2006/09/28
- * Merged the necessary changes to make the script engine support negative
- constants (db/const.txt). Thanks to Rayce (from jA) for the code. [Skotlex]
- * Cleaned up the skill.c code to take into account when skill_unitsetting
- returns null (skill failed), fixes a possible crash with Wand of Hermode
- [Skotlex]
-2006/09/27
- * Cleaned up status_get_party/guild_id, it should also fix a possible crash
- when invoking such a functio on a masterless pet. [Skotlex]
- * Sharp-Shooting will now display a skill animation. [Skotlex]
- * The no_spawn_on_player setting will now also work for static mobs, but
- only if the setting is set to 100 or higher. [Skotlex]
-2006/09/26
- * Yet again messed with the packet sent during a splash attack, but this
- time taking into account the packets that eA was using some many revisions
- ago. Tests are needed to see if Magnum Break/Grimtooth don't spam the skill
- animation anymore, and to see if GrandCross didn't break it's animation as
- well. [Skotlex]
- * Added function skill_dance_switch which handles converting overlapping
- song/dances to dissonance/ugly dance. It should make the overlapping area
- now behave completely like the mentioned song/dances (taking into account
- interval and target type changes). [Skotlex]
- * Updated battle_check_target so that non-offensive skills cannot be used
- on a homun except for the homun and it's master. [Skotlex]
- * Steal zeny won't work on treasure chests now. [Skotlex]
-2006/09/25
- * Added an ugly check so that Heal will display 0 when healing a berserked
- character (and it will again display full heal amount when healing a player
- who's at full life) [Skotlex]
- * Disabled again client-self-muting since it's causing too much trouble.
- [Skotlex]
- * Merged FlavioJS's script patch which should fix stuff like "mes ();"
- causing crashes. [Skotlex]
- * Item group reading will now complain when a line doesn't has enough
- fields. [Skotlex]
- * Fixed #baselevelup adding instead of substracting status points when used
- with negative levels. Also made it reset your stats if there wasn't enough
- to substract from. [Skotlex]
- * Applied FlavioJS's suggestion of expanding WFIFOPOS to also take the
- direction. This had the side effect of fixing the direction missing from
- the mob spawn packet, which explains why all npcs face north when you are
- within sight while doing a @reloadscript. [Skotlex]
- * Changed the order of packets in TK_HIGHJUMP, may fix the reports of
- getting stuck when jumping into a warp. [Skotlex]
- * Changed a bit the code of marionette control, where a redefined local
- variable may be the cause of mob-targetted Marionette Control stacking
- stats up. [Skotlex]
-2006/09/24
- * When the code auto-guesses that a skill should require ammo, it will
- accept any type of ammo for using it instead of only arrows. Fixes Magnum
- Break usage on Gunslingers. [Skotlex]
-2006/09/22
- * Probably fixed a signed/unsigned mismatch warning on the new socket code.
- [Skotlex]
- * Fixed the "map server claims to have char online, but this other map
- server also has it tagged as online" message triggering in some cases where
- it shouldn't. [Skotlex]
- * Fixed some maps in db/mapindex.txt being under the wrong id and added comments
- so this will not happen again. [Zephiris]
- --- ATTENTION! ---
- People running TXT servers will have to tell their players to redo their /memo
- points since the map ids of the old file were wrong.
-2006/09/21
- * Fixed a bug on "select" when skipping empty entries when the selected
- entry is the last. [Skotlex]
- * Improved a bit RFIFOFLUSH as suggested by Harbin. [Skotlex]
-2006/09/20
- * A mob's HP is set temporarily to 0 before invoking it's on-death script,
- prevents said scripts being able to "rekill" the mob indefinitely (if stuff
- like killmonster is used within) [Skotlex]
- * Some small cleanups in chat.c [Skotlex]
- * Fixed party_sub_count (TK_POWER) failing when the idle_no_share setting
- was disabled. [Skotlex]
- * Enabled Star Gladiators and Soul Linkers to do /doridori [Skotlex]
-2006/09/19
- * Fixed nocommand mapflag causing the "you can't use commands on this map"
- message to trigger one very single chat, instead of only for actual @/#
- command invocation. [Skotlex]
- * Added support for skipping empty string menu entries for the select()
- command (just as `menu` has it already) [Skotlex]
- * Fixed pc_set_hate_mob letting you place mobs on any of the three
- positions regardless of size [Skotlex]
- * The double continuation error will now display both scripts that
- triggered it. [Skotlex]
- * Loading the storage from the char-server will fail if player is already
- tagged in final save state. [Skotlex]
- * Removed setting ban_spoof_namer, sending invalid global-talk packets will
- now just kick the player out of the server. [Skotlex]
- * Added echoing messages back to self when using @/# commands on whispers
- and party/guild messages, to prevent the client from muting yourself.
- [Skotlex]
- * Fixed some gcc4 warnings [Toms]
-2006/09/18
- * Fixed Spider Web fire damage bonus. [Skotlex]
- * Made Global chat always reply back to you even on @/# commands, this
- prevents the client from muting yourself due to "hack". However, this same
- fix isn't easily applicable to @ commands invoked from whispers or
- party/guild messages, those are still pending. [Skotlex]
- * Merged Meruru's update to socket.c, which includes a rewritten parse
- function, which should hopefully be more efficient than the previous code.
- [Skotlex]
- * The new code includes support for two config settings
- (packet_athena.txt): frame_size, which can be used to alter the logic
- packet-size allowed by the code, and mode_neg, which when set to yes, sets
- TCP_NODELAY on all connections (defaults to yes). [Skotlex]
- * High-Jump is usable everywhere now, except that on maps where it
- previously failed, now will just make you jump in place. [Skotlex]
- * Fixed TK_RUN as per packets provided by AuronX. [Skotlex]
- * Moved the equipment/card resistances to status ailments outside of
- status_get_sc_def, so that they are applied only to rate, not duration.
- [Skotlex]
- * Modified the Asura code (again), hopefully movement sprite issues are
- fixed now [Skotlex]
- * @reloadscript scripts will no longer eliminate mobs with no respawn data.
- But watch out for possible bugs (I think someone mentioned 1 extra
- treasure box will spawn when you use it? This needs testing!) [Skotlex]
- * Made speed_add_rate a linearly stacking increase. [Skotlex]
- * Corrected a possible overflow when using show_mob_info to display the
- mob's up as a percent. [Skotlex]
- * Corrected the documentation for checkoption/checkoption1/checkoption2
- [Skotlex]
- * Reenabled client requesting to self mute, as the whole knockback packet
- issues of the past which were causing players to mute themselves when being
- knockback is no longer there. [Skotlex]
-2006/09/17
- * Fixed NPC_INVISIBLE's cloak ending after attacking once. [Skotlex]
- * Fixed SG_FUSION being castable without Soul Link state. [Skotlex]
- * Moved the item-use restriction SC checks from clif.c to pc_use_item,
- fixed Gravitation blocking potion usage on it's area of effect. [Skotlex]
- * Sphere Marines and Summoned Flora are now inmune to class-changing.
- [Skotlex]
-2006/09/16
- * Added monster_ai&256. When set, a monster will pick a random starting
- position to begin checking versus it's skills, otherwise, it will always
- begin checking from the beginning. [Skotlex]
- * Fixed the status change duration reduction equation was was totally
- wrong, thanks to k3dt [Skotlex]
-2006/09/15
- * Now mobs won't do a distance check to lose their target on every ai
- iteration, but only when they finish walking (unless you set monster_ai&1)
- [Skotlex]
- * The chase distance before a mob gives up following a player has been
- increased from view-size (range2) to min-chase (range3). [Skotlex]
- * Reverted the Summon Flora change where all plants were being summoned in
- one go. [Skotlex]
- * Moved the weapon repair effect to where it belongs (after successfully
- repairing an item) [Skotlex]
- * Added config setting "friend_auto_add" (battle/player.conf), if set, when
- you accept someone as your friend, both characters will show up on each
- other's friend list. [Skotlex]
-2006/09/14
- * Changed Extremity Fist's code to make you actually walk past your target,
- which displays a much more correct "animation" for the skill. Thanks to
- HiddenDragon for the information and code. [Skotlex]
- * Updated the item_db search functions so that when returning the
- dummy-item, it first updates the nameid to match the requested one, this
- prevents pc_additem later on giving you an item with ID 500 instead of the
- ID requested. [Skotlex]
- * Added a clif_skill_nodamage packet when using Repair Weapon, just to see
- what happens. [Skotlex]
- * Likely fixed "half" of the alliance being saved, which ends up in guilds
- that can attack another, but not viceversa. [Skotlex]
- * Added deleting of saved Status changes on character delete for the
- Char-TXT server. [Skotlex]
- * Fixed the can-act delay never being checked when requesting to use
- Homunculus Skills. [Skotlex]
- * Fixed warmth skills draining SP of the target, not the caster. [Skotlex]
- * When TK_DODGE triggers, it will no longer delay your attack or movement.
- [Skotlex]
- * Estimation /Sense/ whatever will no longer hide the vit bonus to mdef2,
- as reported by Playtester. [Skotlex]
- * Updated Summon Flora to summon the max number of possible plants on one
- cast. It will consume as many bottles as monsters summoned. Also cleaned up
- the function to be usable by non players. [Skotlex]
- * Shadow Jump no longer goes over walls. [Skotlex]
- * battle_calc_gvg_damage will be invoked in gvg maps regardless of woe
- time. [Skotlex]
- * NPC_MENTALBREAKER now zaps matk*lv SP based on observations by Tharis.
- [Skotlex]
- * md->class_ will be changed on mob-class-change to fix all class-change
- related bugs. On respawn, the spawn data will be used to revert to the
- original class. [Skotlex]
- * Improved the pet skillbonus timer for "eternal bonuses" cases where the
- bonus delay is 0. [Skotlex]
-2006/09/13
- * SC_CHANGE cannot override itself anymore. This fixes being able to
- "recast" the skill while it's still active to lengthen the duration AND
- reheal the target. [Skotlex]
- * Changed a bit the dnsbl lookup in the login servers to make it faster.
- [Skotlex]
- * Moved the pc rate modifiers from items
- (hp/sp/matk/hit/flee/cri/flee2/def2/mdef2/def/def2/speed) from
- status_calc_bl_sub_pc to status_calc_pc, as it simplifies code vastly, and
- also fixes Osiris card not applying to said bonuses. [Skotlex]
- * Fixed pc_damage_delay_rate not working, thanks to Orn. [Skotlex]
- * Modified the nocommand mapflag so you can specify the GM range that is
- blocked from using commands (eg: "prontera.gat mapflag nocommand 40"
- disables commands to characters in the GM range 0~39) [Skotlex]
- * Modified the char-server TXT whisper system to use the online_db to know
- to which map server forward whispers, instead of just sending the whisper
- to every map server. [Skotlex]
- * Readded the setting TCP_NODELAY on socket.c to see if it fixes the
- walk-lag issue. [Skotlex]
-2006/09/12
- * Modified the login SQL server so that case insensitive lookups use "where
- name = BINARY 'name'" instead of "where BINARY name = 'name'", since this
- way the name index should be used, and performance will no longer be
- heavily affected. [Skotlex]
- * Modified main.sql to add 4 missing indexes (thanks to ErkDog): char_id on
- the tables memo/friends, and online/name on the char table. Added
- upgrade_svn8728.sql to add these indexes to already existing tables.
- [Skotlex]
- * Updated convert_engine.sql to use TYPE instead of ENGINE to be compatible
- with Mysql 4 installations. [Skotlex]
- * Moved the morph restrictions from skill_additional_effect to
- mob_class_change, so that SA_MONOCELL will not convert clones, emperium, or
- treasure boxes. [Skotlex]
- * Fixed 'range' might be used uninitialized warning [Toms]
- * Added Jaguar's sql script to convert all tables to MyISAM. It's located
- in sql-files/convert_engine.sql WARNING: Using MyISAM is much faster than
- InnoDB, but you are strongly recommended to backup your database before
- switching engines since we don't know if eA is fully coded to work
- correctly with MyISAM yet. [Skotlex]
- * Added manual deletion of sc_data entries when deleting a character
- (char-SQL) [Skotlex]
- * Updated main.sql to use pure MyISAM tables, removed all foreign keys.
- [Skotlex]
- * Updated battle_switch to use strncmpi instead of strcmpi, it makes it so
- using "yessir" will match "yes", this is actually needed because if you set
- a config setting to "yes " (notice the trailing space), then the map config
- engine fails to read it right, and will set the config setting to 0 (no).
- [Skotlex]
- * Some corrections to hate_mob cleanup when triggering the Angel stuff. [Skotlex]
- * Updated the show_mob_info setting to add another space to the separating
- pipes, so that each field is separated by " | " instead of " |". [Skotlex]
- * Homunculus intimacy will go back to 500 on evolution. [Skotlex]
- * Baphomet splash damage will now hit nearby enemies regardless of flee
- (but the initial attack still has to connect for the splash to trigger)
- [Skotlex]
-2006/09/11
- * Modified set_nonblocking and setsocketoptions in socket.c, using eApp's
- code as reference. Hopefully should improve performance somewhat. [Skotlex]
- * Added a comment explaining what a comment is to login/char/map config
- files, as well as the main script config file. [Skotlex]
- * Modified SG_FEEL so that it works the same way that in Aegis
- (packet-wise) [Skotlex]
- * Added a comment to explain how to "remove" a string variable from the
- msg_athena entries. [Skotlex]
- * Summoned and slave mobs won't show up on @showmobs anymore. [Skotlex]
- * Moved Spider Web damage bonus from battle_calc_damage to battle_attr_fix,
- so that damage will be doubled based on the actual attack element.
- [Skotlex]
- * Adjusted autospell cards to trigger only on physical weapon attacks.
- [Skotlex]
- * Adjusted a bit the heal code, it should now show either the full heal
- amount, or 0, depending on whether the target was healed at all or not
- (this also means it shows 0 if you try to heal a full-life character.. but
- it's the closest I've gotten to make it display 0 on Berserked chars)
- [Skotlex]
- * Memorize will be consumed even on instant cast spells now. [Skotlex]
- * Berserk will end now if hit and remaining hp is less or equal to 100.
- [Skotlex]
- * Guild Aura will be removed on sc-load to prevent Guild Masters from
- getting that bonus from the old implementation. [Skotlex]
- * Added D-Kalck's fix of the TXT -> SQL converter [Playtester]
-2006/09/10
- * Thanks to KarLaeda, added missing function in @showmobs [Lupus]
- - Script function 'query_sql': In the TXT version it doesn't fill the array
- and always return -1. Added for scripts compatibility. Your scripts
- won't crash in TXT version. They can work it around.
- I suggest we need a function getversion()
- * Updated item_db.sql and mob_db.sql [Playtester]
-2006/09/09
- * Added a crash protection in case mapfreeblock unlock tries to free a null
- pointer. [Skotlex]
- * Moved perfect_hiding from state to special_state, so that it clears out
- when you remove your pet. [Skotlex]
- * Probably fixed the Taekwon Rest skills. [Skotlex]
- * Fixed a npc-timer memory leak on npc_unload ("[Warning]: ers_obj_destroy:
- X entries missing, continuing destruction. Manager for entries of size
- 16.") [Skotlex]
-2006/09/08
- * Unified the rest and ganster paradise code into a single function.
- [Skotlex]
- * Moved the Happy State trigger to the regen function, it now triggers at
- the same time SPTIME does. [Skotlex]
- * Cleaned up SG_HATE, hope it works now. [Skotlex]
- * Removed sg_miracle_skill_duration, replaced it with
- sg_miracle_skill_min_duration and sg_miracle_skill_max_duration, to specify
- a range for the duration of the skill. [Skotlex]
- * Added upgrade_svn8675.sql in case, for some reason, your guild table
- still has the emblem_data field as a 'blob' with "NOT NULL" specified.
- [Skotlex]
- * Fixed alliance/opposition making not cancelling out map-server-side when
- the guild already had max number of alliances/oppositions (thanks to k3dt)
- [Skotlex]
-2006/09/07
- * Fixed SC_BERSERK setting Hp to 100 when dispelled by unnatural means (eg:
- wand of hermod) [Skotlex]
- * Cleaned up the doridori parse clif function. [Skotlex]
- * Merged some of mpeg's work on NJ skills [Skotlex]
- * Removed the Warmth "stacking" code. [Skotlex]
- * Added back the effect of /doridori to skill-SP regen [Skotlex]
- * Implemented a rough version of Angel of the Sun/Moon/Stars, it has a low
- chance of triggering on doridori-boosted SP-regen events. However, it has
- no client-side messages yet (need to add these in) [Skotlex]
- * Added sg_angel_skill_ratio to specify rate at which the Angel skill
- triggers. [Skotlex]
- * Added unit_cancel_combo which takes care of ending a combo time and
- resuming normal attack 'inmediately' [Skotlex]
- * Cleaned up some the SG_HATE code, you can't change hate targets anymore.
- [Skotlex]
-2006/09/06
- * Fixed the memset in status_calc_pc, corrects some mysterious bugs such as
- item-drop bonuses suddenly not working anymore. [Skotlex]
- * Corrected SC_INCREASEAGI and SC_DECREASEAGI speed-change formula.
- [Skotlex]
- * Fixed Aex Aeterna ending on Soul Breaker's first half. [Skotlex]
- * Applied Orn's modification on speed increases/reductions with increase/
- decrease agi [Toms]
-2006/09/05
- * Removed setting mob_show_hp, it's been replaced now by mob_show_info,
- which can be used to specify what kind of info should be displayed from a
- mob. Current options are two different formats for Hp display, and current
- level (monster.conf). [Skotlex]
- * Fixed Signum Crucis Def reduction being 10+2*lv% instead of 10+4*lv%
- [Skotlex]
- * Applied the Ultra Mage's suggestion to have the map server strip trailing
- spaces/comments from the config files. It will also now print out when an
- unknown config setting is found. [Skotlex]
- * Fixed status change resistance not being invoked at all for pretty much
- all cases. [Skotlex]
- * Corrected SC_INTRAVISION not starting. [Skotlex]
- * Fixed crash when attempting to read a Label as a string on a script
- (thanks to End of Exam) [Skotlex]
- * Fixed possible crash when changing a chat-room's owner (thanks to End of
- Exam) [Skotlex]
- * Fixed dispell removing SC_NOCHAT [Skotlex]
- * Small fix which should correct skill_attack damaging hidden characters
- when it shouldn't. [Skotlex]
- * Fixed connect_until field being a smallint rather than int in the login
- table (upgrade with upgrade_svn8630.sql) [Skotlex]
-2006/09/04
- * Fixed crash when using Adaptation during an Encore. [Skotlex]
- * Should have fixed manner being reset to 0 on logout while muted.
- [Skotlex]
- * Removed status_get_sc_tick, duration and chance are now both handled by
- status_get_sc_def (this means status change duration and success rate
- both will always follow the very same formula) [Skotlex]
- * Fixed mob-kill experience getting screwed up when characters who did
- damage die/logout at the moment the mob dies. [Skotlex]
- * Should have fixed "sleep", thanks to Lance for figuring out the error.
- [Skotlex]
- * SC_REFLECTSHIELD will now be passed to devoted characters at cast-time.
- [Skotlex]
- * Added a check to make a mob's level 1 if the read level from the db is
- less than it. [Skotlex]
- * status_calc_misc will now be invoked in status_calc_bl even on the first
- call, since status could have gone up due to skill bonuses. [Skotlex]
- * Moved max HP/SP calculations to before invoking status_calc_misc
- [Skotlex]
- * Simplified distance and check_distance to use "aegis" methods (greater of
- dx/dy = distance), there's a new define in map.h called CIRCULAR_AREA, when
- set, the previous method is used, and "for each in range" calls will also
- check for distances, making most ground skills and battle system use real
- circles instead of squares. [Skotlex]
-2006/09/03
- * Fixed SC_BERSERK's no regen penalty lasting pretty much forever.
- [Skotlex]
-2006/09/02
- * SC_REGENERATION's val4 now holds the RGN flag of what is blocked rather
- than blocking all types of regen. [Skotlex]
- * LK_BERSERK will now only block natural regen on state-end. [Skotlex]
- * SC_EXTREMITYFIST/SC_DANCING/SC_EXPLOSIONSPIRITS will only block natural
- sp regen and not skill regen [Skotlex]
- * SC_REGENERATION blocking will be cancelled on logout now. [Skotlex]
- * Corrected SCB_LUK not updating SCB_BATK as well. [Skotlex]
-2006/09/01
- * Corrected script_commands description of getequipid, it returns -1, not 0
- on fail. [Skotlex]
- * Fixed the mob-id check during pet_db loading, it will also now print when
- a pet is not loaded due to having an invalid mob class specified. [Skotlex]
- * The "delete_timer error/no such timer" report will now print the related function [Toms]
- * The Clearing unused stack report will now print the related NPC [Toms]
- * The duplicate npc report will now print the related file name [Toms]
- * Added config setting "partial_name_scan", which specifies whether @ given
- names should use a partial string lookup or absolute name lookup. Defaults
- to no (gm.conf) [Skotlex]
- * Expanded status_calc_misc so it may also calculate the batk of characters
- as well as their regen data (if they have it) [Skotlex]
- * Fixed a memory leak when using charsave_method:1 [Skotlex]
- * Soul Breaker will now be affected by Lex Aeterna on both parts of the
- attack. [Skotlex]
- * Status changes with no skill and no SCB* data will now go through if they
- have an SI* icon. This should fix SC_MIRACLE [Skotlex]
- * Reverted switching a mob's adelay/amotion when the later is longer than
- the former, now both get updated to amotion. [Skotlex]
-2006/08/31
- * Moved the intimacy penalty of HFLI_SBR44 and HVAN_EXPLOSION to
- skill_counter_additional_effect [Skotlex]
- * Simplified skillnotok_hom by using an invocation to skillnotok [Skotlex]
- * Hopefully fixed BD_ADAPTATION [Skotlex]
- * Homun won't lose any intimacy on death now. [Skotlex]
- * Homun will be saved together with the master now (as long as the homun is
- active) [Skotlex]
- * Modified the error reporting in map_freeblock_unlock so that when there's
- an error, the reported line number is the file's linenumber plus the
- object's type *10000. This is for debug information to help track down the
- already-freed error. [Skotlex]
- * pc_adopt will now preserve the kid's job/job-level/experience. This means
- that if you adopt a Swordman level 45, it will become a baby-swordman level
- 45, with the exact same exp as before. [Skotlex]
- * Fixed new mob's name not sent to the client when the mob is morphed [Toms]
- * Added setting attack_walk_delay which specifies whether a character
- should (or not) be able to move inmediately after starting a normal attack
- (battle.conf). Defaults to 0 since that's what Aegis uses. [Skotlex]
- * Fixed @summon's delete timer being screwed up. [Skotlex]
- * Cleaned up a bit the summon script command. [Skotlex]
- * Fixed the clone script command's delete-timer being screwed up. [Skotlex]
-2006/08/30
- * Skill required-state will now only be checked on cast-begin, not
- cast-end. [Skotlex]
- * Added a check in status_calc_pc to prevent player rate adjustments from
- from going below 0. [Skotlex]
- * Removed sending normal-damage packets instead of skill packets for
- splash-damaged skills, since... well, that's how Aegis does it. [Skotlex]
- * Updated HLIF_CHANGE to work as explained by Tharis -> It now adds 30*lv
- vit and 20*lv int, is dispelled on warp, and can-act delay is 5+5*lv
- minutes. Hp/Sp is no longer set to 10 after a forced expiration. [Skotlex]
- * Fixed up char-sql compilation. [Skotlex]
- * Added a message to @clearweather stating when climate changes will
- dispel. [Skotlex]
- * Corrected @hidenpc saying that it's command name was "@npcoff" [Skotlex]
- * Updated itemdb reading on the char-sql server so that it reads both
- item_db and item_db2 files (totally untested yet) [Skotlex]
-2006/08/29
- * Added printing out whenever the irc-module attempts to connect, to debug
- whether the map-server lag is due to this or not. [Skotlex]
- * Mobs will now always chase players using hard-path seeks. [Skotlex]
- * monster_ai&1 now only signals whether mobs should update their target
- cell while chasing more frequently (rather than being state-driven like
- Aegis) [Skotlex]
- * Changed the defaults of view_range_rate and chase_range_rate to 120 to
- aproximate better Aegis's view ranges (which are square areas and not
- circles) [Skotlex]
- * Applied Mpeg's work on GS [Toms]
- ( http://gpegon.free.fr/ea/gunslinger_08-29-06_mpeg.txt )
- * Fixed a syntax error in @showmobs [Toms]
- * Added @showmobs. It shows selected mobs on your mini-map (excluding
- mini-bosses & MVP) thanks to KarLaeda for the command [Lupus]
-2006/08/28
- * Modified the dancing code and Moonlit Petals in particular, so that it is
- treated as an ensemble like any other, it will just knockback people when
- they step into it. [Skotlex]
- * The memory leak reports will now print out in the logs also the revision
- they belong to. [Skotlex]
- * Cleaned up the scriptable npc-shop code, it should be crash-proof now.
- [Skotlex]
- * Added TK level-up buffs to SG too, and extended them to 10 min [DracoRPG]
- * Added "Barefeet Mastery" effect to TK_RUN (thanks Tharis for both) [DracoRPG]
- * Changed the produce_db format, now there's a skill-lv column right after
- the skill-id column to specify required skill-level to craft this item.
- [Skotlex]
- * Modified the skill produce_db code to take into account the new skill-lv
- requirement. [Skotlex]
- * Fixed exp bonuses applying twice for the job-exp [Skotlex]
- * @reloadbattleconf will now also update the ragsrvinfo table on the
- char-server. [Skotlex]
- * Fixed homun hp/sp growth rates stacking with HP/SP passive increasing
- skills. [Skotlex]
-2006/08/27
- * Fixed undefined reference to 'malloc_set' in log.c [Toms]
- * Updated svn-revision reading, now it can read the new svn file system [Toms]
- * Fixed a bug with homunc which could spawn on a non-walkable cell [Toms]
-2006/08/26
- * Optional macro MEMSET_TURBO for faster low-level memory initializations. [Lance]
- * Small bug fix in read_homunculus_expdb (a warning was always displayed) [Toms]
- * Small adjustment on the mob_ai code which could fix mobs not chasing you
- if you hit them from the maximum possible diagonal distance. [Skotlex]
-2006/08/25
- * Cleaned some the skill unit removal added flag so that it signals whether
- the skill is being force-removed, or it has "naturally expired". [Skotlex]
- * The following skills will display a normal attack animation now:
- NPC_WATERATTACK, NPC_GROUNDATTACK, NPC_FIREATTACK, NPC_WINDATTACK,
- NPC_POISONATTACK, NPC_HOLYATTACK, NPC_DARKNESSATTACK,
- NPC_TELEKINESISATTACK, NPC_SPLASHATTACK
- * Skills that require a weapon and consume spirit spheres will no longer be
- auto-tagged to require ammo. [Skotlex]
- * Now MISC skills with delay 0 will also use the attack delay (if the skill
- is tagged to do damage) [Skotlex]
- * Added script commands roclass/eaclass to enable scripts to access eA's
- job format. Read script_commands.txt and ea_job_system.txt for a more
- complete explanation of how this job system works. [Skotlex]
- * Added a flag to skill_delunitgroup, skill_delunit & skill_unit_onlimit.
- If 1 is passed, it will avoid UNT_WARP_ACTIVE to be transformed in
- UNT_WARP_WAITING and will destroy it. [Toms]
- ( To avoid such crash : http://www.eathena.ws/board/index.php?showtopic=114102
- when the code need an empty slot and the oldest one is UNT_WARP_ACTIVE )
-2006/08/24
- * Little cleanup on homunc's code [Toms]
- * Modified @reloadmobdb & @reloadskilldb to reload homunc's db too [Toms]
- * Now when a mob's adelay is set to be less than the amotion, both values
- will be swapped (this is an attempt to understand how those mobs actually
- work on aegis) [Skotlex]
- * script command "isrefine" will no longer return always false for equip
- positions above 6 (this has not been needed since the addition of the
- refine column to tbe item_db many months ago) [Skotlex]
- * Added NPC_CRITICALSLASH to the list of skills that display as a normal
- attack. [Skotlex]
- * Reverted the previous change, changed the pet capture code to try to
- capture a mob based on their view class rather than actual class.
- [Skotlex]
- * Fixed the md->class_ variable not being updated when a mob's class is
- changed. [Skotlex]
- * Added setting clear_skills_on_warp to specify when a character's
- land-based skills are deleted when the caster changes maps. Defaults to all
- types. [Skotlex]
- * Should have fixed Brandish Spear not passing the flag to skill_attack,
- causing it to do miserable damage. [Skotlex]
- * Warp Portal will no longer be removed when caster steps through it (this
- is left to the new clear_skills_on_warp setting) [Skotlex]
- * Cleaned up status_percent_change to switch equations when the target has
- high hp to prevent overflows, also it will directly take hp/maxhp when a
- rate of 100 or higher is passed to prevent calculations. [Skotlex]
- * Traps and Land Elemental fields are no longer automatically removed on
- map change (handled now by clear_skills_on_warp) [Skotlex]
- * traps_setting &2 no longer does anything (handled now by blah blah)
- [Skotlex]
- * Applied some change from mpeg on Ninja Skills [Toms]
- * Put HVAN_Explosion based on max_hp instead of current hp [Toms]
-2006/08/23
- * Fixed mob_clone_spawn completely ignoring the mode variable. [Skotlex]
- * Fixed Energy Coat reducing and consuming more than it should when you
- have 100% SP [Skotlex]
- * Cleaned up getmapxy script function, also added support for type 4 so
- that it returns a player's homunculus position if such exists. [Skotlex]
- * SC_ARMOR_ELEMENT looks like gone away from status_change_start since ... rev 6791.
- Try to reimplement it. [Toms]
- * Fixed HVAN_EXPLOSION [Skotlex]
- * Frost Nova won't display a nodamage skill packet (still need to sort out
- a way to fix the splash damaged packets) [Skotlex]
- * Fixed a possible SIGSEGV on buildin_maprespawnguildid if the map is unknown [Toms]
- * Added debug on "Inifity loop" to know which script is making this loop [Toms]
-2006/08/22
- * More fixes to the splash code. Kamaitachi and Sharpshooting should
- display correctly now. [Skotlex]
- * Fixed a crash on the mobspawn script command. [Skotlex]
- * Made SC_FLEET increase batk as well as watk. [Skotlex]
- * Fixed gcc warning [Toms]
- * Fixed AM_REST not closing the homunc status window [Toms]
- * Fixed SC_NEN according to Mpeg [Toms]
- * Added a ShowStatus("Terminating...\n") on login-server_sql [Toms]
- * Some corrections to make Tatami Gaeshi work correctly. [Skotlex]
- * Fixed SBR44 doing 100% more damage than it should. [Skotlex]
- * Some more work on the splash skill code. Now splash-damaged enemies
- should show no animation at all, just the damage-number, while only the
- targetted character should still display the full skill animation.
- [Skotlex]
- * Modified the homun-txt file-save format to separate the name from the
- rest of fields with tabs (like character saving does), this may fix homun
- save/loading when using non-latin characters on the name, but be warned
- that it also means the previous homun-data files are lost! (unless you
- replace the comma before the start of a name with a tab) [Skotlex]
- * getnameditem will now also work on stackable items [Skotlex]
- * Corrected battle_calc_weapon_attack so that all skills ignore your
- left-hand weapon, and that the Katar's double-attack damage bonus for the
- offhand damage applies ONLY on normal attacks. [Skotlex]
- * Fixed Resurrect Homunculus's % to 20*lv% [Skotlex]
- * Added SQL update which should remove \' from guild names [Toms]
- * Added option to disable character deletion of certain levels [Lupus]
- check char_athena.conf for this option format
-2006/08/21
- * Some more cleaning up of the splash skill code. Now the passed hit value
- for the splash targetted mobs is 9 instead of 5, this allows multi-hitting
- splash skills to display the number of hits correctly. [Skotlex]
- * Fixed call homunc bug when the homunc was vapo and the master has change
- of map [Toms]
- * Fixed SQL-Guild Creation, guild name was escaped 2 times [Toms]
- * Some cleaning of the splash skills. Updated skill-attack to enable again
- passing of flag 0xF000 which signals that the skill level sent to the
- client should be -1 (no skill name shouted). Should (hopefully) clear/clean
- up a bunch of splash damage skill animation-related packets. [Skotlex]
- * Homun saving won't cap hp/sp to max hp/sp since a homun can have higher
- hp/sp than the one stated in the db (due to skill bonuses or status
- changes) [Skotlex]
- * Cleaned up some more the regen_data structure, so that
- skill/sitting-skill related data is optional (since only players have it).
- [Skotlex]
- * Fixed AM_RESURRECTION, thanks to RockmanEXE for %HP values [Toms]
- * Fixed HAMI_CASTLE, HAMI_DEFENCE & HLIF_AVOID [Toms]
- * Adjusted Glittering's success rate to 20+10*lv% [Skotlex]
- * Corrected isequipped() so that cards will not be tagged as "used up"
- unless all the specified items were found. [Skotlex]
- * Fixed a confusion in skill_attack using the src instead of dsrc for some
- calls, which was causing some problems with the KAITE check from AoE
- spells. [Skotlex]
- * Fixed ASC_BREAKER's misc damage part not having the ignore-element flag
- set. [Skotlex]
- * Moved homunc battle conf from misc.conf to homunc.conf [Toms]
- * Some cleaning in skill.c in regard to homun skills. [Skotlex]
- * Madness Canceller now stacks with other aspd bonuses, just like Berserk
- does. [Skotlex]
- * Removed config setting "muting_players", and expanded the manner_system
- config to specify how having negative manner (mute) affects a player (see
- battle/misc.conf). [Skotlex]
- * Expanded the pk_mode setting from no/yes to 0/1/2. 1 is normal pk_mode,
- if 2 is used, it makes killing players give you a loss of 5 manner points.
- [Skotlex]
- * Fixed WS_WEAPONREFINE always failing when at less than job 50. [Skotlex]
- * Fixed the Autosave routine not working when there's only one player
- online. [Skotlex]
- * Disabled command @rain since the client no longer supports it anyway.
- [Skotlex]
- * Fixed delitem not checking for the first slot's card, also optimized it
- so that it doesn't checks on the other slots. [Skotlex]
-2006/08/20
- * Added a check during mob_db loading so that the six basic stats, max hp
- and max sp are never below 1, as this could cause crashes when using
- certain skills. [Skotlex]
- * Gravitation now only blocks the caster from using potions. [Skotlex]
- * Corrected Madness Canceller letting you walk while the effect lasts.
- [Skotlex]
- * Splitted yet again ASC_BREAKER into a two-part attack. This time the
- int-based damage is a MISC type attack, and gets reduced by skills as such.
- [Skotlex]
- * Fixed "int format, long unsigned int arg" warning [Toms]
- * Fixed a warning when using cap_value(x, 0, x) on an unsigned value [Toms]
- * Added clif_skill_fail for homunc to skill_castend_id & skill_castend_pos [Toms]
- * Fixed homunc skill 8016 not considered as homunc skill [Toms]
- * @useskill will now cause your homun to use the skill instead of you if
- the skill is a Homun skill and you have an active homunculus. [Skotlex]
- * Reduced the Success Chance of GS_FLING to 10+10*lv% (Playtester told me
- that Vicious told him the chance was much lower like that) [Skotlex]
- * Fixed some Homunc issues with HR servers (capping some values) [Toms]
- * Added @hominfo command to obtain real values (not capped ones) [Toms]
-2006/08/19
- * Fixed @homlvup bug [Toms]
- * Fixed AM_REST & AM_RESU consumming SP if they fail [Toms]
- * Fixed homunc spawning bug (they was spawned after an AM_REST + master warp for example)[Toms]
- * Fixed GS_GROUNDDRIFT [Skotlex]
- * Increased chance of GS_DESPERADO connecting to 20% [Skotlex]
- * Fixed battle_calc_base_damage being called for the left hand even for
- non-dual-wielding attacks. left-hand damage was being set to 0 later
- anyway, so no exploit existed. [Skotlex]
- * Moved the weapon_atk_rate bonus to battle_calc_base_damage so that it'll
- apply correctly when dual-wielding different types of weapons. [Skotlex]
- * Fixed job-mask 0x100000 in the item_db enabling Dancers/Bards to use the
- items (0x80000 should be for them and 0x100000 should be currently unused)
- [Skotlex]
- * Fixed a possible sigsegv when deleting lif under Mental Change [Toms]
- * Fixed HAMI_CASTLE [Toms]
- * Fixed HLIF_CHANGE [Toms]
- * Updated HLIF_BRAIN skill [Toms]
- * Fixed homunculus intimacy on feeding [Toms]
- * Added homunculus_friendly_rate battle config [Toms]
- * Some compilation warnings fixed [Toms]
- * Added skill's required item check on homunc skills [Toms]
- * Add Condensed Red Potion as a required item for HLIF_HEAL [Toms]
-2006/08/18
- * Little code cleanup on last fix [Toms]
- * Fixed HLIF_HEAL healing the homunc instead of the master [Toms]
- * Fixed HLIF_AVOID not increasing walk speed of master [Toms]
- * Fixed the atk_rate (Turtle General Card) bonus not working on
- dual-wielders. [Skotlex]
- * Made HLIF_HEAL a self skill that auto-selects target to caster's master.
- [Skotlex]
- * Implemented SC_BLOODLUST and SC_CHANGE, cleaned up HLIF_CHANGE [Skotlex]
- * Applied a correction to HVAN_EXPLOSION [Skotlex]
- * Fixed Homun ASPD calculation being able to underflow and give you min
- speed. [Skotlex]
- * Added monster_ai&128 to make aggressive mobs ignore that behaviour of
- always picking Homun targets above player targets regardless of who is
- closer. [Skotlex]
- * Fixed homun info packet being unable to display HP/SP correctly once the
- values are above 32k. [Skotlex]
- * Applied Mpeg's work on ninja [Toms]
- * Fixed @homlvup [Toms]
- * Added guild_aura (skill.conf) setting so you can specify when it works
- and if it works on the guild-master itself. Defaults to working all the
- time on everyone except GM. [Skotlex]
- * Little code cleanup [Toms]
- * Cleaned merc_hom_evolution to avoid free'ing/realloc'ing [Toms]
- * Fixed "args of aFree is freed pointer" on Homunc deletion [Toms]
- * Changed unit_free so that it receives which cleartype should be used when
- the character is still on a map. Used this on status_damage so that mobs
- that do not respawn when killed will properly display the death animation.
- [Skotlex]
- * Fixed Energy Coat consuming 10x less SP per hit than it should.
- * Fixed signed/unsigned comparison issues with natural heal system [Toms]
-2006/08/17
- * Vaporize will no fail when the homun is dead. [Skotlex]
- * Corrected thhe double free issue that occurs when a homun dies and has no
- intimacy left. [Skotlex]
- * Fixed the charsave_method:1 saving/loading exp as signed ints rather than
- unsigned. [Skotlex]
- * Applied use of structure regen_data for a unified regen module. Natural
- and skill-heal is handled by this structure, while sitting-skill-heal is
- still player dependant (mostly because the other object types can't sit)
- [Skotlex]
- * Cleaned up the status calc code for homun by moving it from
- status_calc_bl_sub_homun to status_calc_homun (where it should had always
- been) [Skotlex]
- * Updated SQL files [Playtester]
- * Corrected map_random_dir algorithm [Toms]
- * Fixed homunc natural heal and little code cleanup [Toms]
- * Changed AM_CALLHOMUN Skill to spawn the homunc at 1 cell from his master [Toms]
-2006/08/16
- * Fixed being unable to recast Adrenaline Rush to reset the duration
- timers. [Skotlex]
- * Cleaned up skill_get_range2 so that using range 0 for non-self skills
- uses the caster's attack range. [Skotlex]
- * Fixed AM_CALLHOMUN checking for an embryo when you have a vaporized
- homun. [Skotlex]
- * Spirit of Wizard will now consume an item 7321 each time it blocks
- reflected magic. [Skotlex]
- * Added script command jobname, retrieves a given's class name as per the
- appropiate msg_athena.txt entry (this command should had been added years
- ago) [Skotlex]
- * Fixed null-pointer crash on Evolving a homunculus. [Skotlex]
- * @produce now can make any kind of equipment [Skotlex]
- * Made HLIF_AVOID and HAMI_DEFENCE cause the status change on both caster
- and target. [Skotlex]
- * AM_REST shouldn't be checking for a range now (since it's a self skill)
- [Skotlex]
- * Updated mob_ai so that mobs will use their rude-attacked skill when they
- can't reach their current target. [Skotlex]
- * Fixed the default txt config making pets be saved to the homun file
- instead of to the pet file. [Skotlex]
- * Now arrow-consuming skills where your main weapon is a whip or musical
- instrument WILL count as arrow-type attacks, using the atk of the arrow and
- all related bonuses. [Skotlex]
- * Fixed some homun timer initialization code. [Skotlex]
-2006/08/15
- * Applied multiple fixes which should take care of making homun save/load
- work on TXT now. [Skotlex]
- * Added Gatling Fever's batk bonus. [Skotlex]
- * Some cleaning in status_damage which should prevent trying to free
- already free'd pointers when unit_remove_map invokes unit_free (when
- status_damage was going to invoke unit_free anyway) [Skotlex]
- * Delete homunc's skills from sql when the homunc is destroyed [Toms]
- * Homunc Timers should be disabled when the homunc is vaporized or dead an re-enabled on call/resu [Toms]
- * Updated vc-project files to compile with the new int_homun files.
- [Skotlex]
- * Hopefully fixed the crash when using charsave_method = 1 [Skotlex]
- * Moved s_pet structure from map_session_data to pet_data, this enabled the
- removal of a few redundant values in the pet_data structure (name, class,
- equip) [Skotlex]
- * Cleaned up some of the pet related @/# commands, same for some script
- commands. [Skotlex]
- * Pet offensive skills who's inf value is self will be casted on the pet
- now (for stuff like Grand Cross) [Skotlex]
- * Added homun saving/loading support to char-TXT. Note that this is
- completely untested, so it may be as good as broken. [Skotlex]
- * Added a crash-fix on status_calc_bl_sub_homun to abort in case the homun
- has no master (need to clean up this function later) [Skotlex]
- * Tested char-txt load/save, it seems to be working fine, but you should
- STILL backup, as I only launched the server (read old character format),
- closed it down (saved into the new format) and relaunch it (read the new
- format) and it didn't give problems (but there's still the possibility of
- some field being read in the incorrect offset or such). [Skotlex]
- * Updated the char save structure for char-TXT servers so that the homun id
- will be saved, now also the map info (last point, save point, memo maps)
- are now saved using the mapindex rather than the string. BACKUP BEFORE
- UPDATING since this code isn't yet tested. [Skotlex]
- * Cleaned up a bit the char-saving code, added overflow crash prevention in
- case there are more memos than the max-allowed saved. [Skotlex]
- * AM_CALLHOMUN can now be used to recall vaporized homuns. [Skotlex]
- * AM_RESURRECTHOMUN will now fail when the homun is vaporized. [Skotlex]
- * Added SCB_DYE which marks which status-changes need a forced cloth dye
- change to 0 due to sprite issues. Currently only NJ_BUNSINJYUTSU's status
- uses it. [Skotlex]
- * Asura Strike now moves you to the target on fail always (unless the
- target does not exists or is in another map or there's a obstacle on the
- way) [Skotlex]
- * Corrected skill_attack_area hitting dead characters on it's splash range.
- [Skotlex]
- * Swapped the values for OPTION_XMAS and OPTION_FLYING. This should enable
- SG to show the fly animation again, even if sometimes others will see him
- as Santa. As for xmas cloth, it shouldn't make much of a difference since
- the view class is changed to christmas anyway. [Skotlex]
- * Made AM_CALLHOMUN and AM_RESURRECTHOMUN be like the wedding skills, where
- they automatically pick a spot around you. [Skotlex]
- * Cleaned up some the AM_RESURRECTHOMUN code. Hopefully it works now.
- [Skotlex]
- * Cleaned up some the hom evolution code. [Skotlex]
- * Fixed SIGSEGV with homunc save [Toms]
-2006/08/14
- * Removed support for negative autosave intervals, instead added a
- minsave_interval setting which specifies which is the minimum time between
- character saves. Default to 100ms (map_athena.conf). [Skotlex]
- * Sacrifice no longer shows damage to self. [Skotlex]
- * When Asura fails, the skill display will still come off. [Skotlex]
- * Lots of cleaning of the Homun-code. Perhaps the crashes as of late will
- be fixed now (reusing AM_CALLHOMUN seems to be the cause of them)
- [Skotlex]
- * Increased Run's walk speed bonus to 25->50% [Skotlex]
- * Modified emergency_call setting to allow for more specific configuration
- (woe/non-woe, gvg-grounds/non-gvg-grounds, disable from nowarpto maps), see
- skill.conf for details. [Skotlex]
- * Fixed script engine allowing scripts to set a player's zeny to negative
- values. [Skotlex]
- * Fixed setting hide_woe_damage making even "miss" attacks seem to connect.
- [Skotlex]
- * When readjusting the fame-list, the last entry's id is also reset (may
- fix characters appearing more than once on it?) [Skotlex]
-2006/08/13
- * Removed @itemcheck as it was totally pointless. [Skotlex]
- * Corrected states killer/killable being easily dispellable. [Skotlex]
- * Fixed the totally wrong text messages being used for @killer/@killable
- related atcommands, added appropiate entries to msg_athena [Skotlex]
- * Magic and Misc attacks will now get type "flee" when they do less than 1
- damage, this blocks them from causing additional status effects when they
- are blocked. [Skotlex]
- * Cleaned up a bit the Basilica code, it should now properly end when you
- walk. [Skotlex]
- * Fixed some logs not working when you enabled all logs. [Skotlex]
- * Corrected unmute being a level 60 command by default (should be 80)
- [Skotlex]
- * Corrected the mapif_parse_PartyChangeMap function to correctly update
- level-range when someone logs on/off, fixes being unable to set even-share
- on once it's been broken even when the characters out of range logoff.
- [Skotlex]
-2006/08/11
- * Fixed Kagebunshin no Jutsu crashing for dyes > 0; though this solution
- might seem hackish (changing clothes colour to 0 when it starts while
- storing original colour back in val4, restoring original dye upon
- end), I believe this is the best way there currently is to solve
- the issue. [blackhole89]
- * Fixed Dancers/Bards being able to use normal attacks while performing.
- [Skotlex]
-2006/08/10
- * Fixed the item group bonus not working. [Skotlex]
- * Fixed songs/dances always being considered overlapped with themselves.
- [Skotlex]
- * Added some additional song/dance overlap code that should correctly
- change the effect of songs/dances when they overlap. [Skotlex]
- * Added a check so that the status-change packet is always send to self
- when the inflicted char is a player disguised. [Skotlex]
- * Code cleanup on homunc, they stay in memory until player disconnect or
- homunc destruction [Toms]
- * Corrected Advanced Jobs HP bonus from 30% -> 25% [Skotlex]
- * Hopefully fixed family-party-even-share not breaking when a member logs
- out. [Skotlex]
- * Should have fixed the login-sql crash when passed user-name's length is
- beyond the limit. [Skotlex]
- * Changed setting attack_attr_none to affect all neutral-element attacks.
- Basicly, this setting is now used to determine who can hit for full damage
- always when using neutral-attacks (defaults to non-players) [Skotlex]
- * Fixed two instances in the login-sql server where the ip in the log-login
- table was being stored backwards. [Skotlex]
- * Now when a skill's range is 0 and the skill is NOT casted on self, it
- will take the basic weapon's range (without Vulture/Snake Eye bonus).
- [Skotlex]
- * Now when a duration is not specified, sc_start/sc_start2/sc_start4 will
- try to guess the duration by extracting it from the skill_db (it uses
- skill_get_time on whatever skill is associated to the status-change using
- val1 as skill-level) [Skotlex]
- * Some cleanups on trade_tradeaccept to prevent packets being resent when
- they shouldn't. [Skotlex]
- * Fixed syntax error in 'guild' create table statement [Toms]
-2006/08/09
- * Fixed Asura not wasting all SP away when it fails on cast-end. [Skotlex]
- * Fixed homunc skill up bug [Toms]
- * Adjusted some the dance/song/encore code so that the source of an
- ensemble will always get checked, so that walking out of an ensemble skill
- should make it end now. However, it's likely this is not completely solved
- yet and will require further tweaking. [Skotlex]
- * Added crash protection to the mob_db txt reading when the mob_db file has
- lines with insufficient number of columns. [Skotlex]
- * Moved the class-change code from battle_calc_weapon_attack to
- skill_additional_effect. Alchemist summons now also have a chance of
- triggering polymorphing. [Skotlex]
- * Removed the code which was auto-setting attacks that do no damage to type
- FLEE, since that was disabling status-effects which should incur even when
- the damage was blocked. [Skotlex]
- * Trade requests will now fail when either character is unable to act
- (character in storage, vending, interacting with an npc, petrified, etc)
- [Skotlex]
- * Heard skotlex voice, changed all msg_table[] into msg_txt() in atcommand.c [Toms]
-2006/08/08
- * Fixed the char-server not invoking the party_calc_state function when the
- third party-member is added to a party, hence failing to check for families
- and disabling even share from them unless all three relog first (state is
- correctly calculated when party is first loaded). [Skotlex]
- * Crash-protections in the mail-checking function. [Skotlex]
- * Some additional parenthesis on equipment check in pc_equipitem, seems to
- have fixed the mid/lower headgear-sprites not showing up. [Skotlex]
- * Added back missing state set to prevent Ankle-Snare from being retrieved
- after the target dies. [Skotlex]
- * Fixed compilation warning [Toms]
- * Added a check to handle Spider Web as a targetted skill. If there's more
- than one character on the targetted cell, a different one may get trapped,
- but it will mostly do as it is now. [Skotlex]
- * Added check to Asura so that it will move you to the target when it fails
- ONLY when you can cast the skill on the target (not stunned, asleep, target
- not hidden, etc) [Skotlex]
- * Changed the map_freeblock_unlock code so that when there's an "already
- free'd pointer" error, the memory manager will print out the invoking
- function rather than map_freeblock_unlock, this should help fix it up next
- time it happens and is reported. [Skotlex]
- * Casting Kaensin will clear out Suiton and viceversa now. [Skotlex]
- * Fixed drop-rates (@whodrops) getting duplicates when you use @reloadmobdb
- [Skotlex]
- * Fixed unjailing not sending characters to Prontera. [Skotlex]
- * Fixed yet again AS_SPLASHER doing full damage on all characters. Now you
- can use the NK split damage value in the skill_db if you want damage
- divided by the amount of targets rather than by 2. [Skotlex]
- * Fixed crash on the battle_drain functions. [Skotlex]
- * Cleaned up HAMI_CASTLE, HLIF_AVOID, HAMI_DEFENCE so that it's usable by
- other types of objects other than Homunculus. [Skotlex]
- * Cleaned up the Asura Strike code so that the SP/Spheres/States is not
- consumed when the skill fails due to Fog of Wall. [Skotlex]
- * When a negative delay for a skill is specified, this delay is now added
- on top of the character's amotion rather than adelay [Skotlex]
- * Modified main.sql to make the guild table allow NULL on the emblem data.
- [Skotlex]
- * Added file conf-tmpl/Changelog.txt to log config changes. [Skotlex]
-2006/08/07
- * Fixed the login-sql server replying to the change-sex packet with the
- wrong gender, causing the char-server to screw-up job-change updates.
- [Skotlex]
- * Cleaned up the apparent mess that is pc_skill. Hopefully it SHOULD work as
- described on the docs now, this should also fix adopting not correctly
- giving the family-related skills. The flag value of skill should be: 0 to
- set the skill (if skill level is 0, this removes a learned skill), 1 grants
- the skill as an item bonus which is temporary, and 2 will add a skill bonus
- like 1, except the skill level adds up to whatever level already known of
- that skill. [Skotlex]
- * Fixed EQP_WEAPON related code messing up with both weapon AND shield.
- [Skotlex]
- * Cleaned up the Asura code so that when the skill fails your
- SP/Spheres/Fury are all taken away always, as well as moving you next to
- the target (as long as the target still exists within a reachable path from
- your position) [Skotlex]
- * SC_GUILDAURA is now removed on logout. [Skotlex]
- * Fixed Venom Splasher doing half-damage instead of full-damage to the
- "exploding" character. [Skotlex]
- * Hopefully fixed the party_even_share cast-overflow bug as reported by
- Adobe. [Skotlex]
- * Standarized the autosave interval setting to be always in seconds
- regardless of type. [Skotlex]
- * Moved the "bosses can't be knockback" logic from battle_calc_* functions
- and placed it on skill_blown. [Skotlex]
- * Some parenthesis cleanup before invoking battle_calc_base_damage, could
- be fixing the current issue with arrow attacks not adding the arrow damage.
- [Skotlex]
- * Fixed the map_search_freecell error which was making mobs fail to
- respawn. [Skotlex]
- * Added in Lupus's suggestion of not making multi-slot headgears set all
- slot view-ids, which supposedly causes the client to re-draw the headgear
- multiple times on characters. [Skotlex]
- * Fixed HT_BLITZBEAT hitting neutral characters when it auto-triggers.
- [Skotlex]
- * Simplified the Tatami Gaeshi code. [Skotlex]
- * Fixed AS_SPLASHER doing full damage on everyone except targetted char
- instead of the other way around. [Skotlex]
- * Fixed KAENSIN clearing out SUITON cells and viceversa. [Skotlex]
- * The spawn area is now seen as range rather than absolute for mob spawn
- lines. This means that x,y,10,10 will spawn the mob on a 21x21 grid around
- the given x,y point. [Skotlex]
- * Some clean up of the mob-spawn code. Now you can specify negative areas,
- so that a spawn location such as 100,150,0,-1 will spawn a mob always on
- x=100, but any Y value of the current map. [Skotlex]
- * Reflected damage will now also have a chance of draining hp/sp. [Skotlex]
- * Adjusted the order in which option/sc change packets are sent to match
- Aegis's [Skotlex]
- * Added script command getpartyleader through which you can retrieve
- various information of a party's leader. See doc/script_commands.txt for
- further information. [Skotlex]
- * mpeg's Ninja work [Vicious]
- * Adjusted Battle_check_target so that alchemist summoned mobs are
- targetted by everyone as long as 1. The top-level master is a player and 2.
- the actual attacker is not a mob-type. [Skotlex]
- * Added config force_random_spawn which overrides the spawn-files defined
- coordinates to make all mobs always spawn randomly on the map. [Skotlex]
- * SC_SPEEDUP0 is no longer dispellable by SA_DISPEL [Skotlex]
-2006/08/06
- * Updated item_db.sql & mob_db.sql to latest. [Toms]
- * Little fixes on homunc (hp/sp are now saved and init stats changed) [Toms]
-2006/08/04
- * Added a commented piece of code at the end of clif_parse_LoadEndAck which
- will update your direction to wherever you were facing before warping.
- Should this be the default? Nearby people DO see you facing on the same
- direction before warping, it's only your client that will always see you
- facing north on spawn (the spawn packet does contain direction
- information). [Skotlex]
- * Updated @mobinfo to display slots in the drop information. [Skotlex]
- * Fixed flag.elefix not being respected in battle_calc_misc_damage.
- [Skotlex]
- * Some code cleanups in battle_calc_damage. [Skotlex]
- * Modified bAddItemHealRate so it can receive both item-id and item-group
- values (since the first item-id is +500, there's no risk of mixing them
- up). [Skotlex]
- * Removed settings enemy_critical_rate, homun_critical_rate. Added settings
- enable_critical (defaults to specify only players), mob_critical_rate and
- critical_rate. The last applies to all non-mobs and non-players
- (battle/battle.conf) [Skotlex]
- * Removed settings mob_npc_warp, mob_warpportal. Replaced with setting
- mob_warp which specifies which types of warp can a mob step into
- (battle/monster.conf) [Skotlex]
- * Enabled Mastery damage on Soul Breaker again, moved adv katar mastery out
- of the mastery function so that it may apply to all skills except Soul
- Breaker. [Skotlex]
- * Changed name of the setting log_pick to log_filter since that's what it
- does now. [Skotlex]
- * Modified enable_logs so that instead of a 0/1 setting, you can specify
- which kind of events to log (so you can use a combination), see log_athena
- for the bitmask configuration. [Skotlex]
- * Cleaned a bit the contents of log_athena.conf
- * Hide/Chasewalk will again stop screaming skill name. [Skotlex]
- * Soul Breaker will no longer receive Mastery damage. [Skotlex]
- * Fixed warning:'type' might be used uninitialized in this function [Toms]
-2006/08/03
- * Added a check to skip the experience share of characters who are dead or
- on another map. [Skotlex]
- * Reverted the previous change, chasewalk has no icon, only the str-bonus
- has that fist icon now. [Skotlex]
- * Allowed chase-walk to display a skill animation when using it. [Skotlex]
- * Readjusted the Chasewalk icon to be as it should be. [Skotlex]
- * GS_DESPERADO is now a short-range attack skill. [Skotlex]
- * Changed the Battle-Orders icon to be the Strength Up icon (for
- Chasewalk's str bonus). [Skotlex]
- * Fixed using the right-hand weapon's size modifiers regardless of which
- weapon's damage was being calculated in regards to. [Skotlex]
- * Simplified the ignore-size check by making the Weapon Perfection check be
- done when specifying the flag, also moved the size-fix property of riding
- spear-knights to status_calc_pc. [Skotlex]
- * Changed SI_CHASEWALK value to 119 as concluded by LoneWolf [Skotlex]
- * Corrected clif.c sending the raw mdef2 value to the client instead of
- first substracting the "secret vit/2" bonus from it. [Skotlex]
- * Added a damage cap to CR_ACIDDEMONSTRATION of INT_MAX/2 to prevent
- overflows. It is not capped to INT_MAX because damage increasing skills
- would cause it to still overflow afterwards. [Skotlex]
- * Fixed NPC_CRITICALSLASH not being considered as a Critical hit by the
- code. [Skotlex]
- * Added RUDE_ATTACKED_COUNT so you can easily adjust how many rude-attacks
- should happen before a mob uses the rude-attacked skill. Value has been set
- to 2 for now. [Skotlex]
- * Now when a mob changes target (to someone they can hit) their
- rude-attacked count won't be reset, but instead will be reduced by one.
- [Skotlex]
- * SC_SPEEDUP0 can now stack with the other speed raising buffs. [Skotlex]
- * Some adjustments so that the last-skill-used will be correctly cleared
- when your combo-time ends. [Skotlex]
- * Fix a bug in atcommand_charspeed [Toms]
- * Fixed a logic error preventing from cooking anything [DracoRPG]
- * Cleaned up the last NJ update code. [Skotlex]
- * Added @ command `charspeed` [Skotlex]
- * Fixed @jailfor using MAP_PRONTERA as jail instead of MAP_JAIL [Skotlex]
- * Removed case for GS_SPREADATTACK on damage packets to see if the skill
- displays correctly now. [Skotlex]
- * Corrected Deluge/Volcano/V. Gale overlaps so that the placing tiles are
- removed, NOT the ones who were already placed. [Skotlex]
- * Made SC_SPEEDUP0 and SC_SPEEDUP1 use different icon IDs, to fix
- icon-confusion when both are enabled at a time. [Skotlex]
- * Mob rude-attacked count is not reset now on picking a new char (gotta
- investigate this further) [Skotlex]
- * Changed atoi to strtoul for guild-experience's field [Toms]
- * Fixed a bug in int_storage.c, temp array doesn't have the good size [Toms]
-2006/08/02
- * Modified yet again SC_SILENCE after iRO tests from Entwined on IRC.
- Silence now ONLY blocks skills from being used, it will not stop on-going
- casts. [Skotlex]
- * Updated status_cast_cancel to also include silence (so the cast bar is
- cancelled if you are silenced during it) [Skotlex]
- * Updated the way SC_SILENCE works. From what I remember (from previous
- forum discussions) it: 1- Always blocks skills from being used. 2- Will
- only block a skill when the cast-bar ends IF the skill is targetted. If
- anyone wants to debate to get this changed, make an appropiate forum topic
- in the svn development area to discuss. [Skotlex]
- * Added a check in the walking code when triggering skills.
- NPC_SELFDESTRUCTION will no longer cancel walking, it will instead resend
- the walk packet, this effectively causes the mob to start walking
- (clientside) while the cast-bar is showing. [Skotlex]
- * Fixed a logic error on battle_get_master which was causing infinite
- loops.. [Skotlex]
- * Fixed homunculus error message [Toms]
- * Rewrote pc_payzeny to not use doubles, it may more accurately prevent
- charging a player more zeny than they can withhold. [Skotlex]
- * Fixed failing to create Deadly Poison Bottles damaging 50% of your max
- life instead of 25% [Skotlex]
- * Added the missing status-change flags to SC_FREEZE to signal it should
- modify def and magic def [Skotlex]
- * Little add on NJ_HUUMA [Toms]
- * Merged Mpeg's work on Ninja skills [Toms]
- * Fixed Martyr's Reckoning having a cap damage of 32k. [Skotlex]
- * Now you can teleport in Thanatos Boss room, but you can't respawn there [Playtester]
- * Fixed Defender Raising Walk speed instead of diminishing it. [Skotlex]
- * Added a check on status-change load to prevent loading speed-affecting
- status when their speed adjustment is 0 (prevents division by zero)
- [Skotlex]
- * Code cleanup & optimization on guild part of char-server [Toms]
- * Fixed script code data not being free'd if a player quits in the middle
- of a script. [Skotlex]
- * Modified run_script so that when there are leaks, it will report the
- place where run_script was called from as source rather than the inner code
- of run_script (for debugging purposes) [Skotlex]
- * Made recursive master check the default (otherwise it messes skill -> pet
- -> player kind of herarchies) and cleaned up some the battle_get_master
- code to prevent infinite loops in the weird case someone specifies that
- their master is itself. [Skotlex]
- * Recoded the GuildAura code to use val3 & val4, allowing much greater stat
- bonuses (in case someone wants to get Guild Skill level 20 or something
- crazy like that) [Skotlex]
- * Updated battle_check_target so that all alchemist summoned mobs can be
- target by everyone. [Skotlex]
- * Cleaned up skill_check_condition_mob_master_sub, it will now count both
- total number of summoned mobs and amount that belong to the same type.
- [Skotlex]
- * Corrected AM_CANNIBALIZE so it will fail if you already have plants of
- another type out. [Skotlex]
- * Using NPC_SELFDESTRUCTION no longer will make the caster stop walking.
- [Skotlex]
- * Removed SI_GUILDAURA, and replaced it with SI_LANDENDOW, now
- Volcano/Deluge/V. Gale will get that funky icon instead. [Skotlex]
- * Changed clif_hominfo to receive both sd and hd as parameters
- * Some redundancy cleaning in mercenary.c [Skotlex]
- * Moved updating of sd->mercenary.hp from merc_damage to pc_makesavestatus.
- [Skotlex]
-2006/08/01
- * Miscellanous fixes which make the Marine Sphere self destruction work as
- best as I can. It only has one flaw: It self-destructs instantly after
- walking because if I make it use self-destruction with a cast-bar,
- client-side the object stops moving inmediately... [Skotlex]
- * Modified unit_walktoxy and NPC_RUN to enable running even when the caster
- does not has the MD_CANMOVE bit on. [Skotlex]
- * PF_MINDBREAKER will now silently fail if you try to use it on someone who
- already has the status active. [Skotlex]
- * Cleaned up yet again skill_landprotector, now new cells of
- Deluge/Volcano/V.Gale will delete previous cells when they are recasted on
- top of each other. [Skotlex]
- * Summoned Marine Spheres no longer get the MD_CANMOVE bit. [Skotlex]
- * Cleaned up some more the SC_JAILED code [Skotlex]
- * merged in atcommands jailfor, jailtime, charjailtime. Thanks to Meruru
- and Coltaro for the code. [Skotlex]
- * Cleaned the code of atcommands jail and unjail [Skotlex]
- * Be warned that the code MAY contain bugs as I adjusted it to save the
- character's position before jailing, allowing the automatic unjailing to
- warp you back to the exact spot you were at before being jailed. [Skotlex]
- * Should have fixed the cooking sets not displaying all cooking available
- items. [Skotlex]
- * Figured out and fixed the issue with Volcano/Deluge/Violent Gale not
- really working. Thanks to Mpeg for noting it out. [Skotlex]
- * Modified Self Destruction, so that Marine Spheres in non-versus maps will
- hurt only enemies, while in all other situations this skill will hurt
- everyone around them. [Skotlex]
- * Expanded setting debuff_on_logout so that &1 removes negative buffs and
- &2 removes positive buffs. [Skotlex]
- * Food status boosts will no longer end on death, but they will end when
- you respawn or logout. [Skotlex]
- * Added battle config file status.conf, moved some settings from skill.conf
- and battle.conf to it since they are entirely Status-Change related.
- [Skotlex]
- * Added the missing lines to enable script command "kickwaitingroomall"
- [Skotlex]
- * Magic Rod's can-act delay will no longer be applied when you absorb a
- spell. [Skotlex]
- * Fixed Don't Forget Me increasing speed instead of decreasing it. [Skotlex]
- * Modified setlabel so that the script engine barks when you are trying to
- use the same label name as a constant or variable name. [Skotlex]
-2006/07/31
- * Fixed the subnet 0 mask being reset to 0 when someone goes up on the fame
- rankings. [Skotlex]
- * Updated Poison React chance to counter and number of counters as per
- skill description updates. [Skotlex]
- * Fixed Sharpshooting being counted as a magic attack, and hence, using
- your MATK as base damage. [Skotlex]
- * Fixed NPC_STOP id value in skill_cast_db [Skotlex]
- * Bladestop will no longer stop when you push either of the characters
- around. [Skotlex]
- * Fixed Enchant Poison having a near 100% chance of poisoning target on
- attack. [Skotlex]
- * Little fix on duel [Toms]
- * Added possibility to restrict duel usage to same map [Toms]
- * Merged mpeg's fix on ninja skills [Toms]
- * Corrected a status_get_race call which should be status_get_race2 in misc
- attacks. [Skotlex]
- * Moved the Devotion code to the top of the SC list in status_damage,
- meaning that now stuff like being asleep or confused won't end if you are
- hit, but the damage is absorbed by devotion. [Skotlex]
- * Added the Soul Link of Rogue speed bonus to Chase-Walk. Since there's no
- information of how much the bonus should be, it currently is a conservative
- 10%. [Skotlex]
- * Fixed a possible crash in the main script engine when restoring previous
- script. [Skotlex]
- * Fixed sleep.tick not being set back to 0 before resuming execution, which
- leads to scripts that are continously executed even when they already ended
- (they do nothing but waste resources) [Skotlex]
- * Fixed a pair of free -> aFree used on stacks, which would lead to memory
- manager reporting leaks where there aren't. [Skotlex]
- * Removed incorrect "Waterball range+1 when standing on suiton" feature.
- [Skotlex]
- * Corrected the Speed update code to prevent sending "walk to xy" packets
- twice when the affected character is a player. [Skotlex]
- * Expanded mob can't move warning to print out where this mob was stuck at
- (map, x,y) [Skotlex]
- * Fixed segmentation fault in status_change_end, vd wasn't initialized [Toms]
-2006/07/30
- * NPC_INVISIBLE will now use Cloaking of a level +9 of the used skill
- level, so that at level 1 they can attack, use skills and receive no
- walking penalty. [Skotlex]
- * Mob casted Sanctuary will no longer always heal it's targets regardless
- of element/race [Skotlex]
- * Status change packets will now use as criteria for sending the actual
- view_class instead of player/not-player. This will fix status-changes
- displaying improperly on clones, and also possible crashes with disguised
- players. [Skotlex]
- * Merged mpeg's fix on ninja skills and SA_VOLCANO,SA_DELUGE,SA_VIOLENTGALE [Toms]
- * Added bNoMiscDamage setting so you can specify misc-damage blocking from
- skills. Modified battle_calc_damage so that even Pressure and similar
- skills will be affected by this setting. [Skotlex]
- * GS skill updates/fixes [Vicious]
- * Force all users offline in sql when char-server starts [Toms]
-2006/07/29
- * Removed ugly struct cast in login.c [Toms]
- * New version of buildin_query_sql which accept more than one column and
- can return the number of rows. See script_commands.txt for more details. [Toms]
- * Fixed nullpo in merc_hom_skillup [Toms]
- * Added a return value to buildin_rid2name if rid is invalid [Toms]
- * Made the SQL ping interval default to 7 hours. [Skotlex]
- * Made skill_unitsetting remove the group when no unit-cells were placed
- down. basicly this means that if landprotector blocks all tiles, the group
- will be removed from memory, preventing said group from counting to the
- total number of skills you can set. [Skotlex]
- * Fixed segmentation fault in script engine when calling something which is not a function [Toms]
- * Fixed segmentation fault in script engine when activating DEBUG_RUN flag [Toms]
-2006/07/28
- * Added Ishizu's code to check ammo type on attack. No more using Grenade
- rounds with Guns. [Skotlex]
- * offensive heal/sanctuary will only happen when the source of the heal is
- a player, mob/pet casted heal will now always heal regardless of target.
- [Skotlex]
- * Shield Chain will now ignore the 'ice-pick' defense piercing bonus.
- [Skotlex]
- * Self destruction will now hit all characters in range, not just enemies.
- [Skotlex]
- * Cleaned up the NJ update code: [Skotlex]
- - Restored code which was removed (stuff like SC_SKA)
- - Fixed possible crashes on some NJ skills if used by non-players.
- - Fixed most NJ magic spells doing more damage than they should.
- - Fixed ZenyNage being able to do more damage than zeny you have.
- - Cleaned up skill setting code for Suiton and Kaensin
- * Some cleaning of battle_drain, Evil Druid card should work now. [Skotlex]
- * Made status_damage allow damaging of objects not on a map, this should
- fix pet-catching making the mob never respawn again. [Skotlex]
- * Casted nothl to (unsigned int) in sprintf functions, IP is 32bits and sql field the same :) [Toms]
- * Fixed "warning: `list' might be used uninitialized in this function" in char/char.c@3032 [Toms]
- * Fixed "uninitialized local variable 'i' used" in skill.c and "warning: suggest explicit braces to avoid ambiguous `else'" in battle.c [Toms]
- * Fixed "warning: long unsigned int format, unsigned int arg" in parse_login (login_sql\login.c) [Toms]
- * Fixed sign warnings in login/login.c [Toms]
- * Fixed "conversion from 'double' to 'int', possible loss of data" [Toms]
- * Fixed "warning: redefinition of [ushort/uint/ulong]" [Toms]
- * Fixed duplicate case value on NJ_SUITON [Toms]
-2006/07/27
- * Fixed a memory leak when there exists more than one user function with
- the same name, added the appropiate warning when this happens. [Skotlex]
- * Added reporting source file when an npc shops item's price is
- exploitable. [Skotlex]
- * The picklog will now record negative values for items sold to npcs.
- [Skotlex]
- * Added inmediate position and hp-bar update when a character joins a
- party. [Skotlex]
- * Added missing SC information to NPC_CHANGEUNDEAD [Skotlex]
- * Added config setting party_update_interval so you can specify how often
- the party-mate minidots should be updated (defaults to 1 sec). [Skotlex]
- * Removed a bunch of broken comments in skill.c [Skotlex]
- * Synced the script.c file with as much data as possible from jA's:
- [Skotlex]
- - A lot of functions were moved around, a bunch of indentation and
- space-usage changes were done to make it easier to diff against their
- files.
- - Miscellanous addition and corrections were applied.
- - Largest one is likely a restructuring of run_script_main, which hopes to
- solve the memory leaks.
- - script engine now uses the setjmp functions to restore memory state when
- there's an error parsing scripts, which means that script errors won't
- cause the map-server to inmediately bail out anymore.
- - NOTE that the amount of changes is pretty extensive, so DON'T USE THIS on
- a live server. Update only to help test and debug to see if the script
- engine memory leaks are gone.
- * Added a cleanup routine on shutdown to remove all characters from memory
- for whom the save ack has not returned from the char-server yet. [Skotlex]
- * Now when you set the guardian's HP, if the guardian is spawned, it's HP
- will be updated accordingly (and if you set it to 0, the guardian is
- killed) [Skotlex]
- * Added functions status_set_hp/status_set_sp to set hp/sp to a given
- value. Applied usage of these on the Berserk and Soul Change code.
- [Skotlex]
- * Added config setting "party_hp_mode" (battle/party.conf) which determines
- method to use to update party-mate hp bars. Aegis style is to update HP
- bars whenever HP changes, while eAthena style is to update it together with
- the map party dots. Defaults to aegis style. [Skotlex]
- * Fixed packet 0x22a having the manner and opt3 packets in inverted
- offsets. [Skotlex]
- * Readded the check which prevents Cloaking from activating when your
- learned level is less than 3 and you aren't next to a wall. [Skotlex]
- * Some cleanups to the Frenzy/Berserk status change, it should probably
- work correctly now. [Skotlex]
- * Removed a redeclared variable i in the parsing of the fame list (char-sql
- server) which seems to be the cause of the random memory corruptions.
- [Skotlex]
- * Updated item_db.sql to latest. [Toms]
- * Fix homunc & code cleanup [Toms]
- - Timer problems on delete_timer
- - Intimacy problem (overflow & new values)
- - Homunc deleted if intimacy < 0
- - base exp is now given to master
- - Homunc sometimes not saved
-2006/07/26
- * Fixed a memory leak when reading the item_db txt. [Skotlex]
- * Applied the necessary changes to make @partyoption reflect it's changes
- on the alt+p window. [Skotlex]
- * Modified party_item_share_type config setting so that using 1 disables
- item-sharing from non-mob loot (player dropped items or pet loot) and 2
- enables round-robin instead of random sharing. Using 3 obviously is
- enabling both 1 and 2. [Skotlex]
- * Added battle_get_master which returns the master bl of a given object.
- [Skotlex]
- * Recoded battle_check_target to use battle_get_master, the src/target
- switch has been split into two, so that actual target and master target are
- seperately treated (same for source). [Skotlex]
- * Added support for "sc_end -1" which will clear all status changes. Added
- the constant SC_ALL so you can use in scripts "sc_end SC_ALL;" instead.
- [Skotlex]
- * @pettalk will now fail when muted. [Skotlex]
- * Enabled changing of equipment while stunned/asleep/petrified/etc [Skotlex]
-2006/07/25
- * Cleaned up run_script_main to properly free previous stack-data when
- running scripts. Note that scripts may still leak memory when run by
- non-players and they don't reach the "END" state, however I am not sure how
- this case should be handled, so it's left as it is for now. [Skotlex]
- * Added a missing ntohl call in the loginlog code. [Skotlex]
- * Added a check when buying from npcs to allow buying of item_avail items.
- [Skotlex]
- * Fixed duel accept invite sending the packet before the duel data is set
- (resulting in a packet that noone receives). Thanks to Toms for finding it
- out. [Skotlex]
- * Fixed a possible crash when you dual-wield and the total damage is 0.
- [Skotlex]
- * Added Toms's perl scripts item_db.pl and mob_db.pl (they are in tools/),
- they convert the txt databases into sql. [Skotlex]
- - Usage: "script" < "input file" > "output file". eg: ./tools/item_db.pl < db/item_db.txt > sql-files/item_db.sql
- * Updated the sql files since now it's quick [Skotlex]
-2006/07/24
- * Re-updated the mob_db.sql to latest. [Skotlex]
- * Cleaned up the skill_landprotector function to correctly block only magic
- skills from being placed on land protectors. [Skotlex]
- * Corrected itemdb_group so that it will not return the random item givers
- (should give priority to actual item groups, so that the item heal bonuses
- work correctly) [Skotlex]
- * Cleaned up the Mistress Card related code so that the no-gemstone bonus
- reduces item requirements by one rather than totally skip them. [Skotlex]
- * Cleaned up the logs "can log"function to use the IT constants. Also
- corrected the "only log large amounts" setting not working on negative
- values (trades). [Skotlex]
- * Adjusted skill_castfix_sc so that Suffragium will get consumed even on
- instant cast skills, but Memorize won't. [Skotlex]
- * BladeStop will now end when either of the characters is moved (knocked
- out?) around. [Skotlex]
- * Moved the Zeny penalty code from respawn to pc_dead. [Skotlex]
- * Added a check to prevent Deluge/Volcano/Violent Gale from being placed on
- top of each other. Reverted the previous 'fix' where atk was being
- increased based on armor element rather than element of attack. [Skotlex]
- * Removed the noreturn mapflag check from script command warp. [Skotlex]
- * Homuculus cleanup [DracoRPG]
- - Replaced nullpo's in parse functions by silent checks
- - Removed server-side effect for menu option 0 (view status window...
- why does the client send us the packet since we don't care? -_-)
- - Rewrote intimacy underflow checks so they are really effective (no
- need to check if an unsigned is < 0, it won't work... check before!)
- * fixed unban unblocking players as well. [Skotlex]
- * Fixed Volcano/Deluge/Violent Gale increasing damage based on element of
- attack instead of defense element of attacker. [Skotlex]
- * Cleaned up the code of Magic Rod, fixed it not giving SP. [Skotlex]
- * Moved the code of Hermod and Basilica to castend_pos2 so it should work
- now. [Skotlex]
- * Modified the code of Ankle Snare so the status ends on unit's time-limit
- rather than when the snared object moves away. [Skotlex]
- * Re-worded the water check of ST_WATER skills. [Skotlex]
- * Allowed sc-cast reductions to be processed even when cast-time is instant
- (to let suffragium end even on instant-cast skills) [Skotlex]
-2006/07/23
- * Modified setting skillrange_by_weapon (skill.conf) to be a
- per-object-type setting instead of yes/no. The default now is that
- weapon-based skills will take the attacker's range for non-players.
- [Skotlex]
- * Changed the default of skillrange_by_distance to include homunculus.
- [Skotlex]
- * Fixed buildin_isequip not working correctly with non-cards. [Skotlex]
-2006/07/22
- * Updated mob_db.sql to latest. [Skotlex]
- * Applied Toms's suggested corrections to homun code. [Skotlex]
- * Corrected Cannibalize/Marine Sphere ignoring the selected summon spot.
- [Skotlex]
- * Fixed looting pets ignoring the item pick-up priority of other players.
- [Skotlex]
- * Should have fixed a signess warning in login txt. [Skotlex]
-2006/07/21
- * Added blocking of @me when muted or in berserk status. [Skotlex]
- * Corrected the @follow timer not being deleted on logout. [Skotlex]
- * Applied the homunculus code fixes provided by Toms. [Skotlex]
- * battle_check_target will now tag homunculus as invalid target when the
- source is a skill-type object. [Skotlex]
- * Added a check on pc_equipitem so that when the client specifies to equip
- a weapon on the right hand when the left hand is available, the weapon will
- be sent to the left hand instead (when dual-wielding is possible,
- obviously). Same for the left/right accessories. [Skotlex]
- * Added the necessary checks so that Suiton makes Fogwall have double
- duration, and to make water-requiring skills to consume their cells.
- [Skotlex]
- * Corrected the loadmap event description to specify that the mapflag
- required is actually "loadevent", NOT "loadmap"! [Skotlex]
- * Now when the char-txt server does not finds a requested party, it will
- clear out said party id of all characters (will help prevent massive
- spamming/overhead when for some reason the party file needs to be deleted).
- [Skotlex]
- * Combo skills (inf = self, inf2 = no target self) no longer check range if
- you use them while your attack-timer is still active. [Skotlex]
- * Added back a map_freeblock call in skill_delunitgroup which caused a
- memory leak when removed... [Skotlex]
- * Added a check to prevent Blind from ending while standing on a fog of
- wall. [Skotlex]
- * The mob Slave ai will be executed now even when the slave has a target.
- This will allow for "instant" warping to the master when it changes maps or
- teleports. if the slave has a target already, it won't unlock it and chase
- back to the master or anything like that. [Skotlex]
- * Removed a couple of checks that prevents item ids above 20000. However,
- remember that the max id is still ~32k or the client is the one who's gonna
- crash! [Skotlex]
-2006/07/20
- * Added source reporting when you do an invalid int&str or str&int
- operation on a script. [Skotlex]
- * Fixed the intif party creation packet having the incorrect size sent,
- hence causing the leader's level to be read as garbage (which caused the
- "impossible to even share" bug). [Skotlex]
- * Added pc_check_weapontype to do a proper skill weapon check that takes
- into account dual-wielding. That is, if a skill can be used with
- daggers/axes, you'll be able to use the skill when dual-wielding them.
- [Skotlex]
- * Corrected Cloaking level 1-2 not letting you move across walls. [Skotlex]
- * updated cloaking code so that when you set "enable cloaking without
- walls", the code will consider you as "always next to a wall", thus you get
- the wall-speed bonus always. [Skotlex]
- * Applied the fix to homunculus name saving... [Skotlex]
- * Added battle config settings agi_penalty_target and vit_penalty_target,
- they define which object types will get vit/flee reductions when
- multi-targetted and defaults to only players (battle/battle.conf) [Skotlex]
- * Added the dummy intravision case for the changeoption packet 0x229
- [Skotlex]
- * Corrected Fog of Wall so that all targetted offensive skills (not only
- those who do damage) will fail on cast-end 75% of the time. [Skotlex]
- * corrected @homlevel up and one entry in the homun exp table as reported
- on the forums by Albator. [Skotlex]
- * Added the SQL fix to Homunculus skill learning/saving bug [DracoRPG]
- * Added a status_check_skilluse on skill_attack_area call to prevent splash
- damage skills from hitting hidden/trickdead/etc characters. [Skotlex]
- * Corrected fog of wall to behave as best known currently: [Skotlex]
- - Only takes effect when targetting a character inside it
- - -50hit/-75% damage when using normal-ranged attacks
- - -25% damage from all damage skills
- - 75% chance of all targetted damage skills of failing.
- * Should have fixed @refine applying multiple times to equipment that uses
- multiple equip slots. [Skotlex]
-2006/07/19
- * Fixed the inf code update breakage which was blocking all offensive
- skills. [Skotlex]
- * Added battle setting homun_critical_rate (defaults to 0) [Skotlex]
- * Removed enemy_str/pet_str/enemy_perfect_flee and replaced them with
- enable_perfect_flee which specifies which objects can have perfect flee and
- enable_baseatk which specifies which objects can have a base attack value
- (both in battle.conf) [Skotlex]
- * Modified the targetted skill logic to enable offensive skills to be
- targetted at party/guild members if the appropiate inf2 value is set.
- [Skotlex]
- * Added checks to make adding items to inventory/cart fail when a char is
- in finalsave state. [Skotlex]
- * Fixed parse_names on irc.c crashing when receiving a null argument.
- [Skotlex]
- * Modified the parsing of the names line, since some servers will send @
- instead of = when separating the information. [Skotlex]
- * Fixed the homun creation sql statement. Why noone else did so before?
- [Skotlex]
- * When enabling/disabling hiding/unhiding an npc, if the npc is a warp, it
- will use clearchar and spawn packets instead of changeoption. Thanks to
- Toms for the fix. [Skotlex]
- * Corrected Trim chars to block 'enter', as explained by the Ultra mage.
- [Skotlex]
- * When the client passes account version 0, the login server will set it to
- 1 now. [Skotlex]
- * Corrected the HP bar scaling when HP is above Short Max. It should
- display fine for any HP value now. [Skotlex]
- * Added a check when the mob's adelay is shorter than the amotion, in which
- case the adelay will be changed to the amotion value. [Skotlex]
- * Some minor mapflag changes. [MasterOfMuppets]
-2006/07/18
- * Added atcommand @partyoption, lets you alter the party item-distribution
- type on the go. Usage is "@partyoption <pickup share> <item distribution>",
- where both arguments can be 0/1, yes/no, etc. [Skotlex]
- * Updated @changeleader and @partyoption to use msg_Athena entries.
- [Skotlex]
- * Added character 013 (enter) to the list of characters that are always
- removed from new character names. [Skotlex]
- * Fixed a crash when trying to extend TK's infinite combo feature. [Skotlex]
- * Corrected Poison React to counter regardless of distance, and to use the
- skill's 50+5*lv% counter chance (instead of 100%). [Skotlex]
- * Corrected Venom splasher's splash damage [Skotlex]
- * You now can't move/attack/use-skills when using Cloaking of a level less
- than 3 [Skotlex]
- * Fixed compilation of mercenary.c [Skotlex]
- * Corrected Fog of Wall's "targetted spells fail 75% of the time" feature
- by making it behave like GTB, that is, you just get a skill-failed on
- cast-end, no skill-animation at all. [Skotlex]
- * Added a proper check to make aggressive mobs never override homun targets
- regardless of distance. [Skotlex]
- * Removed a bunch of homun-related variables that are not needed at all.
- The alive condition is removed, now the code checks for the hp value to
- know if the homun is alive or not. [Skotlex]
- * Cleaned up a bit the skill-id function, homun skill checks (such as delay
- and skill-lv learned) should be correct now. [Skotlex]
- * Added a proper check to make aggressive mobs never override homun targets
- regardless of distance. [Skotlex]
- * Fixed giving the 100% damage bonus when no-splash-targets are found in
- the blown path to Grandcross instead of Bowling Bash. Bowling Bash damage
- equation becomes then +50*lv% rather than +40*lv% when there's no
- splash-damage (the 50*lv% figure is custom, all we know is that level 10
- does 600% instead of 500% damage). [Skotlex]
-2006/07/17
- * Updated mob_db.sql to current mob_db.txt data. [Skotlex]
- * The char-server will allow off-line character saves when said char is
- tagged for final-save (this is the scenario when the char-map reconnect).
- [Skotlex]
- * Should have fixed the Cart Termination damage code to be scaled correctly
- when you change the max cart weight. Thanks to The Ultra Mage for the error
- clarification. [Skotlex]
- * Implemented Grandcross weird property where if there's noone on the path
- it'll hit twice for the skill's reported damage, and when there is (or you
- can't knockback the target) it'll do a splash attack that hits twice for
- 500% to all affected targets. [Skotlex]
- * Some cleaning of the combo code. TK Rankers will now get their combo-time
- extended each time they trigger a kick, enabling them to do "unlimited
- combos". [Skotlex]
- * Modified the autosave function to use a sweep across the player db
- instead of across connected clients. This will cause non-connected players
- (like autotraders) to also be saved on a regular interval, may help with
- possible data-loss from said characters on unclean shutdowns. [Skotlex]
- * Removed the code that forces aggressive mobs to go after a Homun instead
- of their master (no reason why there should be such a condition). [Skotlex]
- * Some sign quest map flag updates [MasterOfMuppets]
- * atcommand_follow is now more verbose. [Adam]
- * Manually added int_homun.c to the VS8 char_sql project, *should* work [DracoRPG]
- * Orn's fix to the very critical skill level up bug [DracoRPG]
- * Updated mob_db.sql to current mob_db.txt data. [Skotlex]
- * Added Orn's lil fix on homun [Vicious]
- * Added Homunculus system, enjoy! [orn aka Nylou]
- - WARNING: This currently only works with the SQL version, as the TXT char-server
- has no code for it at the moment. You TXT server won't break, but the char-server
- will complain of an unknown packet if you try to get an Homunculus
- * Updated nomemo mapflags based on info from http://ro.doddlercon.com/images/memo.jpg [Poki#3]
-
-2006/07/15
- * Small change in conf/battle/player.conf to say that 199 is max aspd allowed
- (Haplo says that there are many reports of having over 200 is giving errors) [Evera]
-2006/07/13
- * Kaahi no longer shows the heal effect to everyone. [Skotlex]
- * Eska no will cause defense to change randomly every second. [Skotlex]
- * Tuned up some more NJ_KAENSIN based on Tharis's information. [Skotlex]
- * Corrected NJ_KAENSIN as per description. [Skotlex]
- * Fixed a leaking map_freeblocklock on skill_del_unitgroup. [Skotlex]
- * Changed the default save interval to 5 minutes. Added support for
- specifying fixed save-intervals by using negative values. [Skotlex] EG:
- - Save interval set to 300 (5 minutes): all characters will be saved in
- equal time-slots, so that everyone is saved every 5 minutes regardless of
- number of players online.
- - Save interval set to -1000 (1000 ms): One character will be saved every
- second, regardless of amount of characters online.
- The new fixed-time-slots method is meant for larger servers, so that they
- can control the saving-induced stressed on the char-server.
- * Fixed @storeall and @charstoreall failing when the target character
- already had the storage open. [Skotlex]
- * Reverted temporarily the Cart Termination equation until it can be
- fixed... [Skotlex]
- * Fixed script command "recovery". [Skotlex]
-2006/07/12
- * Fixed a small typo in my code [Zido]
- * Added negative value in bonus exploit fix for more stat bonuses [Zido]
- * Fixed exploit in pc_bonus there are no checks that check that the value being
- added onto a status don't make it go below zero, which means if you have a mineral
- card and reset stats it reduces your base attack to lower than zero, making it
- go up to 64000. Fixed by adding a check for SP_BASE_ATK, although i recommend
- doing it for other status bonuses also [Zido]
- * Recoded NJ_BAKUENRYU to behave as I understand it best from the
- skill-description (since Haplo told me this skill doesn't really has video
- information or anything...) [Skotlex]
- * Fixed NJ_TATAMIGAESHI to use ground-tiles rather than "for each in path"
- calls. The skill should be working correctly now, except for the fact that
- the correct "unit id" is missing (this is what would give the ground tile
- it's correct display). Temporarily it is using 0xba until the correct value
- is found. [Skotlex]
- * Added back the undead check to turn undead/resurrection to prevent
- damaging non-undead targets, removed it from the battle damage section.
- [Skotlex]
- * Resurrection will now silently fail when used on non-undead + not-dead
- characters. [Skotlex]
- * Poem of bragi/magic String's base delay reduction at level 10 (or above)
- is now 50% instead of 3*lv%. [Skotlex]
- * status_damage will no longer fail when the target is not on a map AND the
- flag is 2 (charge rather than damage). Fixes SP-draining status changes
- ending suddenly when in-between maps. [Skotlex]
- * Fixed the IP value being apparently incorrectly casted before inserting
- into the loginlog table on "connect success" events. [Skotlex]
- * Fixed Cart Termination's damage. [Skotlex]
- * Added the missing check to remove character from memory when logging out
- and using the charsave_method which saves character map-server-side.
- [Skotlex]
-2006/07/11
- * Fixed inverted check which was preventing you from buying more than 1
- from any stackable item.... [Skotlex]
- * Should have fixed the crash in intif gm message... [Skotlex]
- * Fixed GTB card only working while you had a status-change active.
- [Skotlex]
- * Fixed being unable to compound cards in armor. [Skotlex]
- * Made @monsterignore be an universal ignore. Means you cannot be targetted
- as an enemy by anything. Also added alias "@battleignore" which does the
- same as monsterignore. [Skotlex]
- * Fixed magic power setting your min matk as max-matk. [Skotlex]
- * Modified the packets involved in @fakename in hopes it'll refresh
- correctly on nearby clients now. [Skotlex]
- * Fixed clif_parse not checking for func_parse before sending data to the
- connected clients. This in turn required various code-rewrites in: [Skotlex]
- - duel related messaging functions (added clif targets DUEL/DUEL_WOS).
- - intif whisper to gm function
- - day/night timers
- - Rewrote the parse_console function to stop allocating/deallocating memory
- on every call.
- - Modified chrif_charselectreq to receive the player's ip among the data.
- * Added function clif_disp_message, which is the same as
- clif_disp_onlyself, except you can specify the targets (it sends a
- guild-chat packet) [Skotlex]
- * Fixed the subele bonus (elemental reduction) being applied to the element
- of the attacker instead of the element of the attack. [Skotlex]
- * mob skills now won't trigger on unit_stopwalking calls. [Skotlex]
- * Coded @reset. [Skotlex]
- * Reenabled @changesex [Skotlex]
- * Added function pet_create_egg which handles creating pet eggs correctly
- (when passed item id is indeed a valid petegg). Applied this on @createitem
- and getitem. [Skotlex]
- * Cleaned up code of @item [Skotlex]
- * Cleaned up the itemdb_isequip functions. itemdb_isequip will now return
- if the item is equipable by players, itemdb_isstackable returns if the item
- can be stacked, and itemdb_isidentified returns if the item should drop
- identified. [Skotlex]
- * Added defines CARD0_PET/CARD0_FORGE/CARD0_CREATED to identify if a given
- item has "invalid" cards, added define function itemdb_isspecial to
- simplify this check. [Skotlex]
- * Removed itemdb.c considering item ids above 20000 as invalid. [Skotlex]
- * Cleaned up script commands getitem and card-counting related ones.
- [Skotlex]
- * Cleaned up a bit more pc_isequip [Skotlex]
- * Added script function warpportal(x,y,targetmap$,targetx,targety).
- This creates warp portals as in the skill unit as a volatile alternative
- to static warp portals. [blackhole89]
- * Modified the login-sql server to do the ip-ban check only on the
- auth-packets instead of on every packet. [Skotlex]
-2006/07/10
- * Corrected Warp Portal being unable to warp people who are standing on it
- on the moment it triggers. [Skotlex]
- * Fixed @follow stopping the moment you are warped. [Skotlex]
- * Fixed pc_additem messing with the equip field of the passed item data.
- Fixes the famous "equip stuff on your arrow slot" bug. [Skotlex]
- * Fixed cart-termination crashing the server if you used level 16 of it.
- [Skotlex]
- * Fixed check_connect_login_server check in char-sql server. Fixes
- char-server not reconnecting to the login server. [Skotlex]
- * Login-sql server will no longer change an account's state to "7" when
- banning a player. This should fix being able to use @ban to clear out a
- @blocked player. Players will now be identified as banned only through the
- banned-until timestamp. [Skotlex]
- * Fixed a crash when using Gospel... [Skotlex]
- * The on-place function won't be invoked on setting ground skills if the
- group's tick is greater than the current tick. As Buuyo pointed out, this
- should fix Sanctuary and Gospel taking effect inmediately instead of after
- "x" amount of ms as they should. [Skotlex]
- * Added login-char packet 0x2737. Sets all characters offline (login-server
- side). [Skotlex]
- * Cleaned up char server "set all offline" implementation to remove only
- characters from the map-server from which the packet was invoked. It will
- also now correctly kick/set-character offline from the map-server if they
- are connected. [Skotlex]
- * Cleaned up the char-sql reconnect code. It no longer sets everyone to
- offline. [Skotlex]
- * Removed setting "kick_on_disconnect", servers will no longer kick
- characters out when there's a disconnection. Instead, it'll use the most
- logical approach: Set characters into a "lost" state when there's a
- disconnection, on reconnect, resent the list of online-characters, do a
- sync, and let the difference be characters to be removed. Also, the
- map-server won't release character data until it's saved and the ack
- returns from the char-server to prevent data loss (all this data is resent
- on reconnect for saving anyway). [Skotlex]
- * Added a check in pc_equipitem so that when switching weapons and you have
- the skill_range_by_weapon setting active, the skill info block (which
- includes range) will be resent when the new weapon to equip has a range
- different than the previous one. [Skotlex]
- * One closer inspection, removed that clear in itemdb_reload for a foreach
- call again. And modified itemdb_load to scrap the dummy item entry from the
- item_db and replace it with proper data for the item. [Skotlex]
- * itemdb_reload will clear the itemdb before reloading info instead of only
- clearing the scripts now. [Skotlex]
- * Some cleaning of skill_castend_pos2, fixed Gospel, and a
- map_freeblock_unlock misplacement. [Skotlex]
- * Sense/Estimation will now display the mob info window to all party
- members in the same map. [Skotlex]
-2006/07/08
- * Fixed the new addeff structure not working well with SC_STONE (because
- SC_STONE is 0, which was by default not handled as a valid value).
- [Skotlex]
- * Added back the TF_MISS walking speed bonus to assassin type classes (how
- did that got lost?) [Skotlex]
- * Fixed mobinfo displaying exp as signed ints rather than unsigned.
- [Skotlex]
- * Added status_check_visibility to check if an object is within range of
- view of another. Nothing more, nothing less. It's used by unit movement to
- check whether you can continue chasing your target or not when the "chase
- target" directive is given. [Skotlex]
- * Fixed the char table having party/guild_id as smallint when they need int
- there. Thanks to hermematon for pointing it out (use svn_ugprade7580.sql)
- [Skotlex]
- * Applied k3dt fixes to pet-hatching, ice-wall check, and wedding skills.
- [Skotlex]
- * Fixed endow skills calling the skill no damage packet twice. [Skotlex]
- * Fixed a crash on warpwaitingpc when the chat-room is empty. [Skotlex]
-2006/07/07
- * Fixed the Warm Skills [Skotlex]
- * Removed the debug message when a player logs out and is removed from
- memory, it is working fine (tested normal logging off and autotrade). [Skotlex]
- * Corrected the pet-armor field of the pet not being updated on
- equip/unequip of accessories, making them not show up inmediately. [Skotlex]
- * Status_calc_bl will no longer stop you from attacking/walking when the
- mode is changed unless the new mode no longer includes
- "can-attack"/"can-move" respectively. [Skotlex]
- * Should have fixed clif_item_sub to properly store pet egg/armor data.
- There should be no more "random refine levels" bugs related to these.
- [Skotlex]
- * itemdb_exists will now return NULL for item_id 0. [Skotlex]
- * Added a check to free a character from memory when changing map servers.
- [Skotlex]
- * Okay, added a chrif_save_ack packet to the char-server so now the map
- server will know once a character was "final saved", and only then the
- character will be removed from memory. On char-server reconnection, all
- chars that are in final-save state are resent to save (if they are still in
- memory, it's because the ack hasn't gotten here from the char-server). This
- should effectively block all dupe problems due to heavy inter-server lag,
- however as it's untested, it currently prints some debug messages when
- people are saved and then removed from memory. Need testers so this can be
- debugged and merged to stable! [Skotlex]
- * Now, when the login-char connection is cut, the char-server won't set
- everyone offline on reconnect, instead it will send the list of online
- accounts to the login server. [Skotlex]
- * Modified the error on the char-sql server to set chars online when it
- receives a save packet from a character tagged as offline (until it can be
- figured out why this is happening) [Skotlex]
- * Fixed signed/unsigned comparison issues in the char txt/sql server.
- [Skotlex]
- * Fixed the cooking success chances. Thanks to Ishizu Chan. [Skotlex]
- * Added a temporary band-aid to prevent executing the script of non-arrows
- when they are equipped on the arrow-slot (until the actual cause of why
- pc_unequipitem is not working correctly is discovered/fixed) [Skotlex]
-2006/07/06
- * Modified the party_data structure on the map server to remove some
- redundant data. Added a party_data structure on the char-server to hold a
- more complete set of information about parties. Added to the party_member
- structure the class of each member so that the map server can do the
- appropiate checks even if the character is on another mapserver/offline.
- Due to the format changes in the party structure, txt servers will have to
- wipe their party file... (sql save format has not been changed) [Skotlex]
- * Added function char_family to check if there's a family state given the
- three character ids, instead of doing individual checks all the time.
- [Skotlex]
- * Rewrote all the item restriction functions so that they will take into
- account slotted card restrictions as well. [Skotlex]
- * Added no_skill_delay setting, when set, affected object types will have
- the minimum skill delay for all skills. Defaults to mobs, since they
- don't have skill delays. [Skotlex]
- * Cleaned up pc_equipitem. When dual wielding or equipping accessories, if
- the client actually specifies one of the two positions, it will be taken
- into account (now, does the client actually does this?) [Skotlex]
- * Fixed GrandCross and similar skills. [Skotlex]
- * FogWall will now also affect the caster. [Skotlex]
-2006/07/05
- * Updated NJ_KAENSIN by Saycyber21 [Vicious]
- * Updated @refine to take account of MAX_REFINE, thanks to Omega... GM
- Designer. [Skotlex]
- - Also optimized the @refine loop for better performance.
-2006/07/04
- * Fixed compile issue for NJ_BAKUENRYU, by Saycyber21. [Vicious]
- * Implemented Saycyber21's some NJ work. Untested. :D [Vicious]
- * Implemented cooking chances. Chance of success is 70% - 7*(dish-lv)% +
- 12*(cooking set-lv)%. Exception: When using the legendary cooking set,
- success chance is 100% regardless of dish. [Skotlex]
- * Added battle config setting emergency_recall, specifies behaviour of that
- skill (skill.conf): 0 - Disabled. 1 - can't be used in nowarpto maps. 2 -
- Can be used everywhere. [Skotlex]
- * Removed the NPC/Dance/Song inf2 check of AbraCadabra. whether a skill can
- come out or not is entirely decided by the abra db file now. [Skotlex]
- * Added structure s_addeffect to handle status change additions. Cleaned up
- relevant code. It is now possible to specify ANY status change, not just
- the basic ones. NOTE that the code is proof-read, but untested! [Skotlex]
- * Added support for bonus3 bAddEff/bAddEffWhenHit as follows: [Skotlex]
- bonus3 bAddEff/bAddEffWhenHit, <SC value>, <rate>, <target flag>.
- Target flag is 0: Self. 1: Enemy. 2: Both.
- * Added these descriptions to doc/item_bonus.txt [Skotlex]
- * Added a check when joining a chat to make sure the target object is of
- type BL_CHAT. [Skotlex]
-2006/07/03
- * Cleared up the bAutoSpellWhenHit description in doc/item_bonus.txt
- [Skotelx]
- * Fixed Phantasmic Arrow and Magical Bullet not being correctly tagged as a
- ranged arrow-type attack. [Skotlex]
- * Updated help.txt and help2.txt, thanks to Inuyasha for providing the
- updated files. [Skotlex]
- * Char-server SQL won't perform the reconnect cleanup routines when
- kick_on_disconnect is disabled. [Skotlex]
- * Renamed summons_inherit_effects to summons_trigger_autospells as the
- setting now only makes the attacks of the slaves trigger the autospells of
- the master (as it should be). [Skotlex]
- * Corrected code capping no_spawn_on_player to 50 when the max should be
- 100. [Skotlex]
- * Warmth will dispel when warping now (or else the effect is left on the
- ground) [Skotlex]
- * Fixed reading of the refine_db not working right when MAX_REFINE is
- increased from 10. [Skotlex]
- * Some more cleaning to the implementation of Abracadabra [Skotlex]
- * Fixed a compile warning in login sql/txt [Skotlex]
- * Fixed pc_makesavestatus not setting your logout position. [Skotlex]
- * Fixed two dances becoming BA_DISSONANCE instead of DC_UGLYDANCE.
- [Skotlex]
- * Added the missing +100% damage modifier of Enchant Deadly Poison.
- [Skotlex]
- * Fixed SkillStatusChangeTable not working correctly for Homun/Guild
- skills. [Skotlex]
-2006/06/30
- * Fixed a typo in msg_athena.conf, "This item cannot be drop" -> "This item cannot be dropped" [MasterOfMuppets]
- * Added a check to prevent equipped items from being traded. [Skotlex]
- * Added UF_SONG (0x400) to differentiate songs from dances. [Skotlex]
- * Added preliminar support for making a Song+Dance turn into BA_DISSONANCE
- cells. Beware of potential bugs as it's untested. [Skotlex]
- * Added mapflag "nochat" to prevent chatting rooms from being created.
- [Skotlex]
- * Corrected some of the sleep checks when the char id does not matches with
- the char-id expected by the script engine. [Skotlex]
- * Cleanup in itemheal related code, fixed the item heal group bonus not
- working on Groups beyond 7. [Skotlex]
- * Fixed pet's loot not being moved to your inventory on logout. [Skotlex]
-2006/06/29
- * Made the map server send list of characters online to the char-server on
- reconnection regardless of "kick_on_disconnect" setting, as otherwise, a
- temporary disconnection would make the char-server tag all characters
- offline and refuse to save them afterwards. [Skotlex]
- * Fixed guild storage being "eternally in use" if you quit/logout before
- closing it. [Skotlex]
- * Ending SC_CLOAK/SC_HIDE/SC_CHASEWALK will now trigger ontouch npcs.
- [Skotlex]
- * [Fixed]
- - Scripting system screwing up script position after mixing timers with menus.
- - NPC attached AI mobs display as alive when dead.
- - View data not updating after buildin_unitdeadsit.
- [Improved]
- - NPCE_LOADMAP to execute after all (area) objects are sent to the player.
- - Simplified scripting system. sd will now use pointer to the script state itself.
- [Lance]
-
-2006/06/28
- * changed:
- dynamic_pass_failure_ban_how_many:from 3 to 7
- dynamic_pass_failure_ban_how_long:from 60 to 5
- as in official servers. [Musashiden]
- * Added a check in script command "set_option" so that invoking
- "set_option(0)" removes Cart/Peco/Falcon, as expected by scripts. [Skotlex]
- * Added trade-range check on trade start. [Skotlex]
- * Added inf2 4096 (INF2_ALLOW_ENEMY) which is to be used in conjunction
- with INF2_PARTY_ONLY/INF2_GUILD_ONLY when said skill should ALSO be allowed
- to be used on enemies. [Skotlex]
- * Cleaned up a bit the code for @item [Skotlex]
- * Fixed character/storage being sent to be saved TWICE when you logged out
- while the storage is opened. [Skotlex]
- * Added save_settings map config. Specifies after which events do
- characters get saved (defaults to all): 1 - Trade successful, 2 - Vending
- transaction, 4 - Closing storage/guild storage, 8 - hatching a pet.
- [Skotlex]
- * Changed the mob drop rate adjust function to receive a signed int
- argument. Probably will fix those drops with 0% becoming 100% [Skotlex]
- * Corrected Musical Strike having a different damage equation from Throw
- Arrow. [Skotlex]
- * Added state rewarp to players. It gets set when a pc_setpos call is
- triggered while the player is changing maps so that when the player finish
- loading the map, it is inmediately rewarped to where it has been
- rewarped/recalled to. [Skotlex]
-2006/06/27
- * Map server will now resent the whole list of online characters to
- char-server on reconnect when the kick_on_disconnect setting is active.
- [Skotlex]
- * Cleaned up and optimized the IP sync code. New login_athena config
- setting sync_ip_interval specifies how often to sync the ip. The default is
- 0 (disabled). [Skotlex]
- * Added mapflag "loadevent", now load-map script events will ONLY trigger
- on maps with this mapflag on, rather than every map. [Skotlex]
- * High Jump can now be used in all versus maps. [Skotlex]
- * Added Kaite's opt3 value, taken from jA [Skotlex]
- * Added state dirty == 2 to storages. Signals when a storage was sent for
- final saving. Said storage is removed from memory after the ack from the
- char-server, and they are sent to save if the map/char servers reconnect
- before the ack arrives. In short: they are guaranteed to be saved after a
- char logs out. [Skotlex]
- * Put pay_arche.gat in the "no experience lost" mapflag file. [MasterOfMuppets]
-2006/06/26
- * Corrected the element of hunter traps. [Skotlex]
- * Deadly Poison now also reduces def2 by 25% [Skotlex]
- * Cleaned up a bit skill_moonlit, Moonlit Petals should work correctly now.
- [Skotlex]
- * Fixed @mi displaying always 0 instead of the mob's class. [Skotlex]
- * Rough implementation of Ground Drift according to description and jA
- info. [Skotlex]
- * Implemented Tatami Gaeshi using skill description and jA implementation
- for reference. [Skotlex]
- * Merged Mitternacht's max_heal/max_heal_lv config settings. [Skotlex]
- * Removed support of packet 0xc3 on the new packet versions. Thanks to
- Meruru for pointing out they aren't being used anymore. [Skotlex]
- * Autospells will now again check for the skill's nk value, so that skills
- tagged "nodamage" skills will not trigger autospells. [Skotlex]
- * Corrected clif_item_sub so that pet eggs will correctly be sent as
- equipment (fixes them showing up "broken" and with random refine levels)
- [Skotlex]
- * [Added]:
- - buildin_unitkill just for kicks. [Lance]
-
-2006/06/23
- * [Optimized]:
- - Setting of variables with defined scope in some frequently executed script
- events.
- [Added]:
- - Missing script_require_trigger flags for some power hungry events.
- * Updated mob_db.sql and item_db.sql to latest. [Skotlex]
- * Modified pc_setoption so that it will correctly update sprite AND clothes
- color when mounting/unmounting changing into/from xmas/wedding sprites.
- [Skotlex]
- * Allowed itemdb_exists to return the dummy item. Enables "invalid" items
- to be sold, traded, dropped, etc. [Skotlex]
- * Corrected ASC_BREAKER. Int-based damage is applied after attribute fixes
- and before card reductions. The skill now completely disregards left
- hand weapon. [Skotlex]
- * Standarized PF_MEMORIZE to be 50% cast time on all skills (instead of
- -50% for targetted skills and -66% for ground skills >.>) [Skotlex]
- * Cleared up the comment on what item_check does and how it works.
- [Skotlex]
- * Changed setting for skill_nocast flag 16. It is no longer a "pk-mode map"
- setting, it's now a clone-forbidden skill. That is, skills with the flag 16
- will never be copied by clones. If you use a PK-mode server, use flag 2 now
- to forbid skills from common maps. [Skotlex]
- * Default skills from not being cloned are Magnus Exorcism and Turn Undead.
- * The map search free cell will now use the size of the map # of tries
- before giving up when the spawn area is the whole map. Added a check to
- inmediately give up when the number of spawn retries has reached the max
- specified (no_spawn_onplayer = 100). [Skotlex]
- * Cleaned up a bit the clone code to account for the unit flags
- UF_NOPC/UF_NOMOB when the skill is not ground-based (accounts for self
- skill that causes a ground-tile to be placed, like Dances). [Skotlex]
- * Added pc_bonus_autospell_del, gives support for removing autospell
- effects. When a negative rate is specified, it will decrease the chance of
- casting (eg: You have two different cards with autospell Heal +20% each,
- then do autospell -30. The second card will be cancelled, and the first one
- will become Heal +10%) [Skotlex]
- * npc_timers now will not restore the previous timer data when there's no
- players attached (when it's strictly an npc timer). This should reenable
- the old behaviour of getnpctimer returning the total ellapsed time since
- "startnpctimer" even after the last label has been reached. However, this
- behaviour won't apply to player-attached timers. [Skotlex]
- * [Fixed]:
- - MAPREGSQL overloading SQL table with temperory map registries.
- - Incorrect perfomance calculation for MAPREGSQL loading and saving. [Lance]
-
-2006/06/22
- * Guessed and added support for the packets 0x22a (idle) and 0x22b (spawn).
- This should complete the required packets for PACKETVER 7. [Skotlex]
- * Added support for the PACKETVER 7 packets in the "dummy" current
- intravision implementation. [Skotlex]
- * Fixed @autoloot being off by 0.01% when entering a manual value.
- [Skotlex]
- * Restored the "Secret" behaviour of Blast Mine and Claymore Trap where
- each target is hit N times (where N is the number of mobs in the splash
- area at the moment of triggering). [Skotlex]
- * Updated the tools/stackdump script to also handle sig-plugin generated
- backtraces. Now it will also auto-determine whether the exe needs a .exe at
- the end or not. Help me test it as I want this script on stable NOW :X
- [Skotlex]
- * Usage is "stackdump <login/char/map> <txt/sql> [number]". When a number
- is given, sig-plugin stackdumps are assumed, otherwise it parses the normal
- stackdump as before. [Skotlex]
- * Corrected autoloot so that you can specify rate with decimal precision
- ("@autoloot 0.01" should work) [Skotlex]
-2006/06/21
- * [Removed]:
- - Redundant mob name copying. (it's already copied in mob_parse_dataset) [Lance]
- * [Fixed]:
- - Compilation warnings and errors.
- [Improved]:
- - Changed and moved IP sync status messages to elaborate more. [Lance]
- * Tested and fixed resolve_hostbyname. Applied said function around most of
- the code where needed. Removed includes for the OS/network system pretty
- much from every file (our socket.c file should handle this) [Skotlex]
- * Made the GM mute request bypass the manner_system setting. [Skotlex]
- * Applied use of parse_hostbyname() in chrif.c to fix compilation errors.
- [Skotlex]
- * status_percent_change will now account for when the target's max hp/sp is
- above INT_MAX. [Skotlex]
- * [Added]:
- - DNS (WAN) sync for those pesky disconnections (dynamic ip renewal). [Lance]
-2006/06/20
- * Some cleaning up of OPTION related code. OPTION_XMAS and OPTION_FLYING
- really ARE the same value clientside! (totally stupid), therefore I've
- opted from removing the flying animation since it really just displays as
- Xmas for others (and the correct fix involves adding a bunch of
- class-change packets...) [Skotlex]
- * Updated skill_require_db to place the Zeny requirements of ZenyNage and
- Fling. [Skotlex]
- * Fixed crash when non-players use ZenyNage. Added the correct Zeny check
- in skill_check_condition, fixed the skill so that it's damage is based on
- whatever zeny is specified in skill_require_db. [Skotlex]
- * Can-act delay will not be reset when warping now. [Skotlex]
- * Fixed Quagmire not altering walking-speed. [Skotlex]
- * Silence now blocks skills both on begin/end casting. [Skotlex]
- * Updated status_calc_bl so that when walking speed changes, the character
- is made to rewalk so that the new speed takes effect inmediately. [Skotlex]
-2006/06/19
- * Added Ayothaya to nopenalty and nopvp mapflags. [Evera]
- * Combo-used Skills with State "move_enable" will now override the "can't
- move delay". Fixes Break-Fall -> Jump-Kick. [Skotlex]
- * Some more cleanups of battle_calc_damage to account for absorbed damage
- reductions. [Skotlex]
- * Moved back Soul Drain code from mob_dead to skill_counter_additional_effect.
- Now we are back to where the skill animation does not shows, but you DO
- get SP T.T' [Skotlex]
- * Some cleanups and corrections in battle.c to account for negative
- (absorbed) damage. [Skotlex]
- * Fixed fame-list updating crashing char-sql server when the given char-id
- just got into ranking. [Skotlex]
- * Added missing Arunafeltz maps with information from NLZ [Evera]
-2006/06/18
- * [Fixed]:
- - Typo in status.c add_sc() using 'skill' instead of 'sk' as index, resulting in
- filling the SkillStatusChangeTableArray with junk data.
- - > NEEDS CONFIRMATION < Ends casting if player is knocked with freezing/stun/whatever
- - Typo in parse_frommap. [Lance]
- * [Fixed]:
- - clif_initialstatus using SHRT_MAX instead of USHRT_MAX for status_point.
- * [Temperory Fixed]:
- - Crashing of SQL char-server in parse_frommap case 0x2b01. [Lance]
- * [Removed]:
- - Large part of scripted mob control commands are removed.
- - Large part of scripted player control commands are removed.
- - Scripted mob slaves changing master ID.
- [Added]:
- - Unit control commands.
- - CALLBACK_NPCCLICK for scripted mobs, added this to db/const.txt too.
- - Macro RECURSIVE_MASTER_CHECK in battle.c
- [Modified]:
- - buildin_skilluseid and buildin_skillusepos -> buildin_unitskilluseid
- and buildin_unitskillusepos.
- - md->callback_flag to short (double word). [Lance]
-
-2006/06/17
- * Devotion absorbed damage will now appear to come from oneself (instead of
- the original attacker changing directions towards the Crusader) [Skotlex]
- * Updated clif_refres to send inventory, cart, and weight info. [Skotlex]
- * Fixed intif_guild_memberinfoshort to not leave a dangling pointer when
- someone logs out <.< [Skotlex]
- * Changed some mapflags related to the eye of hellion quest. [MasterOfMuppets]
- * [Added]:
- - buildin_checkcell, buildin_mobwarp, buildin_pcattack.
- [Improved]:
- - buildin_skilluseid and buildin_skillusepos to accept a few more arguments.
- - mob_script_callback to return sucess value [Lance]
- * Fixed the party HP packets to send max HP 10000 and scale HP accordingly
- when the player's HP doesn't fits in the packet's field. Fixes HP bars not
- correctly displaying the % of life when max HP is above 32k. [Skotlex]
-
-2006/06/16
- * Fixed option value being reset'ed on login (fixes cart/peco/falcon being
- lost) [Skotlex]
- * Corrected @speed to alter your base speed instead of battle one. Means
- the change remains for much longer (until status_calc_pc is invoked, which
- could be due to equipping/unequipping stuff) [Skotlex]
- * Modified the bNoMagicDamage/bNoWeaponDamage bonuses to be a 0-100
- setting. Meaning you can do bonus bNoMagicDamage,50; To make all magic
- damage be reduced by half. This bonus stack, so two cards with
- bNoMagicDamage,50 will give magic immunity. [Skotlex]
- * Removed setting gtb_pvp_only and replaced it with gtb_sc_immunity which
- specifies the threshold before the bNoMagicDamage starts blocking support
- statuses as well. ie: gtb_sc_imunity: 75 will mean that "bonus
- bNoMagicDamage,70;" reduces magic damage by 70%, but does not blocks heal
- or support status, while "bonus bNoMagicDamage,80;" does. [Skotlex]
- * Removed db_tables.sql as it's no longer used. [Skotlex]
- * the mvp_sd is removed when the mob is the emperium and there's no
- killer/exp-awarded (assumed killed by script), this prevents the on-kill
- event from triggering and giving the castle to whoever damaged the most the
- emperium without destroying it. [Skotlex]
- * [Added]:
- - Custom slave mobs to inherit the callback_flag.
- - Added option #25 to buildin_setmobdata to set the callback_flag. [Lance]
- * [Improved]:
- - Cleaned up Custom Mob Script Callback codes. Looks much better now :B. [Lance]
-
-2006/06/15
- * [Fixed]:
- - intif_parse_RenamePetOk for not compatible with ANSI-C initialzation specification.
- [Lance]
- * Added indexes for loginlog and ipbanlist as they did not have any.
- (note, someone already put the index on loginlog on trunk.) [Euph]
- * Merged Adam's patch to let the char-server handle validation of
- pet-name-change requests through the allowed char letters config. [Skotlex]
- * Fixed "wedding_ignore_palette: yes" not working when relogging with the
- gear already equipped. [Skotlex]
- * Added blocking of the Kick skills when you are a Soul Linker. [Skotlex]
- * Added enabling to turn off a kick-stance regardless of class. [Skotlex]
- * Altered a bit how status_set_viewdata behaves in regards to Wedding/Xmas
- options. [Skotlex]
- * Added back OPTION_XMAS, but the actual value is missing! [Skotlex]
- * Corrected chrif_save so that the player is not set offline on map-change.
- [Skotlex]
- * Added change-look support in pc_setoption when specifying OPTION_XMAS
- [Skotlex]
- * Fixed clif_parse_RemoveOption removing all options instead of just
- Falcon/Cart/Peco [Skotlex]
- * Fixed clif_send not sending packets to SELF when specifying AREA if the
- source is not on the map yet. [Skotlex]
- * Fixed and cleaned up script command 'equip' [Skotlex]
- * Fixed 'autoequip' items. [Skotlex]
- * Fixed Aspd not being updated in your status window after Agi/Dex
- increasing statuses take effect. [Skotlex]
-2006/06/14
- * Fixed map_nick2sd so that searching for "Adam" will not match a char
- named "Adam Smith". Thanks to Adam for reporting it out. [Skotlex]
- * Modified how luk reduces status changes by reducing the gap. Eg: resist =
- vit; resist += (max - resist)*luk/300; [Skotlex]
- * Added battle settings pc_max_sc_luk/mob_max_sc_luk to handle which is the
- luk threshold at which you gain inmunity (defaults to 300). [Skotlex]
- * Fixed buildin_getmobdata. It was trying to handle the first parameter as the
- array to fill in. [blackhole89]
- * Blocked again skill usage during marionette. [Skotlex]
- * Fixed main.sql adding a key on char_id rather than account_id for the
- char table. [Skotlex]
- * Cleaned up character saving in char-sql, it no longer needs to query the
- database to see if the player exists on each char-save, instead it checks
- the received data against the online-players db. No such fix is required
- for char-txt. [Skotlex]
- * Added an error message on the char-server when the received player data
- size does not matches with the expected size (should avoid the crash that
- happens on such a memcpy). [Skotlex]
- * [Improved]:
- - script_save_mapreg for MapregSQL Saving to display perfomance only in slow
- queries. [Lance]
-2006/06/13
- * Updated mob_db.sql and item_db.sql to latest. [Skotlex]
- * Added account_id index to char table. Thanks to Buuyo for reporting it.
- Sql users apply upgrade_svn7146.sql NOW. [Skotlex]
- * Marionette and Devotion will now check raw distance and ignore obstacles
- and the like. [Skotlex]
- * Added irc_channel_pass setting and prevent crashing when irc server
- lookup by host fails. Thanks to Trancid for the details. [Skotlex]
- * [Fixed]:
- - clif_parse_GetCharNameRequest displaying false alarm for legitimate GM snooping.
- [Lance]
- * Added support for reading correctly status change data from Guild and
- Homun skills. [Skotlex]
- * Added support for reading Homun skill data (which means the HM skills are
- now safe to add to skill_db, skill_require_db, etc) [Skotlex]
- * Oppositions can't be made during WoE now. [Skotlex]
- * Fixed a few compiler warnings from VC [Skotlex]
- * Commented out the Homunculus Skills<->Status Change link which was
- causing some memory corruptions. [Skotlex]
-2006/06/12
- * [Fixed]:
- - buildin_npcshopitem not allocating extra 1 block of terminator.
- [Added]:
- - Modified versions of Dj-Yhn's buildin_npcshopdelitem and buildin_npcshopadditem
- [Lance]
- * Updated clif_disp_onlyself to not use dynamic memory and write directly
- to the player's buffer. [Skotlex]
- * Updated @noask to also tell the user what he has just rejected (added
- msg_athena entries for each of the different requests). Also updated it to
- use clif_disp_onlyself. [Skotlex]
- * Fixed a pair of missing initializers in the clif storage functions.
- [Skotlex]
- * @heal no longer displays a healing animation. Fixes the client believing
- you couldn't be healed more than 32K. [Skotlex]
- * Now you can use any skills (except encore/dancing ones) while under
- Longing for Freeding. [Skotlex]
- * Now you can use any skills while under Marionette Control. [Skotlex]
- * Fixed npc_checknear's distance check returning the opposite of what it
- should (false when the range is correct and viceversa) [Skotlex]
- * Added a warning on item loading when an item is of equippable type but
- has no equippable position. [Skotlex]
- * Turning an alliance to an opposition won't work now during WoE [Skotlex]
- * Slaves can summon other mobs now. The only ones who can't do this are
- player summoned mobs. [Skotlex]
- * Merged the following functions for faster processing of items: [Skotlex]
- clif_storageitemlist + clif_storageequiplist = clif_storagelist
- clif_guildstorageitemlist + clif_guildstorageequiplist = clif_guildstoragelist
- clif_itemlist + clif_equiplist = clif_inventorylist
- Note that the changes are a bit substantial and need proper testing!
- * Increased max knockback value support to 25. [Skotlex]
- * [Optimized]:
- - buildin_npcshopitem memory allocation to calculate before reallocating.
- [Lance]
- * Made guild member exp an unsigned int. [Skotlex]
- * Various cleanups to the npc clicking related functions. Should fix quite
- some possible crashes from crafted packets. [Skotlex]
- * Added overflow checks for bonus settings mdef_rate/def_rate. [Skotlex]
- * Added missing update of INT after a buf. [Skotlex]
- * Small cleanup of how SC_BLEEDING works. [Skotlex]
- * Fixed party_foreach_samemap invoking the function on the CASTER instead
- of on the party members. [Skotlex]
- * Modified clif_parse_NpcClicked to handle the different situations with
- different bl-objects (attack on players/mobs, click on npcs or mobs with
- npc attached) [Skotlex]
-2006/06/09
- * [Fixed]
- - Compilation warnings on guild.c and int_guild.c [Lance]
- * Added structure party_data and party_member_data to the map server to
- hold party-specific required information about parties including
- Monk/TK/SG/SN states and party member count. Family information is still
- missing, and handling of the state should probably be done by the
- char-server, too... [Skotlex]
- * party Hp updates are no longer done each time the Hp is modified, but
- together with the party xy timer. It means HP-bars will be a bit delayed
- before being updated, but packet consumption should be much less during
- heated battles. [Skotlex]
- * Fixed MoM's typo [Vicious]
- * Fixed map_readafm missing strcpy(afm_name, m->name). [Skotlex]
- * [Improved]:
- - npc_click interception on BL_MOB and BL_PC to let sd act accordingly.
- [Lance]
- * [Fixed]:
- - Execution of sleep/sleep2 more than once will hang the script_state.
- [Lance]
- * Fixed @mapinfo displaying incorrectly maps with nosave which send you
- back to your last savepoint. [Skotlex]
- * Moved guild_exp_rate from a mapserver battle config setting to a char
- server config. It no longer modifies the total taxed exp as seen on the
- guild information window, but directly modifies the exp that the guild
- earns. [Skotlex]
- * Added an error report and correction when the map server receives a guild
- from the char-server with more guild members than MAX_GUILD. [Skotlex]
- * Changed the interval between waterballs back to 125 [MasterOfMuppets]
- * Fixed a typo in char_sql/char.c, thanks to Euph [MasterOfMuppets]
-2006/06/08
- * Modified guild exp to be an unsigned int rather than a signed one.
- [Skotlex]
- * Fixed @skilltree printing out Unknown job for most targets used.
- [Skotlex]
- * Cleaned clif_pvpset to not send the packet to nearby characters when the
- source is GM-hidden. May help fix the crash on PvP with gm-hidden
- characters. [Skotlex]
- * Modified map_freeblock_unlock so that aFree errors will report the
- file/line that INVOKED the function rather than the function itself.
- [Skotlex]
- NOTE: Do NOT disable the memory manager as that will break this change.
- This change is to be temporarily set until the afree'd error can be
- resolved.
- * Updated mob_npc_warp to a three-state config switch. 0 disables. 1 enable
- only on warps that don't lead to nobranch maps. 2 - enable on all warps.
- [Skotlex]
- * Adjusted Don't Forget Me, Defender, Longing to use all val entries, and
- to hold the speed adjustment value rather than speed penalty (eg: 125
- instead of 25). [Skotlex]
- * Cleaned up status_calc_speed so that speed penalties are correctly
- handled (eg: 25% penalty is speed*100/75, not +speed*25/100). Thanks to
- Euph for pointing it out and Belle for the speed mechanics. [Skotlex]
-2006/06/07
- * Fixed Sense using mdef instead of mdef2 [Skotlex]
- * Fixed item-skills not showing up on login. [Skotlex]
- * Cleaned up clif_parseLoadEndAck, by testing which packets are required
- only on first-login and which ones are required on all map-changes.
- Skill-tree, Exp, Skill Points and most of the basic status are no longer
- sent on map-change (items, cart data and zeny still need to be sent one
- very map-change). [Skotlex]
- * Fixed the mob state not being set to Berserk/Angry correctly after the
- mob reaches the target's location. [Skotlex]
- * Added config setting mob_npc_warp, when set to yes, enables mobs to be
- warped between maps when stepping on a npc-warp. [Skotlex]
- * Added monster_ai setting &64, when enabled makes a mob run to any nearby
- npc-warp when their current target has switched maps. [Skotlex]
- * Added pc_calcexp to calculate individual exp bonuses acquired from exp's
- source (race bonus cards, SG Exp skills, pk-mode higher level exp) [Skotlex]
- * pc_gain_exp now also receives the source of the exp, when said source
- exists, bonuses are applicated as needed. [Skotlex]
- * Added status_kill when capturing a mob, should take care of the mob not
- respawning after caputed. [Skotlex]
- * Fixed item info not displaying the found item id [Skotlex]
- * Fixed item info not displaying the weight value properly. [Skotlex]
- * Adjusted status resistances and durations taking as base Viccious's info
- from the kro guidebook. [Skotlex]
- * Moved souldrain code from skill_counter_additional_effect to mob_dead. It
- should display the skill animation correctly now. [Skotlex]
- * Adjusted several sc rate/time reductions as pointed out by Playtester.
- [Skotlex]
- - Luk now plays a luk/10 reduction role rather than a luk/3 one.
- * Removed char_nick2id from char-sql server as it's no longer needed.
- [Skotlex]
- * Fixed quitting the map server not properly saving the storage before
- deleting it. Thanks to Adam for pointing it out. [Skotlex]
- * Cleaned status_get_sc_tick/status_get_sc_def to use the status_data
- function. [Skotlex]
- * SC_STOP's chance and duration can't be reduced anymore. [Skotlex]
- * Storm Gust no longer has a 100% chance to freeze by passing mdef, now it
- has a 300% base chance reduced by mdef and the like as explained out by
- Tharis. [Skotlex]
- * Frost Diver/Frost Nova's base freezing chance is no longer affected by
- target's int. [Skotlex]
- * [Improved]:
- - mob_dead not to remove script controlled monsters with player sprites.
- [Added]:
- - buildin_mobdeadsit :D [Lance]
- * [Fixed]:
- - temp++ gets issued before if(mvp_damage<(unsigned int)md->dmglog[i].dmg) in
- mob_damage. Thanks to seahorsix. [Lance]
- * [Fixed]:
- - Corrected login-server SQL to use *((ulong *)p) instead of (ulong)p [Lance]
- * [Optimized]:
- - list and size not being initialized (size get intialized in default: switch case)
- Eliminated default case and initialized list and size at the beginning. [Lance]
-2006/06/06
- * Hopefully fixed for sure mobs getting extra stats when changing-class due
- to the mobs level up setting. [Skotlex]
- * Removed a piece of code that should no longer be needed due to the
- combo-skill setting (inf = self, inf2 = no-target-self) which is blocking
- self-skills from being used on others (pets/mobs should be allowed to do
- that) [Skotlex]
- * Added a status_check_skilluse call in Sightblaster to prevent it from
- hitting hidden/cloaked/act-dead/etc players. [Skotlex]
- * Fixed firewall counter going down by 2 each hit rather than 1. [Skotlex]
- * Fixed Soul Burn not zapping away all SP. [Skotlex]
- * The monsters can level up setting will not take effect when the mob's
- level is LESS than their db counter-part (should prevent under-leveling
- causing underflows and semi-immortal mobs) [Skotlex]
- * Fixed mvp-exp calculations being messed up with more than one attacker.
- [Skotlex]
- * Changed the mob exp race bonus so that each player gets their own bonus,
- rather than the killer's bonus applying to everyone. Still not the
- "correct" way, but one step closer to it. [Skotlex]
- * [Fixed]:
- - Allocation of event_list in guild_npc_request_info to aCalloc so
- memcpy(ev->name,event,strlen(event)) will have a null terminator. [Lance]
-2006/06/05
- * Fixed a crash when using SL_SMA and the "combo" ain't ready. [Skotlex]
- * Hopefully fixed changing a mob's class causing them to get all sort of
- stat bonuses due to the mobs-level-up setting. [Skotlex]
- * Changed hit, flee, cri, flee2, def2 and mdef2 to signed short, def, mdef
- to signed char to correctly account for cards with penalties in said stats.
- [Skotlex]
- * Fog of Wall won't affect the caster now in any way. [Skotlex]
- * Added clif_fixpos packets before attacking for the first time to clear
- any position sync issues with the client. [Skotlex]
- * Fixed skill_unitsetting using layout->count for the for instead of
- group->count [Skotlex]
- * Added SC_INCDEXRATE/SC_INCAGIRATE. NPC_POWERUP/NPC_AGIUP now correctly
- increase dex/agi by 40% per level. [Skotlex]
- * Fixed char-sql server not deleting character variables when deleting a
- char. [Skotlex]
- * Corrected cloaking not ending on attack if you are near a wall. [Skotlex]
- * Updated pc_bonus to use cap_value on all status_data modifiers to prevent
- overflows/underflows. [Skotlex]
-2006/06/03
- * Fixed @mi/@mobinfo not showing the name collumns correcly [shadow]
- * Solved the bug that made firewalls only castable a few times until [MasterOfMuppets]
- you relogged. Thanks to Euph for the fix.
- * Added variable other_mapserver_count to chrif.c which holds total count
- of connected map-servers. By using this we prevent sending unnecessary
- packets to the char-server when there's no more map-servers connected.
- [Skotlex]
- - Affected packets are whispers, announces, party messages, guild messages.
-2006/06/02
- * Fixed Visual Studio 7.1 Solution File (Login TXT and Map TXT were removed)
- * Fixed a bug in unit_can_reach_bl which breaks path seeking when the
- target is near obstacles. [Skotlex]
- * Updated offensive use of Sanctuary to function like on the official servers [MasterOfMuppets]
- * Changed the interval between waterballs from 150 to 250 milliseconds [MasterOfMuppets]
- * Corrected clif_parse_takeitem to ALWAYS return a NAK packet when it
- fails. Fixes cases where the client gets "stuck" and refuses to let you
- pick any items. [Skotlex]
- * Removed the walk delay from firewall and changed its knockback [MasterOfMuppets]
- to 1 tile to make it act more like in the official servers.
- * Some cleaning of the mob slave ai. [Skotlex]
- * Corrected Brandish Spear to work on levels above 10. [Skotlex]
- * Updated Two-HandQuicken, One-HandQuicken to give 30 +2*lv% aspd-rate for
- skill levels above 10 (meant for boss casted skills) [Skotlex]
- * Fixed Spear-Quicken messing with the calc_flag [Skotlex]
- * Fixed Freeze/Stone/Benedictio not changing your elemental LEVEL to 1.
- [Skotlex]
- * [Fixed]
- - Yet another compilation warning. [Lance]
-2006/06/01
- * Altered status_calc_pc so that equipment scripts are ran before
- card-scripts. [Skotlex]
- * Fixed pc_bonus to not underflow/overflow when adjusting def/mdef.
- [Skotlex]
- - These two together, should fix Tao Gunka Card.
- * npc_debug_warps() will now be invoked if warp_point_debug is set.
- [Skotlex]
- * Updated item_db.sql/mob_db.sql to current. [Skotlex]
- * Fixed NPC_SELFDESTRUCTION not showing nor dealing damage. [Skotlex]
- * NPC_TRANSFORMATION/NPC_METAMORPHOSIS will now preserve the original mob
- without removing it when the skill level is greater than one. [Skotlex]
- * Added SC_DANCING declaration in the Status Change tables to signal it
- modifies Walk speed. [Skotlex]
- * Fixed pc_damage setting your canlog_tick even if the damage has no source
- (eg: poison, berserk) [Skotlex]
- * Berserk's aspd bonus now stacks with other aspd bonuses, but is still
- affected by Quagmire/Forget-me-not. [Skotlex]
- * Corrected setting slaves_inherit_mode to not apply to morphosis skills.
- [Skotlex]
- * Corrected pc_setoption to invoke status_calc_pc when getting/removing the
- cart. [Skotlex]
- * Fixed @mobinfo displaying the wrong element. [Skotlex]
- * Fixed Autoblitz taking into account target's luck rather than attacker's
- [Skotlex]
- * Fixed slaves warping endlessly to their master when the master-slave
- distance exceeds 30. [Skotlex]
- * SC_ORCISH will now be dispelled on logout (if debufF_on_logout is set)
- [Skotlex]
- * Removed attackrange/attackrange_ from TBL_PC, corrected clif.c using the
- incorrect range variable. [Skotlex]
- * You can now equip/unequip stuff while the storage is open. [Skotlex]
-2006/05/31
- * Fixed Soul Drain not really giving you SP [Skotlex]
- * [Fixed]:
- - Suppressed compilation warning in chrif.c [Lance]
- * [Fixed]:
- - Guys can't go across map-servers :( [Lance]
- * [Fixed]:
- - Restoration and saving of sd->npc_id must be done every time. [Lance]
- * Added back the Freeze/Petrify adjustments of -50%def and +25%mdef (when
- where these lost?). Thanks to Buuyo for pointing it out. [Skotlex]
- * Corrected the mob_ai&2 setting triggering rude-attacked due to can't walk
- delay. [Skotlex]
- * Made the char_name_option char_athena.conf setting apply to parties and
- guilds as well. It cannot be applied to pets yet without adding a
- change-name-request interserver packet. [Skotlex]
- * Moved the JOB_* defines from map.h to mmo.h, update char.c to use them.
- [Skotlex]
- * Added function char_read_fame_list for famelist reading. Invoked it on
- init, and made it be sent automatically to connecting map servers.
- [Skotlex]
- * Some cleaning of the fame-list reading code. [Skotlex]
- * Some cleaning of the fame-update code, fixed a logic bug which made the
- ranking list fail to display the correct ranker names. [Skotlex]
- * Removed typedef bool from socket.h and included cbasetypes.c instead.
- [Skotlex]
- * Cleaned up and corrected the calculation of hit/flee/cri/lucky dodge in
- status_calc_bl. [Skotlex]
- * [Fixed]:
- - Incorrect SQL syntax in login.c (missing collumn) [Lance]
- * [Improved]:
- - SQL upgrade file for the new loginlog. Thanks to ultramage. [Lance]
- * [Fixed]:
- - nullpo in pet.c caused by equipping without checking if the pet is available.
- [Lance]
- * [Fixed]:
- - Latest client support completed! [Lance]
- * [Fixed]:
- - Missing #include for cbasetypes.h in login server SQL.
- - Logic errors in run_script [Lance]
- * [Added]:
- - Partial support for latest login packet. But it seems to have a new security
- module. [Lance]
-2006/05/30
- * [Improved]:
- - Fake NPC interface to use real NPCs.
- - Scripting interface to restore and save sd->npc_id. [Lance]
- * Added function pc_check_skilltree for checking if you unlocked new
- tree-skills when raising non-passive skills. [Skotlex]
- * Fixed flee/hit calculation in status_calc_bl to account for bonuses from
- the base status. [Skotlex]
- * [Fixed]:
- - Compatibility problems in login.c [Lance]
- * Fixed pets ignoring can-act delays for skill usage. [Skotlex]
- * [Added]:
- - Mercenary.c in VS.NET 2005 project files
- [Improved]:
- - loginlog using unsigned long `ip` field.
- (Please check for compatibility problems). [Lance]
- * Fixed status_calc_pc not zero'ing ALL vars it should, allowing certain
- bonuses (like effect-on-hit) to stack. [Skotlex]
- * slaves inherit speed setting will now work regardless of whether the
- slave or master has the MD_CANMOVE mode bit. [Skotlex]
- * Call Slave now invokes slaves on a 5x5 area around master. [Skotlex]
- * AL_TELEPORT will fail when used by slave mobs. [Skotlex]
- * Added NPC_ENERGYDRAIN, NPC_MENTALBREAKER to the list of undodgeable
- attacks. [Skotlex]
- * Fixed status_damage not setting your HP to 0 when you died [Skotlex]
- * Fixed the pcbonus2 warnings using the wrong value before printing the
- invalid Element error. [Skotlex]
- * Fixed underflow issues when calculating dmotion. [Skotlex]
- * Fixed Absorb Spirit Spheres [Skotlex]
- * Added battle_config min_chat_delay (default 0, battle/client.conf)
- specifies in ms what is the min delay between player sent chats
- (whisper/global/party/guild). Messages that exceed this threshold are
- silently ignored for now (perhaps need to add a "DON'T SPAM" reply to the
- player?) [Skotlex]
- * [Fixed]:
- - signed/usigned problem in sprintf and fscanf @ mercenary.c [Lance]
- * Rewrote/cleaned up @petfriendly. [Skotlex]
- * Cleaned up final part of status_calc_pc (flags 2/4 do not exist) [Skotlex]
- * Updated attr_fix_table reading code to account for ELE_MAX (will
- correctly read bigger elemental tables if ELE_MAX is changed) [Skotlex]
- * Aggressive mobs will now use battle_check_range rather than mob_can_reach
- to decide whether to lock-on or not to a target within sight-range. [Skotlex]
- * Added warnings in mob_readdb when the mob's element is invalid. [Skotlex]
- * Added error messages in pc_bonus* functions when an invalid element is
- passed to the relevant bonuses. [Skotlex]
- * [Optimized]:
- - clif_specialeffect to use the enums.
- [Improved]:
- - buildin_specialeffect and buildin_specialeffect2 to accept effect area
- definition. [Lance]
- * [Added]:
- - Visual Studio .NET 2003 includes for mercenary.c [Lance]
- * Removed the on-die specific code from unit_remove_map and placed it on
- the corresponding *_dead functions. unit_remove_map should never assume the
- char died, it is just a "remove from map" function. [Skotlex]
- * Updated status_damage to handle the general death code (clearing status
- changes, clearing skill related data, sending death packet, etc). The
- return value from the *_dead functions will tell it what to do or not with
- the object (death aborted, clear it from map/memory, etc) [Skotlex]
- * Cleaned up pc_dead to take advantage of the fact that status changes are
- not ended until after the function. [Skotlex]
- * Disabled ontouch npcs triggering on hidden/chase-walk characters.
- [Skotlex]
- * Updated/adapted current Homun code to use the status_data update.
- [Skotlex]
- * Updated map-server Makefile to compile mercenary.* files. [Skotlex]
- * [Fixed]:
- - Pets attacking even master is dead. [Lance]
- * Fixed battle_calc_weapon_attack damage capping damage to a minimum of 0
- (negative values should be allowed when attack is absorbed by target's
- element) [Skotlex]
-2006/05/29
- * [Fixed]:
- - Missing ';' in item #4358 [Lance]
- * [Fixed]:
- - Missing maps in map index database. [Lance]
- * [Fixed]:
- - Battle mechanics in battle_check_target [Lance]
- * [Fixed]:
- - Typo in mob_dead causing crash. Thanks to reddozen and his gang for testing.
- [Lance]
- * Cleaned up friend list saving and fixed loading of friends.txt file
- (char-txt) [Skotlex]
- * Added the Arunafeltz maps, not tested yet [Playtester]
- - someone with an up-to-date client should test them
- * Fixed pc_gainexp resetting your exp to 0 rather than adding it in...
- [Skotlex]
- * Corrected aspd calculation code to avoid negative overflows. [Skotlex]
- * Fixed battle_check_target check on BCT_ALL to check versus BL_CHAR
- instead of BL_PC and BL_MOB [Skotlex]
- * [Fixed]:
- - Declaration of int map_getcellp(struct map_data*,int,int,cell_t); [Lance]
- * Removed Undead being inmune to poison status. [Skotlex]
- * Removed speed penalty from SC_SKA [Skotlex]
- * Fixed SC_SPURT triggering on Soul Linkers. [Skotlex]
- * SC_DODGE won't be dispelled on death now. [Skotlex]
- * [Fixed]:
- - pc_follow_timer possible triggering crash.
- - pc_reg_received to use battle_status.hp instead of status.hp
- [Added]:
- - macro map_id2index for non-cyptic mapid to mapindex conversion. [Lance]
- * Added a division by zero check in mob_dead to prevent the (impossible)
- case where a mob dies with received damage of zero. [Skotlex]
- * Modified skill_get_range2 to return range 9 for skills with range 0 for
- Non-Players. This usually signals Self skills, and mobs/pets should be able
- to use them in other characters. [Skotlex]
- * Optimized a bit the SC_PROVOKE code (to use val3/val4) [Skotlex]
- * Fixed draining when the amount drained is negative (invoke zap rather
- than heal) [Skotlex]
- * Implemented GS_FLING as per the current skill description. [Skotlex]
- * Fixed pc_readparam/pc_setparam to use battle_status.hp/sp rather than
- status.hp/sp, fixes scripts reading the wrong Hp/Sp values [Skotlex]
- * Added some missing SC_* entries on the initial listing (potion related
- and speed up ones) [Skotlex]
- * Fixed function declaration of map_getcellp() [Skotlex]
- * [Fixed]:
- - status.c:920: warning: 'mbl' might be used uninitialized in this function
- - skill.c:6648: warning: 'matk_min' might be used uninitialized in this function
- - skill.c:6648: warning: 'matk_max' might be used uninitialized in this function
- - skill.c:2826: warning: 'sid' might be used uninitialized in this function [Lance]
- * [Optimized]:
- - Removed unused variable (account_id) in storage_guild_storagesaved.
- * [Optimized]:
- - Removed unused checks for unsigned data type and possible logic error for
- char type (gcc treats char as unsigned). [Lance]
- * [Fixed]:
- - Relogging in with 0 HP didn't trigger dead event. [Lance]
-2006/05/28
- * Added functions status_revive, pc_revive and mob_revive to handle revival
- (it doesn't handles player respawning, though). Fixed reviving @ commands.
- [Skotlex]
- * Added SC_BLADESTOP to the skill enum at the beginning of status.c (fixes
- Bladestop causing an unknown status change message). [Skotlex]
- * Fixed MSS_DEAD state skills not triggering. [Skotlex]
- * Changed undeads to by default always sustain 100% of the damage from firewalls [MasterOfMuppets]
- * [Fixed]:
- - script functions that doesn't pass references, thanks to End_of_exam. [Lance]
- * [Protected]:
- - clif_parse_LGMmessage from possible hacks [Lance]
- * Fixed unable to store n items into storage unless n was the total amount
- of items you had. [Skotlex]
- * Suppressed compilation warnings (unsigned and signed mismatches) [Lance]
-2006/05/27
- * Added structure status_data which holds status-related information (str,
- agi, etc, speed, amotion, adelay, dmotion, weapon-damage, race, size, etc)
- and weapon_atk structure with the weapon specific info (atk, atk2, element)
- to be used by all combat structures (TODO: Homun needs to be updated to use
- it). This in change involves a LOT of changes throughout the code and many
- optimizations were done as well. Partial list (see svn changelog for complete
- changes): [Skotlex]
- - NOTE: Changes are substantial! I tested a bunch of stuff and all the
- skills I changed the most, but it is possible there are unnoticed bugs
- remaining to fix!
- - Cleaned up TBL_PC, TBL_MOB, TBL_PC and mob_db structures to use status_data.
- - Split damage received functions into pc_damage/pc_dead and mob_damage/mob_dead
- - Added status functions to deal with damage and healing (status_damage,
- status_heal, status_percent_change) and a bunch of defines for easier
- handling of them (status_percent_heal, status_percent_damage,
- status_fix_damage, status_kill, etc). Objects must be hurt/healed through
- THIS, pc_damage/mob_damage most no longer be directly invoked!
- - Rewrote and cleaned up battle_calc_misc_attack
- - Merged config options pc_attack_attr_none, mob_attack_attr_none,
- pet_attack_attr_none into attack_attr_none (type 4)
- - Removed config options player_defense_type, monster_defense_type,
- pet_defense_type in favor of weapon_defense_type
- - Modified skill_calc_heal to take into account the MEDITATION bonus.
- - Modified Slim Pitcher so it will work when casted by non-players. Will
- now also work with SP-healing items.
- - Rewrote Freedom of Cast code to use function status_freecast_switch to
- switch adelay/speed when cast begins/ends.
- - Modified Magic Power to store amplified MATK/MATK2 in val3/val4 for
- easier updating when used in conjunction with ground skills.
- - Fixed Asura Strike being usable from within a combo regardless of combo skill.
- - Added status_calc_bl which does status-change related calculations using
- as base the base_status of the bl object and the SCB_* flag passed. This is
- invoked on status changes, and status_calc_pc will no longer be invoked
- (which results on much faster status-change calculations).
- - pc_clean_skilltree will now also remove item-granted skills.
- - Learning skills will now only invoke status_calc_pc when the skill is passive.
- - Cleaned up pc_check_base/job_lvup to only invoke the lv-up related
- packets and functions ONCE regardless of skill-levls earned.
- - Cleaned up pc_ regen related functions.
- - Made player-sprite mobs have item pickup animation and walkdelay when taking items.
- - Clones will copy a player's base status rather than battle status (so
- status-change alterations are not cloned)
-2006/05/26
- * Part B of the homunculus code. [blackhole89]
- While most of the homunculus handling functions are in now, it still lacks
- code required for players to create it.
- Given I haven't screwed up, you could master yourself one through the DB though.
- * Fixed crashing in mob.c [Lance]
- * Patches to allow everything to work right. + 1 more sample script. [Lance]
- * Mob control engine tested 99% working so far. [Lance]
- * Change scripting engine's NPC scope vars to dot (.) style.
- * Improved and (should be fully) fixed the mob control engine. [Lance]
- * Fixed typos in char.c [Lance]
- * Rewrote fame rank lists system to reduce char-server load, as requested by
- Skotlex: now it has a copy of those lists, and updates only the proper one
- when needed instead of rebuilding all from saves everytime (which required
- to always save the character before rebuilding the lists) [DracoRPG]
- - Note it hasn't been compiled nor tested with SQL, please do it for me
-2006/05/25
- * Simplified ASC_BREAKER by making it a BF_WEAPON attack with an additional
- int-based damage component (which is added right before elemental
- modifiers) as described by AuronX. Pending further refining. [Skotlex]
- * Resolved differences between Stable/Trunk msg_athena.conf. [Lupus]
- Fixed atcommand @request MSG numbers accordinly.
- On adding new MSG strings, plzm reserve them in STABLE msg_athena.conf, too
- * Added NoVending mapflag. You may disable vending in the streets [Lupus]
- * Increased capacity for Account Variables to 64 [Skotlex]
- * Reverted Intravision implementation to that of stable's. [Skotlex]
- * Corrected Login Server taking it's first argument as both login config
- and lan config. [Skotlex]
- * Fixed mob control commands.
- * Fixed memory leak in scripts (again). Still have a few lying. [Lance]
-2006/05/24
- * Fix to the slave AI problem. [erKURITA], by [Skotlex], reported by Niktout.
- * Item sharing now shares the same rules as exp sharing (no sharing when
- dead, or idle, etc) [Skotlex]
- * Fixed summoned slaves being able to cast onspawn summon-skills (slaves
- aren't supposed to be able to call minions) [Skotlex]
- * The clif_skill_poseffect packet will not be invoked in Snap unless the
- skill was successful. May fix the client-position lag. [Skotlex]
- * Merged item_db.sql from stable (the one from stable was more recent than
- the one of trunk...) [Skotlex]
- * Corrected SL KA* spells not working on other Soul Linkers. [Skotlex]
- * Corrected a pair of incorrect sql query parsing logic in the login-sql
- ban request packet. [Skotlex]
-2006/05/23
- * Corrected mob angry mode, now it only "restores" itself after being hit
- when the mob has no target within their range of sight rather than on
- picking a new target. [Skotlex]
- * Fixed wedding sprite where it would stay active after unequipping. [Zido]
- * Some cleanup of run_script, should fix the memory leak there. [Skotlex]
- * the charname request hack message has been downgraded to only include
- GM-invisible characters. [Skotlex]
- * corrected clif_charnameack to send negative ID when a disguised player
- asks for it's own disguised name. [Skotlex]
- * Cleaned up the disguised target-id checks taking into considering that
- the only character that sees a negative ID is the same disguised character.
- [Skotlex]
- * Modified battle_calc_weapon_attack to use new flags pdef/pdef (pierce
- defense), Investigate and Icepick will now use the final def/vit-def values
- rather than the base ones. [Skotlex]
- * The move-enable condition checks for skills are now checked for only when
- on skill use, not at cast-end time. [Skotlex]
- * Corrected clif parse name request failing on disguised characters [Skotlex]
- * Corrected Soul Drain draining from all non-ground-based skills including
- non-magic attacks. [Skotlex]
- * Corrected pc_setoption to change the option and then change class.
- changing option-wedding will automatically convert the view-class as well.
- [Skotlex]
- * Corrected the 15% drop rate increase when killing higher level mobs in
- pk-mode triggering for all mobs with lower level than yourself. Thanks to
- Vayu. [Skotlex]
- * Fixed typo (this time it's not my fault) in script_reload() clearing the same
- db each time o_o [Lance]
- * Fixed sleep command. [Lance]
- * Added 'setd' support for local NPC scope (') variables. [Lance]
- * [Scripting Engine Update] New variables are ready to be used. [Lance]
-2006/05/22
- * Updated skill_delayfix to return 0 for mobs since they have no skill
- delay other than the one specified in mob_skill_db [Skotlex]
- * Corrected the 20 lvl diff 15% exp bonus on pk_mode servers. Thanks to
- Vayu for pointing it out. [Skotlex]
- * status_get_sc_tick will now use directly Stun's formula rather than
- invoking the status sc chance once. [Skotlex]
- * Fixed a possible null pointer in script command misc_effect [Skotlex]
- * Modified Investigate to take into consideration final def/vit-def rather
- than base values for damage adjustment. [Skotlex]
- * WARNING: New scripting system contains memory leak
- TODO: Free all scripts using script_free_code() instead of old methods. [Lance]
- * Excluded idle and auto-trade party members from TK_POWER list. [Lance]
- * Fixed compilation errors.
- Tidy up jobmaster for easy debugging. [Lance]
-2006/05/21
- * Part A of the Homunculus code.
- This only features the structures, status_* and clif_* (packets) and is
- not functional yet in any conventional way, but doesn't interfere
- with present functionality either.
- Main purpose is helping me to keep my work organized. [blackhole89]
- * Fixed the "fake" mute status bug. [Zido]
- * Speed up array size calculation and deletion. [Lance]
- * Player must learn the skill before doing auto-spell [Lance]
- * Exploit prevention in clif_parse_NpcStringInput [Lance]
- * SC_SPEARSQUICKEN -> SC_SPEARQUICKEN normalized enum name [Lupus]
- * Thanks to damirych & Falcon for [2006/04/30] STEAL skill [Lupus]
-2006/05/20
- * grfio_final moved back if any of GRF overriding is enabled so servers
- with such configuration will not have different values after reloading. [Lance]
- * jA1983 script.c buildin_menu fix. Thanks to End_of_exam. [Lance]
- * Abit of alterations to login-server. [Lance]
-2006/05/19
- * Minor unsigned/signed alteration in pc_additem to shut the compiler up. [Lance]
- * Small change in pc_additem that could be fixing the current bug with new
- items not getting added. [Skotlex]
- * Fixed loginlog definition in main.sql, thanks to Tempesta [Skotlex]
- * Likely fixed the mob-skill random picking behaviour causing infinite
- loops sometimes. [Skotlex]
- * Modified mobskill_use behaviour to pick a random starting point and check
- skills from that, rather than always checking from first to last. Fixes
- skills with high priority blocking skills lower down in the list from
- triggering. [Skotlex]
- * Updated mob ai behaviour so that mobs use IDLE state skills when their
- current target cannot be reached for melee fighting. [Skotlex]
-2006/05/18
- * Added 5 config settings to adjust damage in pk-mode servers (misc.conf)
- [Skotlex]
- * Fixed mob_max_skilllvl being capped to 11! [Skotlex]
- * Rewrote/cleaned up several functions in storage.c [Skotlex]
- * Optimized pc_additem comparisons to account for items with more than four
- slots. [Skotlex]
- * Updated clif.c to enable retrieval of items from cart/storage while
- trading. Exception is retrieving items from the cart while vending.
- [Skotlex]
- - The reasoning is that an ongoing trade will not get "corrupted" if you
- earn items before it is commited (only if you lose items from your
- inventory), and it is an annoyance when you realize the stuff you want to
- trade is on the cart/storage.
- * skill reiteration code now does not checks for the trigger-area of the
- skill in the case of non-players, which means mobs can now place traps in
- cells adjacent to each other. [Skotlex]
- * Applied an experimental weather code that should lower bandwidth usage to
- near-none, which's only disadvantage should be the weather not clearing out
- until moving to another map (even when the mapflag is removed from the
- current map). Please test and report if there's any anomalies with it.
- [Skotlex]
- * NPC_AGIUP will now give movement boost of 50% [Skotlex]
- * Fixed WZ_WATERBALL number of hits when used by non-players. [Skotlex]
- * MO_BODYRELOCATION will send the slide packet with the actual src's
- coordinates rather than selected tile. [Skotlex]
-2006/05/17
- * Modified mob_can_changetarget to return true always when the new target
- is the provoked-by character. Fixes provoke not making the mob change
- target when it already is locked on another player. [Skotlex]
- * Added check to clear previous skill when combo time ends. Should fix TK
- Rankers being unable to initiate a combo with the same kick their previous
- combo was finished with. [Skotlex]
- * Power Up and Agi Up now increase Hit/Flee by 20%/lv [Skotlex]
-2006/05/16
- * Modified "hide woe damage" to send the number of hits rather than 1 as
- damage Because when the damage is less than the number of hits, the client
- will display MISS. [Skotlex]
- * Fire Pillar will now do 200%MATK damage per hit when level is >10.
- [Skotlex]
- * Blood Drain always hits now. [Skotlex]
- * Fixed Mob Area Skills not updating their use-time (rendering their skill
- delay useless) [Skotlex]
- * Search free cell will now skip picking the center-tile as target
- location. Will prevent slaves from walking on top of their master, or mobs
- placing stuff right under themselves with the "around" target conditions
- among other things. [Skotlex]
-2006/05/15
- * Small changes to the skill.conf
- - Monsters now can place ground skills on top of each other by default
- - Land_Skill_Limit format changed and set to "Only Players" by default
- * When reading mapflags, when a map is set to be pvp or gvg, the other will
- be turned off (disables pvp mapflags in gvg maps for pk-servers) [Skotlex]
- * Firepillar's damage per hit is now 100% MATK (rather than 20%) when the
- skill level is above 10. [Skotlex]
- * Sorted out the item_data structure, getiteminfo should work correctly
- now. [Skotlex]
- * KA* skills can now be casted on other Soul Linkers as well without the
- Spirit requirement. [Skotlex]
- * Soul Drain will now show the SP drained regardless of drain display
- settings. [Skotlex]
- * SC_COMBO state will now end in skill_attack rather than
- skill_check_condition (as it is required there to apply damage bonuses
- based on combo-casted skills) [Skotlex]
- * Fixed Option_Wedding in const.txt (0x1000 won't work, it has to be 4096)
- [Skotlex]
- * Fixed the nocast flag 2 (not usable in pvp) returning true in pk-mode
- servers. [Skotlex]
- * When removing a castle's owning guild, the char servers will erase the
- guardian data now. [Skotlex]
- * Changed the behaviour of immobile mobs when they can't chase their
- target. Rather than using a longrange skill and then unlocking, they will
- use an attack/angry state skill and then unlock. [Skotlex]
- * Some adjustments of how disguising + gm-hiding work together. [Skotlex]
- * Fixed clif_GlobalMessage being the exact same function as clif_message
- (the first should send to ALL_CLIENT and the later should send to
- AREA_CHAT_WOS). Should fix globalmes script command. [Skotlex]
- * Added SC_BLADESTOP to the switch listing in status_change_start [Skotlex]
- * Characters in vending are now always considered "idle" if the
- idle_no_share setting is active. [Skotlex]
- * Players with OPTION_INVISIBLE should not be sent to clients. [Lance]
- * Remaining fixes for item scripts. [Lance]
- * Added NPC event deprecated warnings to ease debugging old scripts. [Lance]
-
-2006/05/12
- * Supplied fake NPC ID in sd->npc_id for item scripts. [Lance]
- * Bugfix on fake npc [Lance]
- * Fixed mob_once_spawn not working for non-random coordinates. [blackhole89]
- * Reverted again the change that stuns the caster on Ske, Ska, Swoo when
- the target is a nonplayer (rather than always) [Skotlex]
- * Modified mob_spawn_once so that coordinates -1,-1 are "random around the
- player" while 0,0 are random around the whole map (regardless of whether
- there's a player attached or not) [Skotlex]
- * Knockback will no longer work on traps during woe. [Skotlex]
-2006/05/11
- * Fixed the definition of the KEY in the loginlog, thanks to TheUltraMage
- [Skotlex]
- * NPC_POWERUP and NPC_AGIUP now cause a increase in hit/flee (respectively)
- of 40% per level. [Skotlex]
- * Changed a bit the MAX_ZENY checks in trade.c to prevent overflows.
- [Skotlex]
- * Rewrote npc_selllist for a more proper-clean implementation. [Skotlex]
- * Increased NPC_POWERUP's dex bonus to +25*lv [Skotlex]
- * Moved TK_DOWNKICK's stun time from time to time2 [Skotlex]
- * Added TK_TURNKICK's stun to splash-pushed mobs. Duration is 2secs (time2)
- [Skotlex]
- * Merged the code for Ska, Ske, Swoo together. Swoo stun duration is now 10
- secs (reducable) if you target a mob that already has Swoo active. [Skotlex]
- * Added the missing semi-comma from the upgrade_svn6533.sql file. Thanks to
- Tanaous [Skotlex]
- * Added back the missing code that substracts arrows when normal-attacking.
- [Skotlex]
-2006/05/10
- * Changed the state of Asura back to explosionspirits, added a hardcoded
- move_enable check when invoking Asura and NOT while in BladeStop or a
- Combo. [Skotlex]
- * Added back SC_XMAS to status.c, it got lost sometime during all the
- previous reworkings. [Skotlex]
- * Changed wedding costumes to use setoption rather than changebase.
- [Skotlex]
- * Modified setoption so that flag 1 or no flag adds an option, and flag 0
- removes it. [Skotlex]
- * Updated script_commands with the new behaviour. [Skotlex]
- * Updated mob_db2.txt and mob_db2.sql to have only 10 drop slots rather
- than 15. [Skotlex]
- * Users are now able to use their own dnsbl servers (login_athena) [Zido]
-
-2006/05/09
- * Rewrote/cleaned up trade.c for a more clean trading implementation.
- [Skotlex]
- * Added @request commands, sends a request to all connected GMs of
- lowest_gm_level or above as a whisper message. Defaults to gm level 20
- users (UNTESTED). [Skotlex]
- * Modified @commands to use Meruru's code which is faster and does a fair
- attempt at tabulating the commands presented. [Skotlex]
- * Updated SKA to return a random value between 0 and 99 each time
- status_get_def is invoked. [Skotlex]
- * Updated Making Arrow to not include unidentified items in the list.
- [Skotlex]
- * Reduced drop slots from 15 to 10. [Skotlex]
- * Updated mob_db.sql with the current data. [Skotlex]
- * Updated setoption script command to receive a second (optional) argument
- flag. If the flag is 1, the option is added to what the player currently
- has; likewise using flag 2 removes only that option. No flag (or any other
- value) is the older behaviour of removing all other options and setting
- specificly what is passed. [Skotlex]
- * Updated script_commands information for setoption due to this change.
- [Skotlex]
- * Small fix in npc-created chat rooms to properly include the terminating 0
- on the chat's event. [Skotlex]
- * Fixed Fog of Wall's symmetry in respect to Misc attacks, they no longer
- get reduced by 50% regardless of who is standing on the fog. [Skotlex]
- * monster_ai&2 will now trigger the rude-attacked skill when the mob can't
- move and the attacker is out of it's attack range. [Skotlex]
- * Added missing icon for Joint Beat [Skotlex]
- * Mob-search functions will now skip enemies with no exp/job_exp. [Skotlex]
- * Treasure chests will now be excluded from the mob-drop listings
- (@whodrops) [Skotlex]
- * Fix on pc_skill which fixes overlapping when one gets more than one bonus
- for the same skill. [Skotlex]
- * Updated main.sql's loginlog table structure. [Skotlex]
- * Added svn_update6533.sql to update the loginlog structure as suggested by
- theultramage. [Skotlex]
- * Cleaned up somewhat the implementation of BladeStop. [Skotlex]
- * Fixed the head_bottom (pet-armor) position in packet 0x22c (walk packet)
- when crafted for non-players. [Skotlex]
- * Script commands sc_start, sc_start2 and sc_start4 will now start
- regardless of sc defense of the target player (that is, they cannot be
- avoided/blocked) [Skotlex]
- * Fixed a possible counter overflow in attacked_count, changed the var size
- to unsigned char since the code can handle the overflow now. [Skotlex]
- * Multiple targets again reduces armor defense, as reported by Tharis.
- [Skotlex]
- * Increased dex bonus of NPC_POWERUP to +20 per level. [Skotlex]
- * Fog of Wall's -50 hit reduction is now only for ranged attacks. [Skotlex]
-2006/05/08
- * Reverted the change that was making ES skills stun the caster always.
- [Skotlex]
- * Removed the fixpos packet which is sent whenever you are hit while moving
- as Aegis doesn't sends this packet neither. [Skotlex]
- * ES magic will now put the caster on stun for 0.5 secs regardless of
- whether the skill-target is a mob or not. [Skotlex]
- * Added function clif_party_join_info which sends packet 0x1e9 each time a
- party-member joins. This packet (as redundant info as it has) should also
- contain the field for "adoptability", but that needs to be coded in yet.
- [Skotlex]
- * Added clif_ParseAdoptRequest which does the basic adoption handling. More
- checks and the reply packets still need to be coded in. [Skotlex]
- * Happy State and TK stances won't dispel on death now. [Skotlex]
- * Cleaned up combo-skill implementation, SC_COMBO is automatically ended in
- skill_check_condition now. [Skotlex]
- * Modified TK-ranker infinite combos to behave as described by AuronX.
- Refer to his thread in the development section for details. [Skotlex]
- * Made all Soul Link Spirit skills not be castable on self. [Skotlex]
- * Changed rate of NPC status effect skills to 50+10*lv% base chance
- (guessed, but better than 100% for all levels) [Skotlex]
- * Changed max level of NPC status effect skills to 5 [Skotlex]
- * Increased max number of tries to find a random spot in maps to 1000 since
- some maps have so many non-walkable tiles it's hard to find one in just 100
- tries. [Skotlex]
- * status_set_viewdata will remove the Wedding Option status when you set a
- class that is not wedding. [Skotlex]
- * hide_gvg_damage will now send 1 instead of -1 as damage. [Skotlex]
- * idletime will now be updated on attack-request, not on sit/standup
- [Skotlex]
- * Party members sitting will no longer be considered idle. [Skotlex]
- * Removed SP_DISGUISE from the bonus list (onequip/onunequip should be used
- with the disguise/undisguise script commands instead). [Skotlex]
- * Moved Sharp Shooting display to the block with Auto-Counter (since that's
- the other skill that can show critical as well) [Skotlex]
- * Corrected some fields in the standing still packet (guild emblem being
- stored as a Long when it should be Short) [Skotlex]
- * Modified most fields of view_data to be unsigned shorts rather than
- signed ones. [Skotlex]
- * On-Touch NPCs will now make you stop walking when you trigger them.
- [Skotlex]
- * ShadowJump/JumpKick will make you land on the target's cell now.
- [Skotlex]
- * Fixed Kaahi triggering only once per skill duration. [Skotlex]
-2006/05/07
- * Fixed readme/changelog.html [KillerBox]
- * Removed old logs. [Lupus]
- TODO: 1. Add produce logging into PICKLOG 2. Replace map names with map index
-2006/05/05
- * Optimized clif.c clif_scriptmenu/input/inputstr to check for sd->state.using_fake_npc
- before sending one (as it's not required to send twice).
- * Reinitialize sd->state.using_fake_npc in clif_parse_LoadEndAck (for scripts that warps
- players and still continues execution to work). [Lance]
- * Updated item_db.sql to current. [Skotlex]
- * Fixed a bug in @commands, most likely the reason some people were still
- getting crashes. [Skotlex]
- * Fixed @commands not showing the last available commands (unless the total
- amount of commands is divisible by ten) [Skotlex]
- * Added a npc-script-event cache to avoid looking up event-scripts every
- time they need to be executed. Events cached are all those defined in
- script_config (on login, logout, mapchange, death, kill, level up) [Skotlex]
- - Since the cache holds direct pointers to the npcs/events, do NOT unload
- the related NPCs or you'll get dangling pointer crashes. However,
- @reloadscript will work fine.
- - Set the etc_log to on to see a summary of npcs/events loaded for script
- execution on startup.
- * The Rest bonus activated by using /doridori while in rest should now
- trigger with all the class tree (TK/SL/SG) [Skotlex]
- * Fixed Kaupe always triggering when the one who was under Kaupe was a
- player rather than the one attacking... [Skotlex]
- * /doridori now won't double the HP/SP regen of TKs, it only activates
- their "happy" state. [Skotlex]
- * Added the -50 hit penalty when standing on Wall of Fog. [Skotlex]
- * Uncommented the status_calc_mdef2 call in status_calc_pc. [Skotlex]
- * Being in Enjoyable Rest state will now also trigger the HP/SP Time skills
- (even if there's no other TK around). [Skotlex]
- * Added battle config settings view_range_rate and chase_range_rate to
- adjust the view-range and chase-range (range2/range3) of the mob_db without
- having to manually change them (battle/monster.conf) [Skotlex]
- * Kaupe now will only block all skills of players, for non-players, only
- normal attacks can be missed. [Skotlex]
- * Moved the Kaite spell-reflect code after the damage calculation function,
- so the reflected damage is exactly the damage the original target would
- have received. Will only trigger if the damage to be reflected is above 0.
- [Skotlex]
- * OnEquip scripts will now trigger on log-on. [Skotlex]
- * Infinite Endure will no longer give mdef bonus. [Skotlex]
- * Removed bInfiniteEndure bonus, Eddga card now uses onequip/onunequip to
- start/end infinite endure. [Skotlex]
- * Fixed Kaahi's SP cost per heal. [Skotlex]
- * Now when walkdelay is set to 0, characters will stop walking when hit,
- but will not have any walk delay. (previously setting walk delay to 0 would
- not even stop characters from walking when hit) [Skotlex]
-2006/05/04
- * Some people think its sexy to declare variables after blocks of code. Fixed. [Zido]
- * Fixed a possible infinite loop in skill_clear_unit_group [Skotlex]
- * Some clean-ups in the mob_ai [Skotlex]
- * Improved atcommand autoloot, now displays droprate in percents and notices
- player if autoloot is already on or off. Also simplified the code [Harbin, Kain],
- commited by erKURITA
- * Added one grace range in the mob_loot search function which should fix
- mob_can_reach failing when invoked with the same distance that distance_bl
- returned. [Skotlex]
- * Stun time for using ES magic on non-mobs reduced to 0.5 secs. [Skotlex]
- * Eska is now usable on bosses. [Skotlex]
- * Swoo will stun you if attempted on an already 'swooned' enemy. [Skotlex]
- * clif_skill_failed will print out a debug line with the skill_id (since
- the current null_po does not helps at all to fix it) [Skotlex]
- * Applied TheUltraMage's suggested fixes to the grfio module. [Skotlex]
- * Rewrote Kaahi to behave as it should. It will heal whatever amount of
- damage accumulates in the time2 interval (500ms by default) after being
- hit. [Skotlex]
- * Changed skill_unit_move_unit_group to enable moving of all types of
- ground-skills except ensembles (fixes warmth not following you) [Skotlex]
-2006/05/03
- * Kaahi now triggers every 500ms rather than on every hit (but it only
- heals if in those 500ms an attack that would previously trigger Kaahi has
- taken effect). In other words, it works just like before, except damage
- gets "buffered" into 500ms slots. [Skotlex]
- * Kaite, Kaute will now show a skill effect when they trigger. [Skotlex
- * Knowledge will now only trigger if you logon to the memorized map, not
- walk into it. [Skotlex]
- * Corrected @whomap directly invoking msg_table[] rather than msg_txt()
- [Skotlex]
- * Guessed where the pet data goes in spawn packet 0x7c. This may be wrong
- and not fix the pet issue, but I doubt it'll cause any problems that won't
- be fixed by making the pet move. [Skotlex]
- * Updated Charge Attack's state from none to move_enable. [Skotlex]
- * Made tomahawk an NPC_SKILL so that it may not be plagiarized. [Skotlex]
-2006/05/02
- * Fixed standing up not really standing you up. [Skotlex]
- * Moved battle_consume_ammo to the end of skill_castend_damage_id,
- skill_castend_nodamage_id and skill_castend_pos2 rather than
- battle_calc_weapon_attack. They will trigger when the player's arrow_atk
- state is active and a ground skill was not invoked. It should fix all
- issues with splash/ground skills consuming ammo per target rather than once
- per skill use. [Skotlex]
- * Added structure state to the ground skills, their fields are magic_power,
- into_abyss and ammo_consume to indicate the states that were previously
- stored in val3. [Skotlex]
- * Implemented desperado as explained by Rockman-EXE. The skill-effect is
- not showing up though, I'll need some logged packets to see what's missing.
- [Skotlex]
- * Removed the unit_can_move checks in skill cast-end, they should be
- performed in skill_check_require when the skill's state is move_enabled.
- [Skotlex]
- * Changed extremity fist's state to move_enabled, the explosion spirits
- check is now hardcoded. [Skotlex]
- * Absorb Spirit Sphere now gives +10SP per sphere as per discussions with
- Haplo. [Skotlex]
- * Changed a <= into a < in pc_steal_item. This means drops with 0.01% are
- impossible to steal unless you have at least 100% steal-rate (where steal
- rate is dex - opponent dex + skill_lv*3% + 10%) [Skotlex[
- * Cleaned up clif_parse_action_request to enable sitting/standing while in
- shops, interacting with npcs, etc. [Skotlex]
- * Kaite now works against all types of spells. [Skotlex]
- * Kaupe now works against all skills. [Skotlex]
- * Sanctuary now won't damage non-enemies. [Skotlex]
- * Blessing now will always give you bonus stats even if you are wearing
- undead armor. [Skotlex]
- * Modified how Rogue's treasure works so that you get +1% to your steal
- rate rather than +0.01% to the final rate. [Skotlex]
- * Rewrote Warmth to use ground-skill-units, it should behave now like in
- officials (implementation is not quite the same, but it should yield the
- same effects while consuming less bandwidth). "Stacking", as it's called,
- is possible now, but limited to eA's minimum timer skill interval (100ms).
- [Skotlex]
- * Modified NPC_POWERUP so that it gives +10 dex * skill level rather than
- +5+lv to all stats (as explained by Playtester and Tharis on how the skill
- behaves). [Skotlex]
- * Allowed SG_FEEL memorizing the same map for all three. [Skotlex]
- * SC_FUSION won't end when you die now. [Skotlex]
-2006/05/01
- * Added knockback when you run into a wall during running. However
- position is not being refreshed on the client yet... [Skotlex]
- * Fixed pc_disguise not allowing you to "redisguise". [Skotlex]
- * Corrected a crash when sd is null in npc_event [Skotlex]
- * After testing to make sure it works properly, I'm including
- new battle conf options to limit MVP drops. [Reddozen]
- * Removed OPTION_XMAS, it seems to not exist.... [Skotlex]
- * Added SC_SMA to handle "ready to use SMA" status (rather than SC_COMBO)
- since it has a visual effect to use. [Skotlex]
- * Corrected the value of OPTION_FLYING [Skotlex]
- * Using SG_FUSION ends Soul Linked effect. [Skotlex]
- * status_setviewdata will set your option accordingly when the previous/new
- view-class is wedding or xmas suit. [Skotlex]
- * Added function map_foreachinshootrange, behaves the same way as
- map_foreachinrange, but it also performs a "shoot-path" check before
- invoking the function. Used in the skill subtimer function if
- skill_wall_check is defined. [Skotlex]
- * Fixed AL_WARP displaying "Unknown Area" selections when you don't have
- all memo points used up. [Skotlex]
- * Fixed alive_count not being reset on skill unitsetting, which leads to
- some groups not being cleared once all their units expire. [Skotlex]
- * Optimized Kaahi/Kahai, will now only show the amount of HP healed. Moved
- to skill_counter additional effect so it may trigger even on miss. [Skotlex]
- * SKA no longer blocks skills. [Skotlex]
- * Optimized fake npc system. Added npc_checknear back to npc_buysellsel. [Lance]
+Date Added
+
+AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
+IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
+
+2006/11/29
+ * Probably fixed the Segmentation Faults we've been having. [FlavioJS]
+ Description: A player quits and it's session is freed and set to NULL,
+ but the char server already sent a packet with player information
+ (registers, storage, ...). If a message is sent in consequence of
+ updating that info, a segmentation fault happens because
+ session[sd->fd] is already NULL.
+ Fix: make shure the session of the target player is valid before
+ processing the rest of the char server's message.
+ * Some minor cleanups. [FlavioJS]
+ * Fixed the new npc parsing code not accounting for windows-style line
+ terminators, which as a side effect messed up mapflag parsing if the file
+ had windows-style terminators, which coincidentally was the case for the
+ nopvp file, which unfortunately meant that all towns became pvp! [Skotlex]
+ * HT_PHANTASMIC no longer knocks back even when it misses. [Skotlex]
+ * Earned exp by dead homuns will now be lost (same treatment as earned exp
+ from players that died) [Skotlex]
+ * Now gvg_dungeon mapflag will activate the other mapflags which are
+ required: pvp, pvp_nocalcrank and pvp_noparty/pvp_noguild (they are forced
+ to off if gvg_dungeon is on and viceversa) [Skotlex]
+ * Cleaned the pvp ranking code so that it takes effect even if
+ pvp_nocalcrank is active WHEN the map is a gvg_dungeon one. [Skotlex]
+ * Now homuncs and their masters are the only ones who can use support
+ skills on them. [Skotlex]
+ * Some cleaning on the homunc speed calculating code, so that it correctly
+ uses the default walk speed if the player has no speed yet. [Skotlex]
+2006/11/28
+ * Fixed a typo which made the wedding_ignore_palette setting not work when
+ you log on with them equipped [Skotlex]
+ * Applied The Ultra Mage's patch to use strict npc header formatting
+ parsing. Updated the relevant stock scripts/mapflags that didn't conform to
+ the standard. [Skotlex]
+ * Moved the blocking of casting supportive skills on homunculus from
+ battle_check_target to status_check_skilluse as bct is not invoked unless
+ the skill is offensive (or party/guild only) [Skotlex]
+ * Cleaned up status_calc_bl_sub_hom, fixed recasting dex/str/vit/int
+ bonuses skills making their atk/def/mdef stack with itself over and over.
+ [Skotlex]
+ * Updated sql files [Playtester]
+ * Changing setting the Guild Master from pc_authok to clif_parse_LoadEndAck
+ so that it will not fail to set the gmaster flag when the first person of a
+ guild to log on is the guild master. [Skotlex]
+ * Modified the way Storm Gust freeze's counter works. Now it checks for the
+ caster of the Storm Gust, if it's the same as the previous hit, the counter
+ is increased, otherwise, the ID is updated and the counter is changed to 1.
+ [Skotlex]
+ * Fixed always receiving at least 1 bexp/jexp even when the mob gives no
+ exp at all. [Skotlex]
+ * Changed write to send as suggested by TheUltraMage in:
+ http://www.eathena.ws/board/index.php?showtopic=105417
+ Hopefully that will take care of the SIGPIPE problem in Debian and cygwin. [FlavioJS]
+ * Server name in core.c skipping '\\' characters. [FlavioJS]
+ * Memory allocation functions using file,line,func from the invoking functions. [FlavioJS]
+ * Other minor malloc changes. [FlavioJS]
+2006/11/27
+ * Now when a player's "attack once" request fails due to range, the client
+ is told to move to the target to attack it. This sort of fixes the problem
+ of the client SPAMMING the server with attack requests from afar without
+ even approaching the icewall. [Skotlex]
+ * Updated the status change field "option" to an int rather than short.
+ This fixes the option values for xmas/sightblaster not getting set, which
+ could explain why some people crash when equipping weapons while in xmas
+ suit. [Skotlex]
+ * Fixed the Homunculus hungry timer not starting on login. [Skotlex]
+ * Added logging for standard GM commands (/mm /b /kick etc) [KarLaeda]
+ * Some cleanups on the trade_additem function. When specifying a qty of 0,
+ an ack will be returned to the client so it doesn't gets stuck. [Skotlex]
+ * Update sql files [Toms]
+ * Corrected the skill animation for Absorb Spirits [Skotlex]
+ * Cleaned up a bit the implementation of how Gravity Field blocks the
+ caster from moving. [Skotlex]
+ * Mob class-changing will fail if the new class is the same as the previous
+ one. [Skotlex]
+2006/11/24
+ * Homunc's min matk is now always equal to max matk [Skotlex]
+ * Fixed EDP's damage being 100% more than it should (should be 4x, not 5x
+ on normal attacks) [Skotlex]
+ * Self Destruction will only hit everyone and not just enemies when used by
+ mobs (non marine spheres) unless the map is a versus map. [Skotlex]
+ * Spider Web's duration is now halved on players (before it was halved in
+ pvp maps only) [Skotlex]
+ * Likely fixed Homunculus not disappearing the second their intimacy hit 0.
+ [Skotlex]
+ * Fixed uninitialized variable fd being used in WFIFOHEAD in a few clif
+ functions. [Skotlex]
+ * Fixed the fact that the TURBO code breaks when you attempt to handle more
+ than one connection at a time within the same function. However this broke
+ map-server compilation, therefore, don't use TURBO yet! [Skotlex]
+ * While at it, cleaned a few packet implementations in the char/login
+ servers which were not only ugly, but had some really stupid flaws within.
+ [Skotlex]
+2006/11/23
+ * Completed Reddozen's hanging mapwarp code to support party and old syntax. [Lance]
+ * Updated sql files [Playtester]
+ * Made WFIFOHEAD() check for available buffer size remaining on the
+ connection, and when there's not enough space, it will increase it.
+ [Skotlex]
+ * Added define TURBO to the Makefile. It enables MouseJstr's socket access
+ optimization which should speed up the code when accessing the write/read
+ buffers repeatedly within a function. [Skotlex]
+ * Fixed the functions where the RFIFOHEAD/WFIFOHEAD functions were used
+ incorrectly (prevents TURBO enabled compilations from finishing) [Skotlex]
+2006/11/22
+ * Modified slaves_inherit_speed and slaves_inherit_mode so you get better
+ control of when to copy/remove modes/speed. See the conf changelog for
+ details. [Skotlex]
+ * Reenabled usage of mode MD_CHANGETARGET, so mobs with mode 0x200 will be
+ able to switch targets while attacking. [Skotlex]
+ * Some cleanups around usage of session[] in the map server, hoping that it
+ may fix some not very likely crashes. [Skotlex]
+ * Rewrote a few messy @ commands. [Skotlex]
+ * Fixed the homunc hungry timer being started when the homun data is
+ received from the char-server and the homunc is NOT 'active'. [Skotlex]
+2006/11/21
+ * Fixed the Auto-Berserk giving you back defense when it triggers during
+ berserk's HP penalty. [Skotlex]
+ * Some small changes in the pet ai to make it more responsive. [Skotlex]
+ * Rewrote the pet looting behaviour (taken from the mob's), pets are much
+ more smarter now when looting from multiple possible items. [Skotlex]
+ * Fixed pets/homunc trying to be deleted twice when they had 0 intimacy and
+ their master logs out. [Skotlex]
+ * Added support for specifying ammo type = 99 in the skill_require_db file,
+ it can be used to specify that any kind of ammo can be used with the skill,
+ but you NEED to have ammo equipped. [Skotlex]
+ * Corrected GS_DISARM, it is now a normal attack, which, when it connects,
+ has a chance to do strip weapon at a 3*lv% rate (modified by dex) [Skotlex]
+ * Fixed GS_PIERCINGSHOT, it should ignore defense [Skotlex]
+ * Corrected Gatling Fever costing SP when trying to turn it off. Also,
+ speed increases bonuses won't take effect while it's active. [Skotlex]
+ * Updated the main makefile with a new OPT line. It is commented by default
+ since it only works with GCC 4.X, when unset, it will hide away a huge
+ amount of warnings that have to do with stuff that is not gonna be
+ corrected in eA anyway. [Skotlex]
+ * Corrected TripleAction's damage. It should do 150%*3 instead of 100*3%
+ damage. [Skotlex]
+ * Updated GS_CRACKER's stun chance using Doddler's info as reference.
+ [Skotlex]
+ * GS_FLING won't reduce armor defense when used on players. [Skotlex]
+ * Moved ignoreAll to state.ignoreAll so it saves some space. [Skotlex]
+ * Cleaned up clif_parse_Wis to prevent crashes from forged packets
+ [Skotlex]
+ * Cleaned up the implementation of the ignore list so it's more efficient.
+ [Skotlex]
+2006/11/20
+ * Implemented NPC_DEFENDER. Reduces ranged Physical+Misc damage by 80%
+ [Skotlex]
+ * Improved the battle config reader so it accepts hexadecimal values.
+ Updated the monster_ai description to make use of this [Skotlex]
+ * Added monster_ai&0x200. When set, mob skill delays are shared. That is,
+ if the mob has several lines with the same skill, when the skill is used,
+ the delay will be set to all of them, not just the one entry used.
+ [Skotlex]
+ * Corrected NPC_BARRIER so it grants 100 def/mdef (and not just mdef)
+ [Skotlex]
+ * Weapon ATK bonuses will now only apply to watk and NOT watk2 on players
+ (on players watk2 is refine bonus) [Skotlex]
+ * Corrected NPC_KEEPING. it should give 90 def, not 100 [Skotlex]
+ * You now can't use other skills while a skill-induced "window" is up
+ (teleport, refining, etc). However, be warned that we aren't quite sure how
+ the server will clear this out if you decide to hit cancel on the window,
+ so skill-blockage is likely to happen (temporary solution: whenever you
+ change maps or warp the state is reset server-side). [Skotlex]
+ * Fixed itemskill variable being cleared before parsing the skill, this
+ causes auto-casted teleport to fail to skip the skill menu. It is now
+ cleared on castend_pos/id directly. [Skotlex]
+ * Skills with state 'move_enable' will now do a "walk path" check between
+ target cell/object and caster instead of a "shoot path" check, this would
+ fix skills like snap or charge from letting you "teleport" across pits.
+ [Skotlex]
+ * Raised the amount of skills that can stack on a single cell before the
+ "in-area/out-area" detection code breaks to 24 (from 8) [Skotlex]
+ * Fixed a crash in clif_SkillInfoBlock if the passed player already
+ disconnected. [Skotlex]
+ * Added limiting drop rate to 100% from item-bonuses that depend on the
+ mob's level so that "@autoloot 100" will catch them. [Skotlex]
+2006/11/19
+ * Removed security check since source level patch is applied.
+ * Reverted select(), created prompt().
+ * Hack protection from packet monkeys in clif_parse_NpcSelectMenu. [Lance]
+ * Added 'cancel' button parsing in buildin_select menu system. Now scripts will continue
+ to load if 'cancel' is pressed and 255 will be returned. [Lance]
+
+2006/11/17
+ * Corrected use of the party invitation reply packet, thanks to FlavioJS.
+ [Skotlex]
+ * Fixed potential hack by modifying packet of whispers. [Lance]
+ * Fixed potential crash in IRC processing message with '%' using *printf. [Lance]
+ * Fixed memory leaking caused by homun_data not freed when removed. [Lance]
+ * Fixed client not validating the chat-kick-request packet, which can cause
+ crashes. [Skotlex]
+ * Updated map_quit to handle removing of players who are not even
+ authenticated yet. [Skotlex]
+ * New connection requests are now also blocked when there's a player
+ already online but hasn't finished loading yet. [Skotlex]
+ * Because of these changes, the friendlist notification when people join
+ has been moved to LoadEndAck from pc_authok [Skotlex]
+2006/11/16
+ * Updated sql files [Toms]
+ * For the sake of avoiding confusion, all script events are named with prefix 'On'
+ from now on. [Lance]
+ * Edited atcommand and charcommand syntax. Now it doesn't need the useless
+ character name and ":". [Lance]
+ * Shadow Jump and Kirikage won't "move" you if you use them in GvG grounds.
+ Fixed Kirikage so it first warps you, and then you unhide. [Skotlex]
+ * Corrected Zeny Nage so the Zeny spent on the attack is always the exact
+ same value as the damage you are dealing. Also corrected it so it does half
+ damage when used on players. [Skotlex]
+ * Overlapping song/dances will now cause dissonance/ugly-dance level 1
+ instead of retaining the level of their song/dance. [Skotlex]
+ * Fixed wrong check in @petrename, thanks to The Ultra Mage.[Skotlex]
+2006/11/14
+ * Early Christmas present. 3 new "features" which were very easy to code,
+ and should help scripters tremendously. Eapp is quite a way from being
+ ready, so these can't hurt:
+ * Implemented Karma: It turns out that when someone has karma, the client
+ believes this character is "evil", and will give you a cursor sword on top
+ of them automatically. So now the code will let characters with karma to
+ fight each other. This enables duels and other types of restricted pvp
+ where only the characters with karma can hit each others, and the rest of
+ players with neutral karma cannot be affected. Note that Karma cannot be
+ negative, and it can have any value between 0 and 256 (any non-zero value
+ makes them appear evil on the client). For now, characters with karma can
+ hit each other regardless of karma value, but perhaps it may be better to
+ let them to hit each other ONLY if they have the same karma (the whole
+ duel implementation COULD be cleaned up using Karma instead!)
+ * Added mapflags partylock and guildlock, which lock the state of the
+ parties/guilds on said maps:
+ partylock: blocks user party requests to create/invite/leave/kick
+ guildlock: blocks user guild requests to create/invite/leave/expel/
+ make alliance/make opposition/delete alliance/delete opposition/
+ break guild
+2006/11/13
+ * Fixed a bug where the char-txt server was incorrectly saving memos,
+ causing character data to be lost on restart. [Skotlex]
+ * HP Conversion will fail when used at max SP. It should not display any
+ errors to the client. [Skotlex]
+ * Modified yet again the login procedure to enable character variables to
+ work on item scripts. It SHOULD work crashless now. Please report any
+ problems it may cause.
+ * Volcano/Deluge/Violent Gale are now interchangeable, in the sense that
+ as long as one of these is out, casting any of the three will not consume
+ gems, and will use the remaining time of the previous one. In turn, Land
+ Protector will now always consume gems on every cast. [Skotlex]
+ * Small cleanup in the Land protector code which may fix it not blocking
+ AoE skills. [Skotlex]
+ * Fixed the interpretation of "head_dir". Removed setting head_dir to match
+ character direction in the whole code. Now it is only reset to 0 (look
+ forward) when unit_setpos is invoked, or when a character begins walking.
+ Thanks to FlavioJS for figuring out how the client parses the head
+ direction. [Skotlex]
+ * Moved status_calc_pc back to pc_authok. [Lance]
+2006/11/11
+ * Fixed debug message in login_sql [KarLaeda]
+2006/11/10
+ * Deluge/Violent Gale/Volcano tiles will now fail to be placed on cells
+ that are already ocuppied by anything else. [Skotlex]
+ * status_is_immune will now return 0 or the amount of immunity of the
+ target. In which cases it returns 100 for WoH and the GTB bonus when they
+ have passed the gtb_sc_immunity setting. This enables targetted spells to
+ not "fail silently" unless GTB's magic reduction is 100. [Skotlex]
+ * Fixed Homunculus being spawned as soon as they arrive from the
+ char-server even if the Master has not spawned on the map yet. [Skotlex]
+ * AL_TELEPORT now fails when used on top of Land Protector. [Skotlex]
+ * Some minor cleanings in pc_setpos, it may (or not) help fix that
+ homunc-caused "map_addblock" error message. [Skotlex]
+ * Corrected fog of wall, so that the deleted/doubled-duration effects are
+ calculated on a cell-by-cell basis. [Skotlex]
+ * Updated Land Protector: It will now delete/block effects of ALL ground
+ skills EXCEPT: Song/Dances/Traps (encores are still blocked). Land skills
+ blocked/deleted by LP also can't be casted on top of an existing LP. The
+ code uses the inf2 value of the skill to determine if it is a
+ song/dance/trap. [Skotlex]
+ * Ganbantein, mimicking LP, will now also remove ensembles. [Skotlex]
+ * Fog of Wall will fail when casted on top of a Volcano/Violent Gale
+ [Skotlex]
+ * Applied FlavioJS's fix to the npc whisper system. [Skotlex]
+2006/11/09
+ * Fixed status-change loading not working. [Skotlex]
+ * Fixed permanent mob-spawn script-events not working. [Skotlex]
+ * AL_CURE won't confuse undead players. [Skotlex]
+ * Corrected the Fog of Wall check so that it lasts 2x when it is placed on
+ TOP of a suiton/deluge, not when the caster is on top of them. [Skotlex]
+ * Updated status_check_skilluse so that when the caster has a disabling
+ status change (stun/petrify/etc) it will block the skill in all cases
+ EXCEPT on cast-end when the skill is ground-targetted. [Skotlex]
+ * Fixed Health Conversion skill formula bug. [Lupus]
+2006/11/08
+ * Fixed Desperado's hit-rate, now it behaves as it should. [Skotlex]
+ * The GVG map-packet will now also be sent for guild dungeon maps.
+ [Skotlex]
+ * Added clif_gospel_info which displays info about the buffs you are
+ receiving. Thanks to Rayce for the packet information. [Skotlex]
+ * Fixed Spider Web not ending when hit by a fireelemental attack. [Skotlex]
+ * Cast-time reductions from status changes will not be executed until right
+ before casting, to prevent status changes from ending when attempting to
+ cast and the attempt fails (invalid cells, not enough sp, wrong target,
+ etc, etc) [Skotlex]
+ * Added check to prevent Wand of Hermod from seeking for a partner to
+ encore, since the partner is supposed to be the warp. [Skotlex]
+ * Corrected the mob spawn reading code so that the event-name can be up to
+ 50 characters long (which is the actual event length) and so that it can
+ read spaces within them, it will also strip the leading/trailing quotes if
+ you use them so that the event is actually found on mob-death (so you can
+ do stuff like "My NPC::OnDead" as a valid event). [Skotlex]
+ * Moved the homunc inherit speed from the master from status_calc_pc to
+ LoadEndAck, since the hom's speed matches that of the master each time the
+ master changes maps. [Skotlex]
+2006/11/07
+ * Applied FlavioJs's patch which enables colored console output for Windows
+ systems. It also includes a config setting called
+ "stdout_with_ansisequence" with which you can turn off the color codes (in
+ case you are logging all output) [Skotlex]
+ * Added error reporting when the max number of ground unit cells has been
+ reached (this may be the reason why sometimes it fails to recognize when
+ you step out of a song/dance/encore) [Skotlex]
+ * Added passing the Endure effect to other devoted people. Note that the
+ "hit count" is individual for each character, and only when it ends on the
+ Crusader himself will that force it to end on everyone else. It also will
+ not transfer on gvg grounds, but it does transfer in pvp. [Skotlex]
+ * Fixed Reflect-Shield triggering Auto-Guard instead on devoted chars.
+ [Skotlex]
+ * Added a check to prevent casting ground skills on a target and vice-versa
+ when said skill use packets are received. It really shouldn't be
+ exploitable, but doing that certainly makes the server print a lot of
+ "unknown skill used!" messages. [Skotlex]
+ * Fixed map_foreachiddb and map_foreachpc so they don't encapsulate the
+ variable arguments into a double va_arg list. Thanks to the Ultra Mage for
+ the tip. [Skotlex]
+ * Cleaned up the clif_hate/mob_info functions with the correct fields/usage
+ as explained by Rayce. [Skotlex]
+ * Implemented clif_feel_hate_reset packet to properly display the Angel of
+ the Sun/Moon/Stars, thanks again to Rayce for the relevant information.
+ [Skotlex]
+ * LP will again block all land-stuff from being placed down on top of it
+ for the exception of Song/Dance/Encores. [Skotlex]
+2006/11/06
+ * Reapplied 'fix equipment scripts which are based on character variables not
+ working.' [Lance]
+ * Multiple Gunslinger skill corrections, refer to
+ http://ro.doddlercon.com/guides/gunslinger.html for information source:
+ [Skotlex]
+ - Corrected Ground Drift. Splash range of 3x3, stackable and placeable
+ underneath others, cast time is 2 secs. It's considered ranged, and it's
+ bonus damage increase is defense ignoring, always neutral.
+ - Corrected Bull's Eye implementation, it should deal normal damage against
+ non brute/demi-human targets.
+ - GS_DUST is now considered a short-range attack.
+ - Implemented Desperado's hit rate based on distance to caster as it's
+ believed to behave.
+ - GS_TRACKING's range is no longer affected by Snake Eye.
+ - GS_FLING's defense reduction is now 5*lv%
+ * Suiton's Speed/Agi penalty will affect everyone when used in versus maps.
+ * Corrected Kaupe so it doesn't ends on the first part of Soul Destroyer.
+ [Skotlex]
+ * Applied some cleaning to the way Tatami Gaeshi knocks back. [Skotlex]
+ * Cleaned up the way mobskill_use checks for the correct event. It should
+ fix unlimited mob-skill-casting issues. [Skotlex]
+ * Removed the return code entry when logging GM reload-GM requests
+ (login-sql),it'll just be stored as zero. [Skotlex]
+ * Added a fix on socket.c to not pick INADDR_ANY when choosing our own IP.
+ [Skotlex]
+ * Applied the correction on maprespawnguildid so that it parses ALL players
+ and not just those on a map. [Skotlex]
+ * TK_JUMPKICK now dispels normal aspd/speed potions (not berserk pitched
+ ones) and Preserve will be unable to block this. [Skotlex]
+ * Soul Linkers are now inmune to SA_DISPEL [Skotlex]
+ * You can now place everything (except magic skills) on top of LPs.
+ [Skotlex]
+ * Corrected Ganbantein to not touch song/dance/ensembles. [Skotlex]
+ * Status_calc_pc will refuse to execute if the player is still tagged as a
+ "new connection" and the invocation is not meant to be the first one.
+ [Skotlex]
+ * Swapped the order of checks in status_isimmune so that Wand of Hermod
+ skill blocking takes precedence over GTB's [Skotlex]
+ * Client packets will all be ignored while a player is not on a map until
+ the LoadEndAck packet is received. [Skotlex]
+ * Reverted changes, moved status_calc_pc(sd,1) back to pc_authok
+ since it causes problems. [Lance]
+ * Temperory fixed stability issue caused by initial status_calc_pc
+ being placed AFTER another status_calc_pc. [Lance]
+2006/11/05
+ * Updated sql files [Toms]
+ * Updated perl files acording to rev 9135 [Toms]
+2006/11/04
+ * Readded duel code in map_quit. Why it has been removed!? [LuzZza]
+ * Converted itemdb tables to use smallint. Credits to ALZ. [Lance]
+2006/11/01
+ * Reverted LK_Berserk HP requirement, as everything, including kRO X.2 and
+ pRO X.3, points that way. [Vicious]
+2006/10/31
+ * Fixed song/dance/encore cells not being placed down when casted on top of
+ a land Protector. [Skotlex]
+ * Update homunc's speed when master's speed changes, should avoid homunc's
+ speed = 0 on login (homunc's stats are calculated before master's stats) [Toms]
+ * When Kaizel (or super novice rebirth skill) triggers, you get debuffed
+ now. [Skotlex]
+ * Modified the player_cloak_check_type and monster_cloak_check_type
+ settings. 1 makes it check for walls, 2 makes cloaking NOT end on normal
+ attacks, and 4 makes cloaking NOT end when using skills. The default
+ setting for players is still 1, but for mobs the default has been changed
+ to 4. [Skotlex]
+ * Non-players can now use all skills while hidden. [Skotlex]
+ * Added a check to prevent adding negative damage to the total accumulated
+ damage in mob_damage. It could fix some exploits, even though mob_damage
+ should never be invoked with negative damage anyway. [Skotlex]
+ * Implemented the property where the first attacker get's double exp-share
+ than the others. Due to the way exp calculation is done, this bonus will
+ not apply when you use exp_calc_type 1 (damage/max_hp) instead of the
+ default (damage/total-damage). For now this bonus is done after calculating
+ who is the MVP character instead of before. [Skotlex]
+2006/10/30
+ * Fixed a little bug in event enqueue code [Toms]
+ * Updated the code so mobs can use ChainAction as a targetted skill.
+ [Skotlex]
+ * Added GroundDrift effects for Wind (Stun) and Fire (knockback). The
+ knockback value is unknown, so 3 is used for now. [Skotlex]
+ * Cleaned up some more the steal code, now you can't steal the last slot
+ regardless of skill level used. [Skotlex]
+ * Added consideration of Chain Action when cloning GunSlingers. [Skotlex]
+ * Modified battle_calc_return_damage to take the skill id as well, now
+ magic damage return will not work on skills tagged as ground or self
+ targetted. [Skotlex]
+ * Fixed Gank not working at all with the default max steal tries setting.
+ [Skotlex]
+ * Soul Drain won't work with skills tagged as self-targetted. [Skotlex]
+ * Improved the Suiton code so that the walk/agi penalty only applies to
+ enemies of whoever casted the skill. [Skotlex]
+ * Moved the initial status_calc_pc call to when you finish loading the map,
+ should fix equipment scripts which are based on character variables not
+ working. [Skotlex]
+ * Fixed getcharid according to samples and docs. [Lupus]
+ Thanks to joshuaali for pointing it out. eAPP has no such bug
+2006/10/27
+ * Fixed mob-skill event "skillused" not triggering at all. [Skotlex]
+ * Summoned mobs will only be removed from a map if their master is also
+ removed (dynamic mobs) [Skotlex]
+2006/10/26
+ * Updated sql files [Playtester]
+ * Experimental tweak to npc_parse_function - Overwrite existing functions. [Lance]
+2006/10/25
+ * Cleaned up some more the event dequeue code, it will no longer clear out
+ the npc_id if there's no events waiting to be executed (why does it clears
+ the npc_id anyway?) [Skotlex]
+ * Because of possible conflicts with this change and the on-login script,
+ now the on-login script is executed when the player has finished loading
+ into their start-up map rather than as soon as receiving the registry
+ variables from the char-server. [Skotlex]
+ * Some cleaning of the pc_eventtimer and pc enqueue code, it should fix
+ some memory leaks when the event counter does not matches with the actual
+ number of queued timers during logout. [Skotlex]
+ * Fixed "skill_sp_override_grffile: yes" causing crashes when parsing
+ Homuncuus/Guild skills. [Skotlex]
+ * Made the exp bonus settings be adjustable: [Skotlex]
+ - exp_bonus_attacker: Indicates how much additional exp a mob gives per
+ additional attacker (eg: 10 -> +10%*attacker)
+ - exp_bonus_max_attacker: Indicates at which number of attackers the bonus
+ is capped (eg: 5 -> 5 attackers, so a mob yield the same exp whether 5 or
+ 10 people attack it)
+ - Changed the way the party_even_share_bonus setting works. It now uses a
+ simple linear bonus increase (eg: 10 -> +10%*party member)
+ - The defaults are as explained by Tharis: +25%/attacker, capped at 12
+ attackers, no party bonus. The first two can be found in exp.conf, the last
+ one was left in party.conf
+ * MG_STONECURSE and NPC_PETRIFYATTACK now use time1 to specify the
+ "petrifying time". This value has been set to 5 seconds. [Skotlex]
+ * Now when SC_STONE is triggered from status-change cards, it's petrifying
+ duration will be passed as 0, causing the minimum (1 sec) to be used.
+ [Skotlex]
+ * Got rid of clones in src: old Novice Grounds map -> new_zone0? [Lupus]
+2006/10/24
+ * Removed again your mdef reducing "petrifying" time as apparently it can't
+ be reduced by mdef. [Skotlex]
+ * Cleaned up the "show_steal_in_party" setting so it only takes effect when
+ the item was successfully stolen (there was no point in telling you the
+ item couldn't be stolen due to being overweight) [Skotlex]
+ * Cleaned up the pc_steal_item implementation (again). It now uses a more
+ random, simple approach in each steal attempt. [Skotlex]
+ * Changed the way the skill_steal_max_tries work. Now it actually MEANS the
+ max number of steal tries, use 0 to disable (unlimited tries). [Skotlex]
+2006/10/23
+ * Added a bunch of important indexes when dealing with the log tables.
+ Added upgrade_svn9050.sql which adds these indexes as well. [Skotlex]
+ * Expanded the family check to work as it should, exp-share-range is
+ respected, and the child is not considered for it (thanks to TheUltraMage
+ for the investigation) [Skotlex]
+ * Double Casting will no longer fail when used. [Skotlex]
+ * Modified SC_STONE so that the duration of the "petrifying" time is 5 secs
+ reduced by your natural resistance to petrify (which is mdef%) [Skotlex]
+ * Modified the meaning of the third column in the skill_require_db. Instead
+ of MaxHP, this is now called MaxHPTrigger. This column (which was
+ previously unused by all skills) signals the limit HP% that you can have to
+ be able to use the skill. For example, setting it to 20 means the skill is
+ unusable if you have more than 20% life (note that this is merely a
+ threshold setting, it won't actually substract HP when used!) [Skotlex]
+ * Adjusted LK_BERSERK so you can only use it when you have 20% or less
+ life. [Skotlex]
+ * Removed NJ_TOBIDOUGU adding damage to W_HUUMA weapons which somehow got
+ readded. [Skotlex]
+ * When nonplayers use Cloaking, it will be forced to level 10 since mobs
+ shouldn't have movement/attack restrictions while walking cloaked.
+ [Skotlex]
+2006/10/20
+ * Made HAMI_CASTLE use clif_slide rather than clif_fixpos. This should
+ fix clientside problems when castling between two positions the (client)
+ path finding can't find a walkable bath between anymore. [blackhole89]
+ * Fixed the Homunc not spawning next to you after receiving it's data from
+ the char-server. [Skotlex]
+ * Fixed Charge Atk being able to go through chasm/pits. [Skotlex]
+ * Moved the homunculus DB information from the player structure to the
+ homun structure. Modified the homunculus creation packets to hold this
+ information during creation, also, all initial values are handled by the
+ map-server, the char server only assigns it a homun ID. [Skotlex]
+ WARNING: This is yet untested! It's very possible something could had
+ broken after changing the format/size of the homunc creation packets.
+ * Added config setting "summon_flora_setting", which it you can decide now
+ two things: a. Whether or not players can harm your floras outside versus
+ grounds, and b. Whether or not you can summon out and mix different types
+ of plants at the same time. [Skotlex]
+ * Likely fixed pc_steal_item always failing to steal (it was attempting to
+ steal random item IDs...) [Skotlex]
+ * Cleaned up a bit the mob on-death event so that when the killer is a
+ homunculus, it's master will be taken. Also, the variable killerrid will be
+ set before running the script to specify who delivered the final blow. If
+ the killerrid matches with the script attached player, you can be sure your
+ player did the final blow to the mob, otherwise, the attached player is who
+ did the most damage to the mob. [Skotlex]
+2006/10/19
+ * Cleaned up the log.c file. [Skotlex]
+ * Fixed log_chat not recording anything if the server is compiled in SQL
+ mode and sql_logs is turned off (it should then record to a plain txt file)
+ [Skotlex]
+ * Fixed SG_FRIEND, it should be triggering when Monks do Combo Finish (not
+ triple blows), and the trigger rate increase should be based on your known
+ level of SG_FRIEND, not TK_COUNTER. [Skotlex]
+ * Phantasmic arrow now knockbacks even if it misses. [Skotlex]
+ * Adjusted the way Monk combo times work. The combo time is now always
+ 300ms (adjusted by combo_delay_rate) which takes effect inmediately AFTER
+ your current skill's canact-delay (which is why the particular skill delays
+ were moved to skillcast_db) [Skotlex]
+ * Modified skill_delayfix so it performs the can-act reduction from agi/dex
+ for combos there. [Skotlex]
+ * Modified pc_steal_item so that it behaves more closely to the way it does
+ on Aegis. [Skotlex]
+2006/10/18
+ * Added a overflow check when calculating party exp share. [Skotlex]
+2006/10/16
+ * Adjusted UTSUSEMI/BUNSINJYUTSU so that they block range/melee weapon
+ attacks and only melee misc attacks. This isn't 100% correct, but it's a
+ better approximation to the way these skills behave. [Skotlex]
+ * Emergency call &16 (disable skill from nowarpto maps) will now NOT block
+ Emergency Call if that map is also a gvg-castle map. Makes it safe to turn
+ on this option to prevent usage from special maps (like Lhz3) without
+ crippling the skill during WoE. [Skotlex]
+ * Applied most of Mpeg's work on Ninja Skills. For information see:
+ http://gpegon.free.fr/ea/ninja_10-15-06_mpeg.txt [Skotlex]
+ * When reinvoking a combo-time, the previous combo time will be terminated.
+ This could fix the ongoing difficulties pulling off Monk combos. [Skotlex]
+ * Fixed Esma-state not ending after casting it. [Skotlex]
+ * Fixed @hominfo displaying intimacy on a 1/10k scale. [Skotlex]
+2006/10/14
+ * Homun info window to show crit value. As default, homun does NOT crit,
+ as monsters do not crit. This is purely for display purpose for players
+ to identify their homon's luk value. [Vicious]
+2006/10/13
+ * Base attack for non players is now calculated as str + [str/10]^2 (it
+ does not has +dex/5+luk/5 which players do have) [Skotlex]
+ * Fixed the char-sql server trying to read the gms off a "gm_db" config
+ setting stead of "login_db" [Skotlex]
+ * Corrected Throw Arrow/Musical Strike's damage formula [Skotlex]
+ * Altered Trick Dead. It doesn't prevents skills from being casted on you
+ now, but damage-based skills will do no damage. [Skotlex]
+ * Made the battle_config.attack_attr_none apply to pets when using the
+ "fixed damage" pet skill scripts. [Skotlex]
+2006/10/12
+ * made @killmonster make the mobs drop items again. [Skotlex]
+ * Added a temporary message when Angel of the Sun, Moon and Stars trigger
+ so you know it triggered. [Skotlex]
+ * When slaves_inherit_speed is set (which is also the default), homun will
+ have the same speed of their master when spawned. [Skotlex]
+ * When using Hatred and you already have a hate target, your current hate
+ target is displayed now. [Skotlex]
+2006/10/11
+ * Cleaned up the char-server code when the last point of a player is not
+ found. First it'll check if there's any mapserver online, and then, if
+ there is, it'll look for the major cities. If this fails, then the player
+ will be told server is closed instead of trying to send him to a "random
+ map". Will fix the char-server printing the misleading message "map
+ server not found, sending to major city" when in reality there just
+ aren't any map servers connected. [Skotlex]
+ * Corrected the mob damagelog structure so that you can't exploit it by
+ switching characters. [Skotlex]
+2006/10/09
+ * Fixed crash when char-server sends to a "random" map-server online on
+ connect. Thanks to TheUltraMage for pointing it out. [Skotlex]
+ * Should have fixed being petrified not reducing your defense and
+ increaseing your mdef. [Skotlex]
+ * Fixed SC_NOCHAT printing the "skills are now available" message twice on
+ natural expiration. [Skotlex]
+2006/10/08
+ * Updated sql files [Playtester]
+2006/10/06
+ * Updated Land Protector to block absolutely every land-based skills with
+ the exception of Encores/Dances. [Skotlex]
+ * Disabling status abnormalities will now reset a mob's target. [Skotlex]
+ * Mob morphing also resets their target now. [Skotlex]
+ * Monk combos no longer can ignore skill delay (delay skill for all their
+ combo-related skills is ASPD) [Skotlex]
+ * Now you can trade while in a chatroom. [Skotlex]
+ * Fixed homun-txt reading when the file has DOS line-type delimiters (\r\n)
+ [Skotlex]
+2006/10/05
+ * skill_blown will now trigger on-touch npcs on the landing tile. [Skotlex]
+ * Max trade distance has been reduced from 5 to 2. [Skotlex]
+ * Undisguising will now resend the cart-contents. [Skotlex]
+ * Added function npc_unload_duplicates(), it unloads all npcs that are a
+ duplicate of the passed one. For use with @unloadnpc to prevent crashes
+ when you unload the npc that has duplicates. [Skotlex]
+2006/10/04
+ * Bowling bash now always hits twice regardless of situation. [Skotlex]
+ * Added an underflow check to prevent sending to the client negative mdef2
+ value (for Frenzy'ed characters) [Skotlex]
+ * Modified pc_jobchange so that it automatically removes
+ peco/falcon/cart/homun if the new job you are changing to does not possess
+ the required skill for them. [Skotlex]
+2006/10/03
+ * Fixed a possible crash with @reloadmobdb due to pet loot timers.
+ [Skotlex]
+ * Fixed a possible crash and a memory leak on the login-SQL server when
+ parsing unban requests. [Skotlex]
+ * Renamed setting delay_dependon_dex to delay_dependon_agi, the delay of
+ skills is reduced now (when enabled) by AGI instead of DEX, which makes a
+ lot more sense than DEX. [Skotlex]
+2006/10/02
+ * Modified item-granded status resistance reduction to behave as explained
+ by Vicious (Ragnarok Monthly magazine) [Skotlex]
+ * Added the opt3 values to Eske [Skotlex]
+ * Fixed the txt->sql converter only saving the very first character
+ permanent variable. [Skotlex]
+ * Fixed the txt->sql converter saving account-wide variables as
+ character-wide ones. [Skotlex]
+ * Renamed nopenalty mapflag to noexppenalty. Using nopenalty will turn
+ on/off both noexppenalty and nozenypenalty now. [Skotlex]
+2006/10/01
+ * Removed the speed adjustment per level of Increase/Decrease Agility
+ [Skotlex]
+ * Fixed humunculi skill exploit, thanks to mr.rkit [Lupus]
+2006/09/30
+ * Rewrote the txt->sql converter. It now links directly to the char server
+ files so that it should get auto-updated with any code changes in the
+ later. [Skotlex]
+ * The converter will now also convert: account-wide variables, parties,
+ guilds, guild storage and guild castles. At this point the only two things
+ not converted are login-server-wide account variables (##, they belong to
+ the login converter) and homunculus (the SQL save function is messy and
+ doesn't lends itself to be integrated with the converter the way all the
+ other functions are). [Skotlex]
+ * misceffect2 will no longer cause the effect on top of the source object
+ when it is the fake npc. [Skotlex]
+ * Added check so that Frost Nova doesn't hides hitting animation on
+ targets. [Skotlex]
+ * Added the missing brackets around the trade logs condition check, thanks
+ to Coltaro. [Skotlex]
+2006/09/29
+ * Spurt state will now trigger on Soul Linkers as well. [Skotlex]
+ * Added a check un unit_run when unit_walktoxy fails. Should fix running
+ getting you stuck sometimes when running on diagonals near obstacles.
+ [Skotlex]
+2006/09/28
+ * Merged the necessary changes to make the script engine support negative
+ constants (db/const.txt). Thanks to Rayce (from jA) for the code. [Skotlex]
+ * Cleaned up the skill.c code to take into account when skill_unitsetting
+ returns null (skill failed), fixes a possible crash with Wand of Hermode
+ [Skotlex]
+2006/09/27
+ * Cleaned up status_get_party/guild_id, it should also fix a possible crash
+ when invoking such a functio on a masterless pet. [Skotlex]
+ * Sharp-Shooting will now display a skill animation. [Skotlex]
+ * The no_spawn_on_player setting will now also work for static mobs, but
+ only if the setting is set to 100 or higher. [Skotlex]
+2006/09/26
+ * Yet again messed with the packet sent during a splash attack, but this
+ time taking into account the packets that eA was using some many revisions
+ ago. Tests are needed to see if Magnum Break/Grimtooth don't spam the skill
+ animation anymore, and to see if GrandCross didn't break it's animation as
+ well. [Skotlex]
+ * Added function skill_dance_switch which handles converting overlapping
+ song/dances to dissonance/ugly dance. It should make the overlapping area
+ now behave completely like the mentioned song/dances (taking into account
+ interval and target type changes). [Skotlex]
+ * Updated battle_check_target so that non-offensive skills cannot be used
+ on a homun except for the homun and it's master. [Skotlex]
+ * Steal zeny won't work on treasure chests now. [Skotlex]
+2006/09/25
+ * Added an ugly check so that Heal will display 0 when healing a berserked
+ character (and it will again display full heal amount when healing a player
+ who's at full life) [Skotlex]
+ * Disabled again client-self-muting since it's causing too much trouble.
+ [Skotlex]
+ * Merged FlavioJS's script patch which should fix stuff like "mes ();"
+ causing crashes. [Skotlex]
+ * Item group reading will now complain when a line doesn't has enough
+ fields. [Skotlex]
+ * Fixed #baselevelup adding instead of substracting status points when used
+ with negative levels. Also made it reset your stats if there wasn't enough
+ to substract from. [Skotlex]
+ * Applied FlavioJS's suggestion of expanding WFIFOPOS to also take the
+ direction. This had the side effect of fixing the direction missing from
+ the mob spawn packet, which explains why all npcs face north when you are
+ within sight while doing a @reloadscript. [Skotlex]
+ * Changed the order of packets in TK_HIGHJUMP, may fix the reports of
+ getting stuck when jumping into a warp. [Skotlex]
+ * Changed a bit the code of marionette control, where a redefined local
+ variable may be the cause of mob-targetted Marionette Control stacking
+ stats up. [Skotlex]
+2006/09/24
+ * When the code auto-guesses that a skill should require ammo, it will
+ accept any type of ammo for using it instead of only arrows. Fixes Magnum
+ Break usage on Gunslingers. [Skotlex]
+2006/09/22
+ * Probably fixed a signed/unsigned mismatch warning on the new socket code.
+ [Skotlex]
+ * Fixed the "map server claims to have char online, but this other map
+ server also has it tagged as online" message triggering in some cases where
+ it shouldn't. [Skotlex]
+ * Fixed some maps in db/mapindex.txt being under the wrong id and added comments
+ so this will not happen again. [Zephiris]
+ --- ATTENTION! ---
+ People running TXT servers will have to tell their players to redo their /memo
+ points since the map ids of the old file were wrong.
+2006/09/21
+ * Fixed a bug on "select" when skipping empty entries when the selected
+ entry is the last. [Skotlex]
+ * Improved a bit RFIFOFLUSH as suggested by Harbin. [Skotlex]
+2006/09/20
+ * A mob's HP is set temporarily to 0 before invoking it's on-death script,
+ prevents said scripts being able to "rekill" the mob indefinitely (if stuff
+ like killmonster is used within) [Skotlex]
+ * Some small cleanups in chat.c [Skotlex]
+ * Fixed party_sub_count (TK_POWER) failing when the idle_no_share setting
+ was disabled. [Skotlex]
+ * Enabled Star Gladiators and Soul Linkers to do /doridori [Skotlex]
+2006/09/19
+ * Fixed nocommand mapflag causing the "you can't use commands on this map"
+ message to trigger one very single chat, instead of only for actual @/#
+ command invocation. [Skotlex]
+ * Added support for skipping empty string menu entries for the select()
+ command (just as `menu` has it already) [Skotlex]
+ * Fixed pc_set_hate_mob letting you place mobs on any of the three
+ positions regardless of size [Skotlex]
+ * The double continuation error will now display both scripts that
+ triggered it. [Skotlex]
+ * Loading the storage from the char-server will fail if player is already
+ tagged in final save state. [Skotlex]
+ * Removed setting ban_spoof_namer, sending invalid global-talk packets will
+ now just kick the player out of the server. [Skotlex]
+ * Added echoing messages back to self when using @/# commands on whispers
+ and party/guild messages, to prevent the client from muting yourself.
+ [Skotlex]
+ * Fixed some gcc4 warnings [Toms]
+2006/09/18
+ * Fixed Spider Web fire damage bonus. [Skotlex]
+ * Made Global chat always reply back to you even on @/# commands, this
+ prevents the client from muting yourself due to "hack". However, this same
+ fix isn't easily applicable to @ commands invoked from whispers or
+ party/guild messages, those are still pending. [Skotlex]
+ * Merged Meruru's update to socket.c, which includes a rewritten parse
+ function, which should hopefully be more efficient than the previous code.
+ [Skotlex]
+ * The new code includes support for two config settings
+ (packet_athena.txt): frame_size, which can be used to alter the logic
+ packet-size allowed by the code, and mode_neg, which when set to yes, sets
+ TCP_NODELAY on all connections (defaults to yes). [Skotlex]
+ * High-Jump is usable everywhere now, except that on maps where it
+ previously failed, now will just make you jump in place. [Skotlex]
+ * Fixed TK_RUN as per packets provided by AuronX. [Skotlex]
+ * Moved the equipment/card resistances to status ailments outside of
+ status_get_sc_def, so that they are applied only to rate, not duration.
+ [Skotlex]
+ * Modified the Asura code (again), hopefully movement sprite issues are
+ fixed now [Skotlex]
+ * @reloadscript scripts will no longer eliminate mobs with no respawn data.
+ But watch out for possible bugs (I think someone mentioned 1 extra
+ treasure box will spawn when you use it? This needs testing!) [Skotlex]
+ * Made speed_add_rate a linearly stacking increase. [Skotlex]
+ * Corrected a possible overflow when using show_mob_info to display the
+ mob's up as a percent. [Skotlex]
+ * Corrected the documentation for checkoption/checkoption1/checkoption2
+ [Skotlex]
+ * Reenabled client requesting to self mute, as the whole knockback packet
+ issues of the past which were causing players to mute themselves when being
+ knockback is no longer there. [Skotlex]
+2006/09/17
+ * Fixed NPC_INVISIBLE's cloak ending after attacking once. [Skotlex]
+ * Fixed SG_FUSION being castable without Soul Link state. [Skotlex]
+ * Moved the item-use restriction SC checks from clif.c to pc_use_item,
+ fixed Gravitation blocking potion usage on it's area of effect. [Skotlex]
+ * Sphere Marines and Summoned Flora are now inmune to class-changing.
+ [Skotlex]
+2006/09/16
+ * Added monster_ai&256. When set, a monster will pick a random starting
+ position to begin checking versus it's skills, otherwise, it will always
+ begin checking from the beginning. [Skotlex]
+ * Fixed the status change duration reduction equation was was totally
+ wrong, thanks to k3dt [Skotlex]
+2006/09/15
+ * Now mobs won't do a distance check to lose their target on every ai
+ iteration, but only when they finish walking (unless you set monster_ai&1)
+ [Skotlex]
+ * The chase distance before a mob gives up following a player has been
+ increased from view-size (range2) to min-chase (range3). [Skotlex]
+ * Reverted the Summon Flora change where all plants were being summoned in
+ one go. [Skotlex]
+ * Moved the weapon repair effect to where it belongs (after successfully
+ repairing an item) [Skotlex]
+ * Added config setting "friend_auto_add" (battle/player.conf), if set, when
+ you accept someone as your friend, both characters will show up on each
+ other's friend list. [Skotlex]
+2006/09/14
+ * Changed Extremity Fist's code to make you actually walk past your target,
+ which displays a much more correct "animation" for the skill. Thanks to
+ HiddenDragon for the information and code. [Skotlex]
+ * Updated the item_db search functions so that when returning the
+ dummy-item, it first updates the nameid to match the requested one, this
+ prevents pc_additem later on giving you an item with ID 500 instead of the
+ ID requested. [Skotlex]
+ * Added a clif_skill_nodamage packet when using Repair Weapon, just to see
+ what happens. [Skotlex]
+ * Likely fixed "half" of the alliance being saved, which ends up in guilds
+ that can attack another, but not viceversa. [Skotlex]
+ * Added deleting of saved Status changes on character delete for the
+ Char-TXT server. [Skotlex]
+ * Fixed the can-act delay never being checked when requesting to use
+ Homunculus Skills. [Skotlex]
+ * Fixed warmth skills draining SP of the target, not the caster. [Skotlex]
+ * When TK_DODGE triggers, it will no longer delay your attack or movement.
+ [Skotlex]
+ * Estimation /Sense/ whatever will no longer hide the vit bonus to mdef2,
+ as reported by Playtester. [Skotlex]
+ * Updated Summon Flora to summon the max number of possible plants on one
+ cast. It will consume as many bottles as monsters summoned. Also cleaned up
+ the function to be usable by non players. [Skotlex]
+ * Shadow Jump no longer goes over walls. [Skotlex]
+ * battle_calc_gvg_damage will be invoked in gvg maps regardless of woe
+ time. [Skotlex]
+ * NPC_MENTALBREAKER now zaps matk*lv SP based on observations by Tharis.
+ [Skotlex]
+ * md->class_ will be changed on mob-class-change to fix all class-change
+ related bugs. On respawn, the spawn data will be used to revert to the
+ original class. [Skotlex]
+ * Improved the pet skillbonus timer for "eternal bonuses" cases where the
+ bonus delay is 0. [Skotlex]
+2006/09/13
+ * SC_CHANGE cannot override itself anymore. This fixes being able to
+ "recast" the skill while it's still active to lengthen the duration AND
+ reheal the target. [Skotlex]
+ * Changed a bit the dnsbl lookup in the login servers to make it faster.
+ [Skotlex]
+ * Moved the pc rate modifiers from items
+ (hp/sp/matk/hit/flee/cri/flee2/def2/mdef2/def/def2/speed) from
+ status_calc_bl_sub_pc to status_calc_pc, as it simplifies code vastly, and
+ also fixes Osiris card not applying to said bonuses. [Skotlex]
+ * Fixed pc_damage_delay_rate not working, thanks to Orn. [Skotlex]
+ * Modified the nocommand mapflag so you can specify the GM range that is
+ blocked from using commands (eg: "prontera.gat mapflag nocommand 40"
+ disables commands to characters in the GM range 0~39) [Skotlex]
+ * Modified the char-server TXT whisper system to use the online_db to know
+ to which map server forward whispers, instead of just sending the whisper
+ to every map server. [Skotlex]
+ * Readded the setting TCP_NODELAY on socket.c to see if it fixes the
+ walk-lag issue. [Skotlex]
+2006/09/12
+ * Modified the login SQL server so that case insensitive lookups use "where
+ name = BINARY 'name'" instead of "where BINARY name = 'name'", since this
+ way the name index should be used, and performance will no longer be
+ heavily affected. [Skotlex]
+ * Modified main.sql to add 4 missing indexes (thanks to ErkDog): char_id on
+ the tables memo/friends, and online/name on the char table. Added
+ upgrade_svn8728.sql to add these indexes to already existing tables.
+ [Skotlex]
+ * Updated convert_engine.sql to use TYPE instead of ENGINE to be compatible
+ with Mysql 4 installations. [Skotlex]
+ * Moved the morph restrictions from skill_additional_effect to
+ mob_class_change, so that SA_MONOCELL will not convert clones, emperium, or
+ treasure boxes. [Skotlex]
+ * Fixed 'range' might be used uninitialized warning [Toms]
+ * Added Jaguar's sql script to convert all tables to MyISAM. It's located
+ in sql-files/convert_engine.sql WARNING: Using MyISAM is much faster than
+ InnoDB, but you are strongly recommended to backup your database before
+ switching engines since we don't know if eA is fully coded to work
+ correctly with MyISAM yet. [Skotlex]
+ * Added manual deletion of sc_data entries when deleting a character
+ (char-SQL) [Skotlex]
+ * Updated main.sql to use pure MyISAM tables, removed all foreign keys.
+ [Skotlex]
+ * Updated battle_switch to use strncmpi instead of strcmpi, it makes it so
+ using "yessir" will match "yes", this is actually needed because if you set
+ a config setting to "yes " (notice the trailing space), then the map config
+ engine fails to read it right, and will set the config setting to 0 (no).
+ [Skotlex]
+ * Some corrections to hate_mob cleanup when triggering the Angel stuff. [Skotlex]
+ * Updated the show_mob_info setting to add another space to the separating
+ pipes, so that each field is separated by " | " instead of " |". [Skotlex]
+ * Homunculus intimacy will go back to 500 on evolution. [Skotlex]
+ * Baphomet splash damage will now hit nearby enemies regardless of flee
+ (but the initial attack still has to connect for the splash to trigger)
+ [Skotlex]
+2006/09/11
+ * Modified set_nonblocking and setsocketoptions in socket.c, using eApp's
+ code as reference. Hopefully should improve performance somewhat. [Skotlex]
+ * Added a comment explaining what a comment is to login/char/map config
+ files, as well as the main script config file. [Skotlex]
+ * Modified SG_FEEL so that it works the same way that in Aegis
+ (packet-wise) [Skotlex]
+ * Added a comment to explain how to "remove" a string variable from the
+ msg_athena entries. [Skotlex]
+ * Summoned and slave mobs won't show up on @showmobs anymore. [Skotlex]
+ * Moved Spider Web damage bonus from battle_calc_damage to battle_attr_fix,
+ so that damage will be doubled based on the actual attack element.
+ [Skotlex]
+ * Adjusted autospell cards to trigger only on physical weapon attacks.
+ [Skotlex]
+ * Adjusted a bit the heal code, it should now show either the full heal
+ amount, or 0, depending on whether the target was healed at all or not
+ (this also means it shows 0 if you try to heal a full-life character.. but
+ it's the closest I've gotten to make it display 0 on Berserked chars)
+ [Skotlex]
+ * Memorize will be consumed even on instant cast spells now. [Skotlex]
+ * Berserk will end now if hit and remaining hp is less or equal to 100.
+ [Skotlex]
+ * Guild Aura will be removed on sc-load to prevent Guild Masters from
+ getting that bonus from the old implementation. [Skotlex]
+ * Added D-Kalck's fix of the TXT -> SQL converter [Playtester]
+2006/09/10
+ * Thanks to KarLaeda, added missing function in @showmobs [Lupus]
+ - Script function 'query_sql': In the TXT version it doesn't fill the array
+ and always return -1. Added for scripts compatibility. Your scripts
+ won't crash in TXT version. They can work it around.
+ I suggest we need a function getversion()
+ * Updated item_db.sql and mob_db.sql [Playtester]
+2006/09/09
+ * Added a crash protection in case mapfreeblock unlock tries to free a null
+ pointer. [Skotlex]
+ * Moved perfect_hiding from state to special_state, so that it clears out
+ when you remove your pet. [Skotlex]
+ * Probably fixed the Taekwon Rest skills. [Skotlex]
+ * Fixed a npc-timer memory leak on npc_unload ("[Warning]: ers_obj_destroy:
+ X entries missing, continuing destruction. Manager for entries of size
+ 16.") [Skotlex]
+2006/09/08
+ * Unified the rest and ganster paradise code into a single function.
+ [Skotlex]
+ * Moved the Happy State trigger to the regen function, it now triggers at
+ the same time SPTIME does. [Skotlex]
+ * Cleaned up SG_HATE, hope it works now. [Skotlex]
+ * Removed sg_miracle_skill_duration, replaced it with
+ sg_miracle_skill_min_duration and sg_miracle_skill_max_duration, to specify
+ a range for the duration of the skill. [Skotlex]
+ * Added upgrade_svn8675.sql in case, for some reason, your guild table
+ still has the emblem_data field as a 'blob' with "NOT NULL" specified.
+ [Skotlex]
+ * Fixed alliance/opposition making not cancelling out map-server-side when
+ the guild already had max number of alliances/oppositions (thanks to k3dt)
+ [Skotlex]
+2006/09/07
+ * Fixed SC_BERSERK setting Hp to 100 when dispelled by unnatural means (eg:
+ wand of hermod) [Skotlex]
+ * Cleaned up the doridori parse clif function. [Skotlex]
+ * Merged some of mpeg's work on NJ skills [Skotlex]
+ * Removed the Warmth "stacking" code. [Skotlex]
+ * Added back the effect of /doridori to skill-SP regen [Skotlex]
+ * Implemented a rough version of Angel of the Sun/Moon/Stars, it has a low
+ chance of triggering on doridori-boosted SP-regen events. However, it has
+ no client-side messages yet (need to add these in) [Skotlex]
+ * Added sg_angel_skill_ratio to specify rate at which the Angel skill
+ triggers. [Skotlex]
+ * Added unit_cancel_combo which takes care of ending a combo time and
+ resuming normal attack 'inmediately' [Skotlex]
+ * Cleaned up some the SG_HATE code, you can't change hate targets anymore.
+ [Skotlex]
+2006/09/06
+ * Fixed the memset in status_calc_pc, corrects some mysterious bugs such as
+ item-drop bonuses suddenly not working anymore. [Skotlex]
+ * Corrected SC_INCREASEAGI and SC_DECREASEAGI speed-change formula.
+ [Skotlex]
+ * Fixed Aex Aeterna ending on Soul Breaker's first half. [Skotlex]
+ * Applied Orn's modification on speed increases/reductions with increase/
+ decrease agi [Toms]
+2006/09/05
+ * Removed setting mob_show_hp, it's been replaced now by mob_show_info,
+ which can be used to specify what kind of info should be displayed from a
+ mob. Current options are two different formats for Hp display, and current
+ level (monster.conf). [Skotlex]
+ * Fixed Signum Crucis Def reduction being 10+2*lv% instead of 10+4*lv%
+ [Skotlex]
+ * Applied the Ultra Mage's suggestion to have the map server strip trailing
+ spaces/comments from the config files. It will also now print out when an
+ unknown config setting is found. [Skotlex]
+ * Fixed status change resistance not being invoked at all for pretty much
+ all cases. [Skotlex]
+ * Corrected SC_INTRAVISION not starting. [Skotlex]
+ * Fixed crash when attempting to read a Label as a string on a script
+ (thanks to End of Exam) [Skotlex]
+ * Fixed possible crash when changing a chat-room's owner (thanks to End of
+ Exam) [Skotlex]
+ * Fixed dispell removing SC_NOCHAT [Skotlex]
+ * Small fix which should correct skill_attack damaging hidden characters
+ when it shouldn't. [Skotlex]
+ * Fixed connect_until field being a smallint rather than int in the login
+ table (upgrade with upgrade_svn8630.sql) [Skotlex]
+2006/09/04
+ * Fixed crash when using Adaptation during an Encore. [Skotlex]
+ * Should have fixed manner being reset to 0 on logout while muted.
+ [Skotlex]
+ * Removed status_get_sc_tick, duration and chance are now both handled by
+ status_get_sc_def (this means status change duration and success rate
+ both will always follow the very same formula) [Skotlex]
+ * Fixed mob-kill experience getting screwed up when characters who did
+ damage die/logout at the moment the mob dies. [Skotlex]
+ * Should have fixed "sleep", thanks to Lance for figuring out the error.
+ [Skotlex]
+ * SC_REFLECTSHIELD will now be passed to devoted characters at cast-time.
+ [Skotlex]
+ * Added a check to make a mob's level 1 if the read level from the db is
+ less than it. [Skotlex]
+ * status_calc_misc will now be invoked in status_calc_bl even on the first
+ call, since status could have gone up due to skill bonuses. [Skotlex]
+ * Moved max HP/SP calculations to before invoking status_calc_misc
+ [Skotlex]
+ * Simplified distance and check_distance to use "aegis" methods (greater of
+ dx/dy = distance), there's a new define in map.h called CIRCULAR_AREA, when
+ set, the previous method is used, and "for each in range" calls will also
+ check for distances, making most ground skills and battle system use real
+ circles instead of squares. [Skotlex]
+2006/09/03
+ * Fixed SC_BERSERK's no regen penalty lasting pretty much forever.
+ [Skotlex]
+2006/09/02
+ * SC_REGENERATION's val4 now holds the RGN flag of what is blocked rather
+ than blocking all types of regen. [Skotlex]
+ * LK_BERSERK will now only block natural regen on state-end. [Skotlex]
+ * SC_EXTREMITYFIST/SC_DANCING/SC_EXPLOSIONSPIRITS will only block natural
+ sp regen and not skill regen [Skotlex]
+ * SC_REGENERATION blocking will be cancelled on logout now. [Skotlex]
+ * Corrected SCB_LUK not updating SCB_BATK as well. [Skotlex]
+2006/09/01
+ * Corrected script_commands description of getequipid, it returns -1, not 0
+ on fail. [Skotlex]
+ * Fixed the mob-id check during pet_db loading, it will also now print when
+ a pet is not loaded due to having an invalid mob class specified. [Skotlex]
+ * The "delete_timer error/no such timer" report will now print the related function [Toms]
+ * The Clearing unused stack report will now print the related NPC [Toms]
+ * The duplicate npc report will now print the related file name [Toms]
+ * Added config setting "partial_name_scan", which specifies whether @ given
+ names should use a partial string lookup or absolute name lookup. Defaults
+ to no (gm.conf) [Skotlex]
+ * Expanded status_calc_misc so it may also calculate the batk of characters
+ as well as their regen data (if they have it) [Skotlex]
+ * Fixed a memory leak when using charsave_method:1 [Skotlex]
+ * Soul Breaker will now be affected by Lex Aeterna on both parts of the
+ attack. [Skotlex]
+ * Status changes with no skill and no SCB* data will now go through if they
+ have an SI* icon. This should fix SC_MIRACLE [Skotlex]
+ * Reverted switching a mob's adelay/amotion when the later is longer than
+ the former, now both get updated to amotion. [Skotlex]
+2006/08/31
+ * Moved the intimacy penalty of HFLI_SBR44 and HVAN_EXPLOSION to
+ skill_counter_additional_effect [Skotlex]
+ * Simplified skillnotok_hom by using an invocation to skillnotok [Skotlex]
+ * Hopefully fixed BD_ADAPTATION [Skotlex]
+ * Homun won't lose any intimacy on death now. [Skotlex]
+ * Homun will be saved together with the master now (as long as the homun is
+ active) [Skotlex]
+ * Modified the error reporting in map_freeblock_unlock so that when there's
+ an error, the reported line number is the file's linenumber plus the
+ object's type *10000. This is for debug information to help track down the
+ already-freed error. [Skotlex]
+ * pc_adopt will now preserve the kid's job/job-level/experience. This means
+ that if you adopt a Swordman level 45, it will become a baby-swordman level
+ 45, with the exact same exp as before. [Skotlex]
+ * Fixed new mob's name not sent to the client when the mob is morphed [Toms]
+ * Added setting attack_walk_delay which specifies whether a character
+ should (or not) be able to move inmediately after starting a normal attack
+ (battle.conf). Defaults to 0 since that's what Aegis uses. [Skotlex]
+ * Fixed @summon's delete timer being screwed up. [Skotlex]
+ * Cleaned up a bit the summon script command. [Skotlex]
+ * Fixed the clone script command's delete-timer being screwed up. [Skotlex]
+2006/08/30
+ * Skill required-state will now only be checked on cast-begin, not
+ cast-end. [Skotlex]
+ * Added a check in status_calc_pc to prevent player rate adjustments from
+ from going below 0. [Skotlex]
+ * Removed sending normal-damage packets instead of skill packets for
+ splash-damaged skills, since... well, that's how Aegis does it. [Skotlex]
+ * Updated HLIF_CHANGE to work as explained by Tharis -> It now adds 30*lv
+ vit and 20*lv int, is dispelled on warp, and can-act delay is 5+5*lv
+ minutes. Hp/Sp is no longer set to 10 after a forced expiration. [Skotlex]
+ * Fixed up char-sql compilation. [Skotlex]
+ * Added a message to @clearweather stating when climate changes will
+ dispel. [Skotlex]
+ * Corrected @hidenpc saying that it's command name was "@npcoff" [Skotlex]
+ * Updated itemdb reading on the char-sql server so that it reads both
+ item_db and item_db2 files (totally untested yet) [Skotlex]
+2006/08/29
+ * Added printing out whenever the irc-module attempts to connect, to debug
+ whether the map-server lag is due to this or not. [Skotlex]
+ * Mobs will now always chase players using hard-path seeks. [Skotlex]
+ * monster_ai&1 now only signals whether mobs should update their target
+ cell while chasing more frequently (rather than being state-driven like
+ Aegis) [Skotlex]
+ * Changed the defaults of view_range_rate and chase_range_rate to 120 to
+ aproximate better Aegis's view ranges (which are square areas and not
+ circles) [Skotlex]
+ * Applied Mpeg's work on GS [Toms]
+ ( http://gpegon.free.fr/ea/gunslinger_08-29-06_mpeg.txt )
+ * Fixed a syntax error in @showmobs [Toms]
+ * Added @showmobs. It shows selected mobs on your mini-map (excluding
+ mini-bosses & MVP) thanks to KarLaeda for the command [Lupus]
+2006/08/28
+ * Modified the dancing code and Moonlit Petals in particular, so that it is
+ treated as an ensemble like any other, it will just knockback people when
+ they step into it. [Skotlex]
+ * The memory leak reports will now print out in the logs also the revision
+ they belong to. [Skotlex]
+ * Cleaned up the scriptable npc-shop code, it should be crash-proof now.
+ [Skotlex]
+ * Added TK level-up buffs to SG too, and extended them to 10 min [DracoRPG]
+ * Added "Barefeet Mastery" effect to TK_RUN (thanks Tharis for both) [DracoRPG]
+ * Changed the produce_db format, now there's a skill-lv column right after
+ the skill-id column to specify required skill-level to craft this item.
+ [Skotlex]
+ * Modified the skill produce_db code to take into account the new skill-lv
+ requirement. [Skotlex]
+ * Fixed exp bonuses applying twice for the job-exp [Skotlex]
+ * @reloadbattleconf will now also update the ragsrvinfo table on the
+ char-server. [Skotlex]
+ * Fixed homun hp/sp growth rates stacking with HP/SP passive increasing
+ skills. [Skotlex]
+2006/08/27
+ * Fixed undefined reference to 'malloc_set' in log.c [Toms]
+ * Updated svn-revision reading, now it can read the new svn file system [Toms]
+ * Fixed a bug with homunc which could spawn on a non-walkable cell [Toms]
+2006/08/26
+ * Optional macro MEMSET_TURBO for faster low-level memory initializations. [Lance]
+ * Small bug fix in read_homunculus_expdb (a warning was always displayed) [Toms]
+ * Small adjustment on the mob_ai code which could fix mobs not chasing you
+ if you hit them from the maximum possible diagonal distance. [Skotlex]
+2006/08/25
+ * Cleaned some the skill unit removal added flag so that it signals whether
+ the skill is being force-removed, or it has "naturally expired". [Skotlex]
+ * The following skills will display a normal attack animation now:
+ NPC_WATERATTACK, NPC_GROUNDATTACK, NPC_FIREATTACK, NPC_WINDATTACK,
+ NPC_POISONATTACK, NPC_HOLYATTACK, NPC_DARKNESSATTACK,
+ NPC_TELEKINESISATTACK, NPC_SPLASHATTACK
+ * Skills that require a weapon and consume spirit spheres will no longer be
+ auto-tagged to require ammo. [Skotlex]
+ * Now MISC skills with delay 0 will also use the attack delay (if the skill
+ is tagged to do damage) [Skotlex]
+ * Added script commands roclass/eaclass to enable scripts to access eA's
+ job format. Read script_commands.txt and ea_job_system.txt for a more
+ complete explanation of how this job system works. [Skotlex]
+ * Added a flag to skill_delunitgroup, skill_delunit & skill_unit_onlimit.
+ If 1 is passed, it will avoid UNT_WARP_ACTIVE to be transformed in
+ UNT_WARP_WAITING and will destroy it. [Toms]
+ ( To avoid such crash : http://www.eathena.ws/board/index.php?showtopic=114102
+ when the code need an empty slot and the oldest one is UNT_WARP_ACTIVE )
+2006/08/24
+ * Little cleanup on homunc's code [Toms]
+ * Modified @reloadmobdb & @reloadskilldb to reload homunc's db too [Toms]
+ * Now when a mob's adelay is set to be less than the amotion, both values
+ will be swapped (this is an attempt to understand how those mobs actually
+ work on aegis) [Skotlex]
+ * script command "isrefine" will no longer return always false for equip
+ positions above 6 (this has not been needed since the addition of the
+ refine column to tbe item_db many months ago) [Skotlex]
+ * Added NPC_CRITICALSLASH to the list of skills that display as a normal
+ attack. [Skotlex]
+ * Reverted the previous change, changed the pet capture code to try to
+ capture a mob based on their view class rather than actual class.
+ [Skotlex]
+ * Fixed the md->class_ variable not being updated when a mob's class is
+ changed. [Skotlex]
+ * Added setting clear_skills_on_warp to specify when a character's
+ land-based skills are deleted when the caster changes maps. Defaults to all
+ types. [Skotlex]
+ * Should have fixed Brandish Spear not passing the flag to skill_attack,
+ causing it to do miserable damage. [Skotlex]
+ * Warp Portal will no longer be removed when caster steps through it (this
+ is left to the new clear_skills_on_warp setting) [Skotlex]
+ * Cleaned up status_percent_change to switch equations when the target has
+ high hp to prevent overflows, also it will directly take hp/maxhp when a
+ rate of 100 or higher is passed to prevent calculations. [Skotlex]
+ * Traps and Land Elemental fields are no longer automatically removed on
+ map change (handled now by clear_skills_on_warp) [Skotlex]
+ * traps_setting &2 no longer does anything (handled now by blah blah)
+ [Skotlex]
+ * Applied some change from mpeg on Ninja Skills [Toms]
+ * Put HVAN_Explosion based on max_hp instead of current hp [Toms]
+2006/08/23
+ * Fixed mob_clone_spawn completely ignoring the mode variable. [Skotlex]
+ * Fixed Energy Coat reducing and consuming more than it should when you
+ have 100% SP [Skotlex]
+ * Cleaned up getmapxy script function, also added support for type 4 so
+ that it returns a player's homunculus position if such exists. [Skotlex]
+ * SC_ARMOR_ELEMENT looks like gone away from status_change_start since ... rev 6791.
+ Try to reimplement it. [Toms]
+ * Fixed HVAN_EXPLOSION [Skotlex]
+ * Frost Nova won't display a nodamage skill packet (still need to sort out
+ a way to fix the splash damaged packets) [Skotlex]
+ * Fixed a possible SIGSEGV on buildin_maprespawnguildid if the map is unknown [Toms]
+ * Added debug on "Inifity loop" to know which script is making this loop [Toms]
+2006/08/22
+ * More fixes to the splash code. Kamaitachi and Sharpshooting should
+ display correctly now. [Skotlex]
+ * Fixed a crash on the mobspawn script command. [Skotlex]
+ * Made SC_FLEET increase batk as well as watk. [Skotlex]
+ * Fixed gcc warning [Toms]
+ * Fixed AM_REST not closing the homunc status window [Toms]
+ * Fixed SC_NEN according to Mpeg [Toms]
+ * Added a ShowStatus("Terminating...\n") on login-server_sql [Toms]
+ * Some corrections to make Tatami Gaeshi work correctly. [Skotlex]
+ * Fixed SBR44 doing 100% more damage than it should. [Skotlex]
+ * Some more work on the splash skill code. Now splash-damaged enemies
+ should show no animation at all, just the damage-number, while only the
+ targetted character should still display the full skill animation.
+ [Skotlex]
+ * Modified the homun-txt file-save format to separate the name from the
+ rest of fields with tabs (like character saving does), this may fix homun
+ save/loading when using non-latin characters on the name, but be warned
+ that it also means the previous homun-data files are lost! (unless you
+ replace the comma before the start of a name with a tab) [Skotlex]
+ * getnameditem will now also work on stackable items [Skotlex]
+ * Corrected battle_calc_weapon_attack so that all skills ignore your
+ left-hand weapon, and that the Katar's double-attack damage bonus for the
+ offhand damage applies ONLY on normal attacks. [Skotlex]
+ * Fixed Resurrect Homunculus's % to 20*lv% [Skotlex]
+ * Added SQL update which should remove \' from guild names [Toms]
+ * Added option to disable character deletion of certain levels [Lupus]
+ check char_athena.conf for this option format
+2006/08/21
+ * Some more cleaning up of the splash skill code. Now the passed hit value
+ for the splash targetted mobs is 9 instead of 5, this allows multi-hitting
+ splash skills to display the number of hits correctly. [Skotlex]
+ * Fixed call homunc bug when the homunc was vapo and the master has change
+ of map [Toms]
+ * Fixed SQL-Guild Creation, guild name was escaped 2 times [Toms]
+ * Some cleaning of the splash skills. Updated skill-attack to enable again
+ passing of flag 0xF000 which signals that the skill level sent to the
+ client should be -1 (no skill name shouted). Should (hopefully) clear/clean
+ up a bunch of splash damage skill animation-related packets. [Skotlex]
+ * Homun saving won't cap hp/sp to max hp/sp since a homun can have higher
+ hp/sp than the one stated in the db (due to skill bonuses or status
+ changes) [Skotlex]
+ * Cleaned up some more the regen_data structure, so that
+ skill/sitting-skill related data is optional (since only players have it).
+ [Skotlex]
+ * Fixed AM_RESURRECTION, thanks to RockmanEXE for %HP values [Toms]
+ * Fixed HAMI_CASTLE, HAMI_DEFENCE & HLIF_AVOID [Toms]
+ * Adjusted Glittering's success rate to 20+10*lv% [Skotlex]
+ * Corrected isequipped() so that cards will not be tagged as "used up"
+ unless all the specified items were found. [Skotlex]
+ * Fixed a confusion in skill_attack using the src instead of dsrc for some
+ calls, which was causing some problems with the KAITE check from AoE
+ spells. [Skotlex]
+ * Fixed ASC_BREAKER's misc damage part not having the ignore-element flag
+ set. [Skotlex]
+ * Moved homunc battle conf from misc.conf to homunc.conf [Toms]
+ * Some cleaning in skill.c in regard to homun skills. [Skotlex]
+ * Madness Canceller now stacks with other aspd bonuses, just like Berserk
+ does. [Skotlex]
+ * Removed config setting "muting_players", and expanded the manner_system
+ config to specify how having negative manner (mute) affects a player (see
+ battle/misc.conf). [Skotlex]
+ * Expanded the pk_mode setting from no/yes to 0/1/2. 1 is normal pk_mode,
+ if 2 is used, it makes killing players give you a loss of 5 manner points.
+ [Skotlex]
+ * Fixed WS_WEAPONREFINE always failing when at less than job 50. [Skotlex]
+ * Fixed the Autosave routine not working when there's only one player
+ online. [Skotlex]
+ * Disabled command @rain since the client no longer supports it anyway.
+ [Skotlex]
+ * Fixed delitem not checking for the first slot's card, also optimized it
+ so that it doesn't checks on the other slots. [Skotlex]
+2006/08/20
+ * Added a check during mob_db loading so that the six basic stats, max hp
+ and max sp are never below 1, as this could cause crashes when using
+ certain skills. [Skotlex]
+ * Gravitation now only blocks the caster from using potions. [Skotlex]
+ * Corrected Madness Canceller letting you walk while the effect lasts.
+ [Skotlex]
+ * Splitted yet again ASC_BREAKER into a two-part attack. This time the
+ int-based damage is a MISC type attack, and gets reduced by skills as such.
+ [Skotlex]
+ * Fixed "int format, long unsigned int arg" warning [Toms]
+ * Fixed a warning when using cap_value(x, 0, x) on an unsigned value [Toms]
+ * Added clif_skill_fail for homunc to skill_castend_id & skill_castend_pos [Toms]
+ * Fixed homunc skill 8016 not considered as homunc skill [Toms]
+ * @useskill will now cause your homun to use the skill instead of you if
+ the skill is a Homun skill and you have an active homunculus. [Skotlex]
+ * Reduced the Success Chance of GS_FLING to 10+10*lv% (Playtester told me
+ that Vicious told him the chance was much lower like that) [Skotlex]
+ * Fixed some Homunc issues with HR servers (capping some values) [Toms]
+ * Added @hominfo command to obtain real values (not capped ones) [Toms]
+2006/08/19
+ * Fixed @homlvup bug [Toms]
+ * Fixed AM_REST & AM_RESU consumming SP if they fail [Toms]
+ * Fixed homunc spawning bug (they was spawned after an AM_REST + master warp for example)[Toms]
+ * Fixed GS_GROUNDDRIFT [Skotlex]
+ * Increased chance of GS_DESPERADO connecting to 20% [Skotlex]
+ * Fixed battle_calc_base_damage being called for the left hand even for
+ non-dual-wielding attacks. left-hand damage was being set to 0 later
+ anyway, so no exploit existed. [Skotlex]
+ * Moved the weapon_atk_rate bonus to battle_calc_base_damage so that it'll
+ apply correctly when dual-wielding different types of weapons. [Skotlex]
+ * Fixed job-mask 0x100000 in the item_db enabling Dancers/Bards to use the
+ items (0x80000 should be for them and 0x100000 should be currently unused)
+ [Skotlex]
+ * Fixed a possible sigsegv when deleting lif under Mental Change [Toms]
+ * Fixed HAMI_CASTLE [Toms]
+ * Fixed HLIF_CHANGE [Toms]
+ * Updated HLIF_BRAIN skill [Toms]
+ * Fixed homunculus intimacy on feeding [Toms]
+ * Added homunculus_friendly_rate battle config [Toms]
+ * Some compilation warnings fixed [Toms]
+ * Added skill's required item check on homunc skills [Toms]
+ * Add Condensed Red Potion as a required item for HLIF_HEAL [Toms]
+2006/08/18
+ * Little code cleanup on last fix [Toms]
+ * Fixed HLIF_HEAL healing the homunc instead of the master [Toms]
+ * Fixed HLIF_AVOID not increasing walk speed of master [Toms]
+ * Fixed the atk_rate (Turtle General Card) bonus not working on
+ dual-wielders. [Skotlex]
+ * Made HLIF_HEAL a self skill that auto-selects target to caster's master.
+ [Skotlex]
+ * Implemented SC_BLOODLUST and SC_CHANGE, cleaned up HLIF_CHANGE [Skotlex]
+ * Applied a correction to HVAN_EXPLOSION [Skotlex]
+ * Fixed Homun ASPD calculation being able to underflow and give you min
+ speed. [Skotlex]
+ * Added monster_ai&128 to make aggressive mobs ignore that behaviour of
+ always picking Homun targets above player targets regardless of who is
+ closer. [Skotlex]
+ * Fixed homun info packet being unable to display HP/SP correctly once the
+ values are above 32k. [Skotlex]
+ * Applied Mpeg's work on ninja [Toms]
+ * Fixed @homlvup [Toms]
+ * Added guild_aura (skill.conf) setting so you can specify when it works
+ and if it works on the guild-master itself. Defaults to working all the
+ time on everyone except GM. [Skotlex]
+ * Little code cleanup [Toms]
+ * Cleaned merc_hom_evolution to avoid free'ing/realloc'ing [Toms]
+ * Fixed "args of aFree is freed pointer" on Homunc deletion [Toms]
+ * Changed unit_free so that it receives which cleartype should be used when
+ the character is still on a map. Used this on status_damage so that mobs
+ that do not respawn when killed will properly display the death animation.
+ [Skotlex]
+ * Fixed Energy Coat consuming 10x less SP per hit than it should.
+ * Fixed signed/unsigned comparison issues with natural heal system [Toms]
+2006/08/17
+ * Vaporize will no fail when the homun is dead. [Skotlex]
+ * Corrected thhe double free issue that occurs when a homun dies and has no
+ intimacy left. [Skotlex]
+ * Fixed the charsave_method:1 saving/loading exp as signed ints rather than
+ unsigned. [Skotlex]
+ * Applied use of structure regen_data for a unified regen module. Natural
+ and skill-heal is handled by this structure, while sitting-skill-heal is
+ still player dependant (mostly because the other object types can't sit)
+ [Skotlex]
+ * Cleaned up the status calc code for homun by moving it from
+ status_calc_bl_sub_homun to status_calc_homun (where it should had always
+ been) [Skotlex]
+ * Updated SQL files [Playtester]
+ * Corrected map_random_dir algorithm [Toms]
+ * Fixed homunc natural heal and little code cleanup [Toms]
+ * Changed AM_CALLHOMUN Skill to spawn the homunc at 1 cell from his master [Toms]
+2006/08/16
+ * Fixed being unable to recast Adrenaline Rush to reset the duration
+ timers. [Skotlex]
+ * Cleaned up skill_get_range2 so that using range 0 for non-self skills
+ uses the caster's attack range. [Skotlex]
+ * Fixed AM_CALLHOMUN checking for an embryo when you have a vaporized
+ homun. [Skotlex]
+ * Spirit of Wizard will now consume an item 7321 each time it blocks
+ reflected magic. [Skotlex]
+ * Added script command jobname, retrieves a given's class name as per the
+ appropiate msg_athena.txt entry (this command should had been added years
+ ago) [Skotlex]
+ * Fixed null-pointer crash on Evolving a homunculus. [Skotlex]
+ * @produce now can make any kind of equipment [Skotlex]
+ * Made HLIF_AVOID and HAMI_DEFENCE cause the status change on both caster
+ and target. [Skotlex]
+ * AM_REST shouldn't be checking for a range now (since it's a self skill)
+ [Skotlex]
+ * Updated mob_ai so that mobs will use their rude-attacked skill when they
+ can't reach their current target. [Skotlex]
+ * Fixed the default txt config making pets be saved to the homun file
+ instead of to the pet file. [Skotlex]
+ * Now arrow-consuming skills where your main weapon is a whip or musical
+ instrument WILL count as arrow-type attacks, using the atk of the arrow and
+ all related bonuses. [Skotlex]
+ * Fixed some homun timer initialization code. [Skotlex]
+2006/08/15
+ * Applied multiple fixes which should take care of making homun save/load
+ work on TXT now. [Skotlex]
+ * Added Gatling Fever's batk bonus. [Skotlex]
+ * Some cleaning in status_damage which should prevent trying to free
+ already free'd pointers when unit_remove_map invokes unit_free (when
+ status_damage was going to invoke unit_free anyway) [Skotlex]
+ * Delete homunc's skills from sql when the homunc is destroyed [Toms]
+ * Homunc Timers should be disabled when the homunc is vaporized or dead an re-enabled on call/resu [Toms]
+ * Updated vc-project files to compile with the new int_homun files.
+ [Skotlex]
+ * Hopefully fixed the crash when using charsave_method = 1 [Skotlex]
+ * Moved s_pet structure from map_session_data to pet_data, this enabled the
+ removal of a few redundant values in the pet_data structure (name, class,
+ equip) [Skotlex]
+ * Cleaned up some of the pet related @/# commands, same for some script
+ commands. [Skotlex]
+ * Pet offensive skills who's inf value is self will be casted on the pet
+ now (for stuff like Grand Cross) [Skotlex]
+ * Added homun saving/loading support to char-TXT. Note that this is
+ completely untested, so it may be as good as broken. [Skotlex]
+ * Added a crash-fix on status_calc_bl_sub_homun to abort in case the homun
+ has no master (need to clean up this function later) [Skotlex]
+ * Tested char-txt load/save, it seems to be working fine, but you should
+ STILL backup, as I only launched the server (read old character format),
+ closed it down (saved into the new format) and relaunch it (read the new
+ format) and it didn't give problems (but there's still the possibility of
+ some field being read in the incorrect offset or such). [Skotlex]
+ * Updated the char save structure for char-TXT servers so that the homun id
+ will be saved, now also the map info (last point, save point, memo maps)
+ are now saved using the mapindex rather than the string. BACKUP BEFORE
+ UPDATING since this code isn't yet tested. [Skotlex]
+ * Cleaned up a bit the char-saving code, added overflow crash prevention in
+ case there are more memos than the max-allowed saved. [Skotlex]
+ * AM_CALLHOMUN can now be used to recall vaporized homuns. [Skotlex]
+ * AM_RESURRECTHOMUN will now fail when the homun is vaporized. [Skotlex]
+ * Added SCB_DYE which marks which status-changes need a forced cloth dye
+ change to 0 due to sprite issues. Currently only NJ_BUNSINJYUTSU's status
+ uses it. [Skotlex]
+ * Asura Strike now moves you to the target on fail always (unless the
+ target does not exists or is in another map or there's a obstacle on the
+ way) [Skotlex]
+ * Corrected skill_attack_area hitting dead characters on it's splash range.
+ [Skotlex]
+ * Swapped the values for OPTION_XMAS and OPTION_FLYING. This should enable
+ SG to show the fly animation again, even if sometimes others will see him
+ as Santa. As for xmas cloth, it shouldn't make much of a difference since
+ the view class is changed to christmas anyway. [Skotlex]
+ * Made AM_CALLHOMUN and AM_RESURRECTHOMUN be like the wedding skills, where
+ they automatically pick a spot around you. [Skotlex]
+ * Cleaned up some the AM_RESURRECTHOMUN code. Hopefully it works now.
+ [Skotlex]
+ * Cleaned up some the hom evolution code. [Skotlex]
+ * Fixed SIGSEGV with homunc save [Toms]
+2006/08/14
+ * Removed support for negative autosave intervals, instead added a
+ minsave_interval setting which specifies which is the minimum time between
+ character saves. Default to 100ms (map_athena.conf). [Skotlex]
+ * Sacrifice no longer shows damage to self. [Skotlex]
+ * When Asura fails, the skill display will still come off. [Skotlex]
+ * Lots of cleaning of the Homun-code. Perhaps the crashes as of late will
+ be fixed now (reusing AM_CALLHOMUN seems to be the cause of them)
+ [Skotlex]
+ * Increased Run's walk speed bonus to 25->50% [Skotlex]
+ * Modified emergency_call setting to allow for more specific configuration
+ (woe/non-woe, gvg-grounds/non-gvg-grounds, disable from nowarpto maps), see
+ skill.conf for details. [Skotlex]
+ * Fixed script engine allowing scripts to set a player's zeny to negative
+ values. [Skotlex]
+ * Fixed setting hide_woe_damage making even "miss" attacks seem to connect.
+ [Skotlex]
+ * When readjusting the fame-list, the last entry's id is also reset (may
+ fix characters appearing more than once on it?) [Skotlex]
+2006/08/13
+ * Removed @itemcheck as it was totally pointless. [Skotlex]
+ * Corrected states killer/killable being easily dispellable. [Skotlex]
+ * Fixed the totally wrong text messages being used for @killer/@killable
+ related atcommands, added appropiate entries to msg_athena [Skotlex]
+ * Magic and Misc attacks will now get type "flee" when they do less than 1
+ damage, this blocks them from causing additional status effects when they
+ are blocked. [Skotlex]
+ * Cleaned up a bit the Basilica code, it should now properly end when you
+ walk. [Skotlex]
+ * Fixed some logs not working when you enabled all logs. [Skotlex]
+ * Corrected unmute being a level 60 command by default (should be 80)
+ [Skotlex]
+ * Corrected the mapif_parse_PartyChangeMap function to correctly update
+ level-range when someone logs on/off, fixes being unable to set even-share
+ on once it's been broken even when the characters out of range logoff.
+ [Skotlex]
+2006/08/11
+ * Fixed Kagebunshin no Jutsu crashing for dyes > 0; though this solution
+ might seem hackish (changing clothes colour to 0 when it starts while
+ storing original colour back in val4, restoring original dye upon
+ end), I believe this is the best way there currently is to solve
+ the issue. [blackhole89]
+ * Fixed Dancers/Bards being able to use normal attacks while performing.
+ [Skotlex]
+2006/08/10
+ * Fixed the item group bonus not working. [Skotlex]
+ * Fixed songs/dances always being considered overlapped with themselves.
+ [Skotlex]
+ * Added some additional song/dance overlap code that should correctly
+ change the effect of songs/dances when they overlap. [Skotlex]
+ * Added a check so that the status-change packet is always send to self
+ when the inflicted char is a player disguised. [Skotlex]
+ * Code cleanup on homunc, they stay in memory until player disconnect or
+ homunc destruction [Toms]
+ * Corrected Advanced Jobs HP bonus from 30% -> 25% [Skotlex]
+ * Hopefully fixed family-party-even-share not breaking when a member logs
+ out. [Skotlex]
+ * Should have fixed the login-sql crash when passed user-name's length is
+ beyond the limit. [Skotlex]
+ * Changed setting attack_attr_none to affect all neutral-element attacks.
+ Basicly, this setting is now used to determine who can hit for full damage
+ always when using neutral-attacks (defaults to non-players) [Skotlex]
+ * Fixed two instances in the login-sql server where the ip in the log-login
+ table was being stored backwards. [Skotlex]
+ * Now when a skill's range is 0 and the skill is NOT casted on self, it
+ will take the basic weapon's range (without Vulture/Snake Eye bonus).
+ [Skotlex]
+ * Now when a duration is not specified, sc_start/sc_start2/sc_start4 will
+ try to guess the duration by extracting it from the skill_db (it uses
+ skill_get_time on whatever skill is associated to the status-change using
+ val1 as skill-level) [Skotlex]
+ * Some cleanups on trade_tradeaccept to prevent packets being resent when
+ they shouldn't. [Skotlex]
+ * Fixed syntax error in 'guild' create table statement [Toms]
+2006/08/09
+ * Fixed Asura not wasting all SP away when it fails on cast-end. [Skotlex]
+ * Fixed homunc skill up bug [Toms]
+ * Adjusted some the dance/song/encore code so that the source of an
+ ensemble will always get checked, so that walking out of an ensemble skill
+ should make it end now. However, it's likely this is not completely solved
+ yet and will require further tweaking. [Skotlex]
+ * Added crash protection to the mob_db txt reading when the mob_db file has
+ lines with insufficient number of columns. [Skotlex]
+ * Moved the class-change code from battle_calc_weapon_attack to
+ skill_additional_effect. Alchemist summons now also have a chance of
+ triggering polymorphing. [Skotlex]
+ * Removed the code which was auto-setting attacks that do no damage to type
+ FLEE, since that was disabling status-effects which should incur even when
+ the damage was blocked. [Skotlex]
+ * Trade requests will now fail when either character is unable to act
+ (character in storage, vending, interacting with an npc, petrified, etc)
+ [Skotlex]
+ * Heard skotlex voice, changed all msg_table[] into msg_txt() in atcommand.c [Toms]
+2006/08/08
+ * Fixed the char-server not invoking the party_calc_state function when the
+ third party-member is added to a party, hence failing to check for families
+ and disabling even share from them unless all three relog first (state is
+ correctly calculated when party is first loaded). [Skotlex]
+ * Crash-protections in the mail-checking function. [Skotlex]
+ * Some additional parenthesis on equipment check in pc_equipitem, seems to
+ have fixed the mid/lower headgear-sprites not showing up. [Skotlex]
+ * Added back missing state set to prevent Ankle-Snare from being retrieved
+ after the target dies. [Skotlex]
+ * Fixed compilation warning [Toms]
+ * Added a check to handle Spider Web as a targetted skill. If there's more
+ than one character on the targetted cell, a different one may get trapped,
+ but it will mostly do as it is now. [Skotlex]
+ * Added check to Asura so that it will move you to the target when it fails
+ ONLY when you can cast the skill on the target (not stunned, asleep, target
+ not hidden, etc) [Skotlex]
+ * Changed the map_freeblock_unlock code so that when there's an "already
+ free'd pointer" error, the memory manager will print out the invoking
+ function rather than map_freeblock_unlock, this should help fix it up next
+ time it happens and is reported. [Skotlex]
+ * Casting Kaensin will clear out Suiton and viceversa now. [Skotlex]
+ * Fixed drop-rates (@whodrops) getting duplicates when you use @reloadmobdb
+ [Skotlex]
+ * Fixed unjailing not sending characters to Prontera. [Skotlex]
+ * Fixed yet again AS_SPLASHER doing full damage on all characters. Now you
+ can use the NK split damage value in the skill_db if you want damage
+ divided by the amount of targets rather than by 2. [Skotlex]
+ * Fixed crash on the battle_drain functions. [Skotlex]
+ * Cleaned up HAMI_CASTLE, HLIF_AVOID, HAMI_DEFENCE so that it's usable by
+ other types of objects other than Homunculus. [Skotlex]
+ * Cleaned up the Asura Strike code so that the SP/Spheres/States is not
+ consumed when the skill fails due to Fog of Wall. [Skotlex]
+ * When a negative delay for a skill is specified, this delay is now added
+ on top of the character's amotion rather than adelay [Skotlex]
+ * Modified main.sql to make the guild table allow NULL on the emblem data.
+ [Skotlex]
+ * Added file conf-tmpl/Changelog.txt to log config changes. [Skotlex]
+2006/08/07
+ * Fixed the login-sql server replying to the change-sex packet with the
+ wrong gender, causing the char-server to screw-up job-change updates.
+ [Skotlex]
+ * Cleaned up the apparent mess that is pc_skill. Hopefully it SHOULD work as
+ described on the docs now, this should also fix adopting not correctly
+ giving the family-related skills. The flag value of skill should be: 0 to
+ set the skill (if skill level is 0, this removes a learned skill), 1 grants
+ the skill as an item bonus which is temporary, and 2 will add a skill bonus
+ like 1, except the skill level adds up to whatever level already known of
+ that skill. [Skotlex]
+ * Fixed EQP_WEAPON related code messing up with both weapon AND shield.
+ [Skotlex]
+ * Cleaned up the Asura code so that when the skill fails your
+ SP/Spheres/Fury are all taken away always, as well as moving you next to
+ the target (as long as the target still exists within a reachable path from
+ your position) [Skotlex]
+ * SC_GUILDAURA is now removed on logout. [Skotlex]
+ * Fixed Venom Splasher doing half-damage instead of full-damage to the
+ "exploding" character. [Skotlex]
+ * Hopefully fixed the party_even_share cast-overflow bug as reported by
+ Adobe. [Skotlex]
+ * Standarized the autosave interval setting to be always in seconds
+ regardless of type. [Skotlex]
+ * Moved the "bosses can't be knockback" logic from battle_calc_* functions
+ and placed it on skill_blown. [Skotlex]
+ * Some parenthesis cleanup before invoking battle_calc_base_damage, could
+ be fixing the current issue with arrow attacks not adding the arrow damage.
+ [Skotlex]
+ * Fixed the map_search_freecell error which was making mobs fail to
+ respawn. [Skotlex]
+ * Added in Lupus's suggestion of not making multi-slot headgears set all
+ slot view-ids, which supposedly causes the client to re-draw the headgear
+ multiple times on characters. [Skotlex]
+ * Fixed HT_BLITZBEAT hitting neutral characters when it auto-triggers.
+ [Skotlex]
+ * Simplified the Tatami Gaeshi code. [Skotlex]
+ * Fixed AS_SPLASHER doing full damage on everyone except targetted char
+ instead of the other way around. [Skotlex]
+ * Fixed KAENSIN clearing out SUITON cells and viceversa. [Skotlex]
+ * The spawn area is now seen as range rather than absolute for mob spawn
+ lines. This means that x,y,10,10 will spawn the mob on a 21x21 grid around
+ the given x,y point. [Skotlex]
+ * Some clean up of the mob-spawn code. Now you can specify negative areas,
+ so that a spawn location such as 100,150,0,-1 will spawn a mob always on
+ x=100, but any Y value of the current map. [Skotlex]
+ * Reflected damage will now also have a chance of draining hp/sp. [Skotlex]
+ * Adjusted the order in which option/sc change packets are sent to match
+ Aegis's [Skotlex]
+ * Added script command getpartyleader through which you can retrieve
+ various information of a party's leader. See doc/script_commands.txt for
+ further information. [Skotlex]
+ * mpeg's Ninja work [Vicious]
+ * Adjusted Battle_check_target so that alchemist summoned mobs are
+ targetted by everyone as long as 1. The top-level master is a player and 2.
+ the actual attacker is not a mob-type. [Skotlex]
+ * Added config force_random_spawn which overrides the spawn-files defined
+ coordinates to make all mobs always spawn randomly on the map. [Skotlex]
+ * SC_SPEEDUP0 is no longer dispellable by SA_DISPEL [Skotlex]
+2006/08/06
+ * Updated item_db.sql & mob_db.sql to latest. [Toms]
+ * Little fixes on homunc (hp/sp are now saved and init stats changed) [Toms]
+2006/08/04
+ * Added a commented piece of code at the end of clif_parse_LoadEndAck which
+ will update your direction to wherever you were facing before warping.
+ Should this be the default? Nearby people DO see you facing on the same
+ direction before warping, it's only your client that will always see you
+ facing north on spawn (the spawn packet does contain direction
+ information). [Skotlex]
+ * Updated @mobinfo to display slots in the drop information. [Skotlex]
+ * Fixed flag.elefix not being respected in battle_calc_misc_damage.
+ [Skotlex]
+ * Some code cleanups in battle_calc_damage. [Skotlex]
+ * Modified bAddItemHealRate so it can receive both item-id and item-group
+ values (since the first item-id is +500, there's no risk of mixing them
+ up). [Skotlex]
+ * Removed settings enemy_critical_rate, homun_critical_rate. Added settings
+ enable_critical (defaults to specify only players), mob_critical_rate and
+ critical_rate. The last applies to all non-mobs and non-players
+ (battle/battle.conf) [Skotlex]
+ * Removed settings mob_npc_warp, mob_warpportal. Replaced with setting
+ mob_warp which specifies which types of warp can a mob step into
+ (battle/monster.conf) [Skotlex]
+ * Enabled Mastery damage on Soul Breaker again, moved adv katar mastery out
+ of the mastery function so that it may apply to all skills except Soul
+ Breaker. [Skotlex]
+ * Changed name of the setting log_pick to log_filter since that's what it
+ does now. [Skotlex]
+ * Modified enable_logs so that instead of a 0/1 setting, you can specify
+ which kind of events to log (so you can use a combination), see log_athena
+ for the bitmask configuration. [Skotlex]
+ * Cleaned a bit the contents of log_athena.conf
+ * Hide/Chasewalk will again stop screaming skill name. [Skotlex]
+ * Soul Breaker will no longer receive Mastery damage. [Skotlex]
+ * Fixed warning:'type' might be used uninitialized in this function [Toms]
+2006/08/03
+ * Added a check to skip the experience share of characters who are dead or
+ on another map. [Skotlex]
+ * Reverted the previous change, chasewalk has no icon, only the str-bonus
+ has that fist icon now. [Skotlex]
+ * Allowed chase-walk to display a skill animation when using it. [Skotlex]
+ * Readjusted the Chasewalk icon to be as it should be. [Skotlex]
+ * GS_DESPERADO is now a short-range attack skill. [Skotlex]
+ * Changed the Battle-Orders icon to be the Strength Up icon (for
+ Chasewalk's str bonus). [Skotlex]
+ * Fixed using the right-hand weapon's size modifiers regardless of which
+ weapon's damage was being calculated in regards to. [Skotlex]
+ * Simplified the ignore-size check by making the Weapon Perfection check be
+ done when specifying the flag, also moved the size-fix property of riding
+ spear-knights to status_calc_pc. [Skotlex]
+ * Changed SI_CHASEWALK value to 119 as concluded by LoneWolf [Skotlex]
+ * Corrected clif.c sending the raw mdef2 value to the client instead of
+ first substracting the "secret vit/2" bonus from it. [Skotlex]
+ * Added a damage cap to CR_ACIDDEMONSTRATION of INT_MAX/2 to prevent
+ overflows. It is not capped to INT_MAX because damage increasing skills
+ would cause it to still overflow afterwards. [Skotlex]
+ * Fixed NPC_CRITICALSLASH not being considered as a Critical hit by the
+ code. [Skotlex]
+ * Added RUDE_ATTACKED_COUNT so you can easily adjust how many rude-attacks
+ should happen before a mob uses the rude-attacked skill. Value has been set
+ to 2 for now. [Skotlex]
+ * Now when a mob changes target (to someone they can hit) their
+ rude-attacked count won't be reset, but instead will be reduced by one.
+ [Skotlex]
+ * SC_SPEEDUP0 can now stack with the other speed raising buffs. [Skotlex]
+ * Some adjustments so that the last-skill-used will be correctly cleared
+ when your combo-time ends. [Skotlex]
+ * Fix a bug in atcommand_charspeed [Toms]
+ * Fixed a logic error preventing from cooking anything [DracoRPG]
+ * Cleaned up the last NJ update code. [Skotlex]
+ * Added @ command `charspeed` [Skotlex]
+ * Fixed @jailfor using MAP_PRONTERA as jail instead of MAP_JAIL [Skotlex]
+ * Removed case for GS_SPREADATTACK on damage packets to see if the skill
+ displays correctly now. [Skotlex]
+ * Corrected Deluge/Volcano/V. Gale overlaps so that the placing tiles are
+ removed, NOT the ones who were already placed. [Skotlex]
+ * Made SC_SPEEDUP0 and SC_SPEEDUP1 use different icon IDs, to fix
+ icon-confusion when both are enabled at a time. [Skotlex]
+ * Mob rude-attacked count is not reset now on picking a new char (gotta
+ investigate this further) [Skotlex]
+ * Changed atoi to strtoul for guild-experience's field [Toms]
+ * Fixed a bug in int_storage.c, temp array doesn't have the good size [Toms]
+2006/08/02
+ * Modified yet again SC_SILENCE after iRO tests from Entwined on IRC.
+ Silence now ONLY blocks skills from being used, it will not stop on-going
+ casts. [Skotlex]
+ * Updated status_cast_cancel to also include silence (so the cast bar is
+ cancelled if you are silenced during it) [Skotlex]
+ * Updated the way SC_SILENCE works. From what I remember (from previous
+ forum discussions) it: 1- Always blocks skills from being used. 2- Will
+ only block a skill when the cast-bar ends IF the skill is targetted. If
+ anyone wants to debate to get this changed, make an appropiate forum topic
+ in the svn development area to discuss. [Skotlex]
+ * Added a check in the walking code when triggering skills.
+ NPC_SELFDESTRUCTION will no longer cancel walking, it will instead resend
+ the walk packet, this effectively causes the mob to start walking
+ (clientside) while the cast-bar is showing. [Skotlex]
+ * Fixed a logic error on battle_get_master which was causing infinite
+ loops.. [Skotlex]
+ * Fixed homunculus error message [Toms]
+ * Rewrote pc_payzeny to not use doubles, it may more accurately prevent
+ charging a player more zeny than they can withhold. [Skotlex]
+ * Fixed failing to create Deadly Poison Bottles damaging 50% of your max
+ life instead of 25% [Skotlex]
+ * Added the missing status-change flags to SC_FREEZE to signal it should
+ modify def and magic def [Skotlex]
+ * Little add on NJ_HUUMA [Toms]
+ * Merged Mpeg's work on Ninja skills [Toms]
+ * Fixed Martyr's Reckoning having a cap damage of 32k. [Skotlex]
+ * Now you can teleport in Thanatos Boss room, but you can't respawn there [Playtester]
+ * Fixed Defender Raising Walk speed instead of diminishing it. [Skotlex]
+ * Added a check on status-change load to prevent loading speed-affecting
+ status when their speed adjustment is 0 (prevents division by zero)
+ [Skotlex]
+ * Code cleanup & optimization on guild part of char-server [Toms]
+ * Fixed script code data not being free'd if a player quits in the middle
+ of a script. [Skotlex]
+ * Modified run_script so that when there are leaks, it will report the
+ place where run_script was called from as source rather than the inner code
+ of run_script (for debugging purposes) [Skotlex]
+ * Made recursive master check the default (otherwise it messes skill -> pet
+ -> player kind of herarchies) and cleaned up some the battle_get_master
+ code to prevent infinite loops in the weird case someone specifies that
+ their master is itself. [Skotlex]
+ * Recoded the GuildAura code to use val3 & val4, allowing much greater stat
+ bonuses (in case someone wants to get Guild Skill level 20 or something
+ crazy like that) [Skotlex]
+ * Updated battle_check_target so that all alchemist summoned mobs can be
+ target by everyone. [Skotlex]
+ * Cleaned up skill_check_condition_mob_master_sub, it will now count both
+ total number of summoned mobs and amount that belong to the same type.
+ [Skotlex]
+ * Corrected AM_CANNIBALIZE so it will fail if you already have plants of
+ another type out. [Skotlex]
+ * Using NPC_SELFDESTRUCTION no longer will make the caster stop walking.
+ [Skotlex]
+ * Removed SI_GUILDAURA, and replaced it with SI_LANDENDOW, now
+ Volcano/Deluge/V. Gale will get that funky icon instead. [Skotlex]
+ * Changed clif_hominfo to receive both sd and hd as parameters
+ * Some redundancy cleaning in mercenary.c [Skotlex]
+ * Moved updating of sd->mercenary.hp from merc_damage to pc_makesavestatus.
+ [Skotlex]
+2006/08/01
+ * Miscellanous fixes which make the Marine Sphere self destruction work as
+ best as I can. It only has one flaw: It self-destructs instantly after
+ walking because if I make it use self-destruction with a cast-bar,
+ client-side the object stops moving inmediately... [Skotlex]
+ * Modified unit_walktoxy and NPC_RUN to enable running even when the caster
+ does not has the MD_CANMOVE bit on. [Skotlex]
+ * PF_MINDBREAKER will now silently fail if you try to use it on someone who
+ already has the status active. [Skotlex]
+ * Cleaned up yet again skill_landprotector, now new cells of
+ Deluge/Volcano/V.Gale will delete previous cells when they are recasted on
+ top of each other. [Skotlex]
+ * Summoned Marine Spheres no longer get the MD_CANMOVE bit. [Skotlex]
+ * Cleaned up some more the SC_JAILED code [Skotlex]
+ * merged in atcommands jailfor, jailtime, charjailtime. Thanks to Meruru
+ and Coltaro for the code. [Skotlex]
+ * Cleaned the code of atcommands jail and unjail [Skotlex]
+ * Be warned that the code MAY contain bugs as I adjusted it to save the
+ character's position before jailing, allowing the automatic unjailing to
+ warp you back to the exact spot you were at before being jailed. [Skotlex]
+ * Should have fixed the cooking sets not displaying all cooking available
+ items. [Skotlex]
+ * Figured out and fixed the issue with Volcano/Deluge/Violent Gale not
+ really working. Thanks to Mpeg for noting it out. [Skotlex]
+ * Modified Self Destruction, so that Marine Spheres in non-versus maps will
+ hurt only enemies, while in all other situations this skill will hurt
+ everyone around them. [Skotlex]
+ * Expanded setting debuff_on_logout so that &1 removes negative buffs and
+ &2 removes positive buffs. [Skotlex]
+ * Food status boosts will no longer end on death, but they will end when
+ you respawn or logout. [Skotlex]
+ * Added battle config file status.conf, moved some settings from skill.conf
+ and battle.conf to it since they are entirely Status-Change related.
+ [Skotlex]
+ * Added the missing lines to enable script command "kickwaitingroomall"
+ [Skotlex]
+ * Magic Rod's can-act delay will no longer be applied when you absorb a
+ spell. [Skotlex]
+ * Fixed Don't Forget Me increasing speed instead of decreasing it. [Skotlex]
+ * Modified setlabel so that the script engine barks when you are trying to
+ use the same label name as a constant or variable name. [Skotlex]
+2006/07/31
+ * Fixed the subnet 0 mask being reset to 0 when someone goes up on the fame
+ rankings. [Skotlex]
+ * Updated Poison React chance to counter and number of counters as per
+ skill description updates. [Skotlex]
+ * Fixed Sharpshooting being counted as a magic attack, and hence, using
+ your MATK as base damage. [Skotlex]
+ * Fixed NPC_STOP id value in skill_cast_db [Skotlex]
+ * Bladestop will no longer stop when you push either of the characters
+ around. [Skotlex]
+ * Fixed Enchant Poison having a near 100% chance of poisoning target on
+ attack. [Skotlex]
+ * Little fix on duel [Toms]
+ * Added possibility to restrict duel usage to same map [Toms]
+ * Merged mpeg's fix on ninja skills [Toms]
+ * Corrected a status_get_race call which should be status_get_race2 in misc
+ attacks. [Skotlex]
+ * Moved the Devotion code to the top of the SC list in status_damage,
+ meaning that now stuff like being asleep or confused won't end if you are
+ hit, but the damage is absorbed by devotion. [Skotlex]
+ * Added the Soul Link of Rogue speed bonus to Chase-Walk. Since there's no
+ information of how much the bonus should be, it currently is a conservative
+ 10%. [Skotlex]
+ * Fixed a possible crash in the main script engine when restoring previous
+ script. [Skotlex]
+ * Fixed sleep.tick not being set back to 0 before resuming execution, which
+ leads to scripts that are continously executed even when they already ended
+ (they do nothing but waste resources) [Skotlex]
+ * Fixed a pair of free -> aFree used on stacks, which would lead to memory
+ manager reporting leaks where there aren't. [Skotlex]
+ * Removed incorrect "Waterball range+1 when standing on suiton" feature.
+ [Skotlex]
+ * Corrected the Speed update code to prevent sending "walk to xy" packets
+ twice when the affected character is a player. [Skotlex]
+ * Expanded mob can't move warning to print out where this mob was stuck at
+ (map, x,y) [Skotlex]
+ * Fixed segmentation fault in status_change_end, vd wasn't initialized [Toms]
+2006/07/30
+ * NPC_INVISIBLE will now use Cloaking of a level +9 of the used skill
+ level, so that at level 1 they can attack, use skills and receive no
+ walking penalty. [Skotlex]
+ * Mob casted Sanctuary will no longer always heal it's targets regardless
+ of element/race [Skotlex]
+ * Status change packets will now use as criteria for sending the actual
+ view_class instead of player/not-player. This will fix status-changes
+ displaying improperly on clones, and also possible crashes with disguised
+ players. [Skotlex]
+ * Merged mpeg's fix on ninja skills and SA_VOLCANO,SA_DELUGE,SA_VIOLENTGALE [Toms]
+ * Added bNoMiscDamage setting so you can specify misc-damage blocking from
+ skills. Modified battle_calc_damage so that even Pressure and similar
+ skills will be affected by this setting. [Skotlex]
+ * GS skill updates/fixes [Vicious]
+ * Force all users offline in sql when char-server starts [Toms]
+2006/07/29
+ * Removed ugly struct cast in login.c [Toms]
+ * New version of buildin_query_sql which accept more than one column and
+ can return the number of rows. See script_commands.txt for more details. [Toms]
+ * Fixed nullpo in merc_hom_skillup [Toms]
+ * Added a return value to buildin_rid2name if rid is invalid [Toms]
+ * Made the SQL ping interval default to 7 hours. [Skotlex]
+ * Made skill_unitsetting remove the group when no unit-cells were placed
+ down. basicly this means that if landprotector blocks all tiles, the group
+ will be removed from memory, preventing said group from counting to the
+ total number of skills you can set. [Skotlex]
+ * Fixed segmentation fault in script engine when calling something which is not a function [Toms]
+ * Fixed segmentation fault in script engine when activating DEBUG_RUN flag [Toms]
+2006/07/28
+ * Added Ishizu's code to check ammo type on attack. No more using Grenade
+ rounds with Guns. [Skotlex]
+ * offensive heal/sanctuary will only happen when the source of the heal is
+ a player, mob/pet casted heal will now always heal regardless of target.
+ [Skotlex]
+ * Shield Chain will now ignore the 'ice-pick' defense piercing bonus.
+ [Skotlex]
+ * Self destruction will now hit all characters in range, not just enemies.
+ [Skotlex]
+ * Cleaned up the NJ update code: [Skotlex]
+ - Restored code which was removed (stuff like SC_SKA)
+ - Fixed possible crashes on some NJ skills if used by non-players.
+ - Fixed most NJ magic spells doing more damage than they should.
+ - Fixed ZenyNage being able to do more damage than zeny you have.
+ - Cleaned up skill setting code for Suiton and Kaensin
+ * Some cleaning of battle_drain, Evil Druid card should work now. [Skotlex]
+ * Made status_damage allow damaging of objects not on a map, this should
+ fix pet-catching making the mob never respawn again. [Skotlex]
+ * Casted nothl to (unsigned int) in sprintf functions, IP is 32bits and sql field the same :) [Toms]
+ * Fixed "warning: `list' might be used uninitialized in this function" in char/char.c@3032 [Toms]
+ * Fixed "uninitialized local variable 'i' used" in skill.c and "warning: suggest explicit braces to avoid ambiguous `else'" in battle.c [Toms]
+ * Fixed "warning: long unsigned int format, unsigned int arg" in parse_login (login_sql\login.c) [Toms]
+ * Fixed sign warnings in login/login.c [Toms]
+ * Fixed "conversion from 'double' to 'int', possible loss of data" [Toms]
+ * Fixed "warning: redefinition of [ushort/uint/ulong]" [Toms]
+ * Fixed duplicate case value on NJ_SUITON [Toms]
+2006/07/27
+ * Fixed a memory leak when there exists more than one user function with
+ the same name, added the appropiate warning when this happens. [Skotlex]
+ * Added reporting source file when an npc shops item's price is
+ exploitable. [Skotlex]
+ * The picklog will now record negative values for items sold to npcs.
+ [Skotlex]
+ * Added inmediate position and hp-bar update when a character joins a
+ party. [Skotlex]
+ * Added missing SC information to NPC_CHANGEUNDEAD [Skotlex]
+ * Added config setting party_update_interval so you can specify how often
+ the party-mate minidots should be updated (defaults to 1 sec). [Skotlex]
+ * Removed a bunch of broken comments in skill.c [Skotlex]
+ * Synced the script.c file with as much data as possible from jA's:
+ [Skotlex]
+ - A lot of functions were moved around, a bunch of indentation and
+ space-usage changes were done to make it easier to diff against their
+ files.
+ - Miscellanous addition and corrections were applied.
+ - Largest one is likely a restructuring of run_script_main, which hopes to
+ solve the memory leaks.
+ - script engine now uses the setjmp functions to restore memory state when
+ there's an error parsing scripts, which means that script errors won't
+ cause the map-server to inmediately bail out anymore.
+ - NOTE that the amount of changes is pretty extensive, so DON'T USE THIS on
+ a live server. Update only to help test and debug to see if the script
+ engine memory leaks are gone.
+ * Added a cleanup routine on shutdown to remove all characters from memory
+ for whom the save ack has not returned from the char-server yet. [Skotlex]
+ * Now when you set the guardian's HP, if the guardian is spawned, it's HP
+ will be updated accordingly (and if you set it to 0, the guardian is
+ killed) [Skotlex]
+ * Added functions status_set_hp/status_set_sp to set hp/sp to a given
+ value. Applied usage of these on the Berserk and Soul Change code.
+ [Skotlex]
+ * Added config setting "party_hp_mode" (battle/party.conf) which determines
+ method to use to update party-mate hp bars. Aegis style is to update HP
+ bars whenever HP changes, while eAthena style is to update it together with
+ the map party dots. Defaults to aegis style. [Skotlex]
+ * Fixed packet 0x22a having the manner and opt3 packets in inverted
+ offsets. [Skotlex]
+ * Readded the check which prevents Cloaking from activating when your
+ learned level is less than 3 and you aren't next to a wall. [Skotlex]
+ * Some cleanups to the Frenzy/Berserk status change, it should probably
+ work correctly now. [Skotlex]
+ * Removed a redeclared variable i in the parsing of the fame list (char-sql
+ server) which seems to be the cause of the random memory corruptions.
+ [Skotlex]
+ * Updated item_db.sql to latest. [Toms]
+ * Fix homunc & code cleanup [Toms]
+ - Timer problems on delete_timer
+ - Intimacy problem (overflow & new values)
+ - Homunc deleted if intimacy < 0
+ - base exp is now given to master
+ - Homunc sometimes not saved
+2006/07/26
+ * Fixed a memory leak when reading the item_db txt. [Skotlex]
+ * Applied the necessary changes to make @partyoption reflect it's changes
+ on the alt+p window. [Skotlex]
+ * Modified party_item_share_type config setting so that using 1 disables
+ item-sharing from non-mob loot (player dropped items or pet loot) and 2
+ enables round-robin instead of random sharing. Using 3 obviously is
+ enabling both 1 and 2. [Skotlex]
+ * Added battle_get_master which returns the master bl of a given object.
+ [Skotlex]
+ * Recoded battle_check_target to use battle_get_master, the src/target
+ switch has been split into two, so that actual target and master target are
+ seperately treated (same for source). [Skotlex]
+ * Added support for "sc_end -1" which will clear all status changes. Added
+ the constant SC_ALL so you can use in scripts "sc_end SC_ALL;" instead.
+ [Skotlex]
+ * @pettalk will now fail when muted. [Skotlex]
+ * Enabled changing of equipment while stunned/asleep/petrified/etc [Skotlex]
+2006/07/25
+ * Cleaned up run_script_main to properly free previous stack-data when
+ running scripts. Note that scripts may still leak memory when run by
+ non-players and they don't reach the "END" state, however I am not sure how
+ this case should be handled, so it's left as it is for now. [Skotlex]
+ * Added a missing ntohl call in the loginlog code. [Skotlex]
+ * Added a check when buying from npcs to allow buying of item_avail items.
+ [Skotlex]
+ * Fixed duel accept invite sending the packet before the duel data is set
+ (resulting in a packet that noone receives). Thanks to Toms for finding it
+ out. [Skotlex]
+ * Fixed a possible crash when you dual-wield and the total damage is 0.
+ [Skotlex]
+ * Added Toms's perl scripts item_db.pl and mob_db.pl (they are in tools/),
+ they convert the txt databases into sql. [Skotlex]
+ - Usage: "script" < "input file" > "output file". eg: ./tools/item_db.pl < db/item_db.txt > sql-files/item_db.sql
+ * Updated the sql files since now it's quick [Skotlex]
+2006/07/24
+ * Re-updated the mob_db.sql to latest. [Skotlex]
+ * Cleaned up the skill_landprotector function to correctly block only magic
+ skills from being placed on land protectors. [Skotlex]
+ * Corrected itemdb_group so that it will not return the random item givers
+ (should give priority to actual item groups, so that the item heal bonuses
+ work correctly) [Skotlex]
+ * Cleaned up the Mistress Card related code so that the no-gemstone bonus
+ reduces item requirements by one rather than totally skip them. [Skotlex]
+ * Cleaned up the logs "can log"function to use the IT constants. Also
+ corrected the "only log large amounts" setting not working on negative
+ values (trades). [Skotlex]
+ * Adjusted skill_castfix_sc so that Suffragium will get consumed even on
+ instant cast skills, but Memorize won't. [Skotlex]
+ * BladeStop will now end when either of the characters is moved (knocked
+ out?) around. [Skotlex]
+ * Moved the Zeny penalty code from respawn to pc_dead. [Skotlex]
+ * Added a check to prevent Deluge/Volcano/Violent Gale from being placed on
+ top of each other. Reverted the previous 'fix' where atk was being
+ increased based on armor element rather than element of attack. [Skotlex]
+ * Removed the noreturn mapflag check from script command warp. [Skotlex]
+ * Homuculus cleanup [DracoRPG]
+ - Replaced nullpo's in parse functions by silent checks
+ - Removed server-side effect for menu option 0 (view status window...
+ why does the client send us the packet since we don't care? -_-)
+ - Rewrote intimacy underflow checks so they are really effective (no
+ need to check if an unsigned is < 0, it won't work... check before!)
+ * fixed unban unblocking players as well. [Skotlex]
+ * Fixed Volcano/Deluge/Violent Gale increasing damage based on element of
+ attack instead of defense element of attacker. [Skotlex]
+ * Cleaned up the code of Magic Rod, fixed it not giving SP. [Skotlex]
+ * Moved the code of Hermod and Basilica to castend_pos2 so it should work
+ now. [Skotlex]
+ * Modified the code of Ankle Snare so the status ends on unit's time-limit
+ rather than when the snared object moves away. [Skotlex]
+ * Re-worded the water check of ST_WATER skills. [Skotlex]
+ * Allowed sc-cast reductions to be processed even when cast-time is instant
+ (to let suffragium end even on instant-cast skills) [Skotlex]
+2006/07/23
+ * Modified setting skillrange_by_weapon (skill.conf) to be a
+ per-object-type setting instead of yes/no. The default now is that
+ weapon-based skills will take the attacker's range for non-players.
+ [Skotlex]
+ * Changed the default of skillrange_by_distance to include homunculus.
+ [Skotlex]
+ * Fixed buildin_isequip not working correctly with non-cards. [Skotlex]
+2006/07/22
+ * Updated mob_db.sql to latest. [Skotlex]
+ * Applied Toms's suggested corrections to homun code. [Skotlex]
+ * Corrected Cannibalize/Marine Sphere ignoring the selected summon spot.
+ [Skotlex]
+ * Fixed looting pets ignoring the item pick-up priority of other players.
+ [Skotlex]
+ * Should have fixed a signess warning in login txt. [Skotlex]
+2006/07/21
+ * Added blocking of @me when muted or in berserk status. [Skotlex]
+ * Corrected the @follow timer not being deleted on logout. [Skotlex]
+ * Applied the homunculus code fixes provided by Toms. [Skotlex]
+ * battle_check_target will now tag homunculus as invalid target when the
+ source is a skill-type object. [Skotlex]
+ * Added a check on pc_equipitem so that when the client specifies to equip
+ a weapon on the right hand when the left hand is available, the weapon will
+ be sent to the left hand instead (when dual-wielding is possible,
+ obviously). Same for the left/right accessories. [Skotlex]
+ * Added the necessary checks so that Suiton makes Fogwall have double
+ duration, and to make water-requiring skills to consume their cells.
+ [Skotlex]
+ * Corrected the loadmap event description to specify that the mapflag
+ required is actually "loadevent", NOT "loadmap"! [Skotlex]
+ * Now when the char-txt server does not finds a requested party, it will
+ clear out said party id of all characters (will help prevent massive
+ spamming/overhead when for some reason the party file needs to be deleted).
+ [Skotlex]
+ * Combo skills (inf = self, inf2 = no target self) no longer check range if
+ you use them while your attack-timer is still active. [Skotlex]
+ * Added back a map_freeblock call in skill_delunitgroup which caused a
+ memory leak when removed... [Skotlex]
+ * Added a check to prevent Blind from ending while standing on a fog of
+ wall. [Skotlex]
+ * The mob Slave ai will be executed now even when the slave has a target.
+ This will allow for "instant" warping to the master when it changes maps or
+ teleports. if the slave has a target already, it won't unlock it and chase
+ back to the master or anything like that. [Skotlex]
+ * Removed a couple of checks that prevents item ids above 20000. However,
+ remember that the max id is still ~32k or the client is the one who's gonna
+ crash! [Skotlex]
+2006/07/20
+ * Added source reporting when you do an invalid int&str or str&int
+ operation on a script. [Skotlex]
+ * Fixed the intif party creation packet having the incorrect size sent,
+ hence causing the leader's level to be read as garbage (which caused the
+ "impossible to even share" bug). [Skotlex]
+ * Added pc_check_weapontype to do a proper skill weapon check that takes
+ into account dual-wielding. That is, if a skill can be used with
+ daggers/axes, you'll be able to use the skill when dual-wielding them.
+ [Skotlex]
+ * Corrected Cloaking level 1-2 not letting you move across walls. [Skotlex]
+ * updated cloaking code so that when you set "enable cloaking without
+ walls", the code will consider you as "always next to a wall", thus you get
+ the wall-speed bonus always. [Skotlex]
+ * Applied the fix to homunculus name saving... [Skotlex]
+ * Added battle config settings agi_penalty_target and vit_penalty_target,
+ they define which object types will get vit/flee reductions when
+ multi-targetted and defaults to only players (battle/battle.conf) [Skotlex]
+ * Added the dummy intravision case for the changeoption packet 0x229
+ [Skotlex]
+ * Corrected Fog of Wall so that all targetted offensive skills (not only
+ those who do damage) will fail on cast-end 75% of the time. [Skotlex]
+ * corrected @homlevel up and one entry in the homun exp table as reported
+ on the forums by Albator. [Skotlex]
+ * Added the SQL fix to Homunculus skill learning/saving bug [DracoRPG]
+ * Added a status_check_skilluse on skill_attack_area call to prevent splash
+ damage skills from hitting hidden/trickdead/etc characters. [Skotlex]
+ * Corrected fog of wall to behave as best known currently: [Skotlex]
+ - Only takes effect when targetting a character inside it
+ - -50hit/-75% damage when using normal-ranged attacks
+ - -25% damage from all damage skills
+ - 75% chance of all targetted damage skills of failing.
+ * Should have fixed @refine applying multiple times to equipment that uses
+ multiple equip slots. [Skotlex]
+2006/07/19
+ * Fixed the inf code update breakage which was blocking all offensive
+ skills. [Skotlex]
+ * Added battle setting homun_critical_rate (defaults to 0) [Skotlex]
+ * Removed enemy_str/pet_str/enemy_perfect_flee and replaced them with
+ enable_perfect_flee which specifies which objects can have perfect flee and
+ enable_baseatk which specifies which objects can have a base attack value
+ (both in battle.conf) [Skotlex]
+ * Modified the targetted skill logic to enable offensive skills to be
+ targetted at party/guild members if the appropiate inf2 value is set.
+ [Skotlex]
+ * Added checks to make adding items to inventory/cart fail when a char is
+ in finalsave state. [Skotlex]
+ * Fixed parse_names on irc.c crashing when receiving a null argument.
+ [Skotlex]
+ * Modified the parsing of the names line, since some servers will send @
+ instead of = when separating the information. [Skotlex]
+ * Fixed the homun creation sql statement. Why noone else did so before?
+ [Skotlex]
+ * When enabling/disabling hiding/unhiding an npc, if the npc is a warp, it
+ will use clearchar and spawn packets instead of changeoption. Thanks to
+ Toms for the fix. [Skotlex]
+ * Corrected Trim chars to block 'enter', as explained by the Ultra mage.
+ [Skotlex]
+ * When the client passes account version 0, the login server will set it to
+ 1 now. [Skotlex]
+ * Corrected the HP bar scaling when HP is above Short Max. It should
+ display fine for any HP value now. [Skotlex]
+ * Added a check when the mob's adelay is shorter than the amotion, in which
+ case the adelay will be changed to the amotion value. [Skotlex]
+ * Some minor mapflag changes. [MasterOfMuppets]
+2006/07/18
+ * Added atcommand @partyoption, lets you alter the party item-distribution
+ type on the go. Usage is "@partyoption <pickup share> <item distribution>",
+ where both arguments can be 0/1, yes/no, etc. [Skotlex]
+ * Updated @changeleader and @partyoption to use msg_Athena entries.
+ [Skotlex]
+ * Added character 013 (enter) to the list of characters that are always
+ removed from new character names. [Skotlex]
+ * Fixed a crash when trying to extend TK's infinite combo feature. [Skotlex]
+ * Corrected Poison React to counter regardless of distance, and to use the
+ skill's 50+5*lv% counter chance (instead of 100%). [Skotlex]
+ * Corrected Venom splasher's splash damage [Skotlex]
+ * You now can't move/attack/use-skills when using Cloaking of a level less
+ than 3 [Skotlex]
+ * Fixed compilation of mercenary.c [Skotlex]
+ * Corrected Fog of Wall's "targetted spells fail 75% of the time" feature
+ by making it behave like GTB, that is, you just get a skill-failed on
+ cast-end, no skill-animation at all. [Skotlex]
+ * Added a proper check to make aggressive mobs never override homun targets
+ regardless of distance. [Skotlex]
+ * Removed a bunch of homun-related variables that are not needed at all.
+ The alive condition is removed, now the code checks for the hp value to
+ know if the homun is alive or not. [Skotlex]
+ * Cleaned up a bit the skill-id function, homun skill checks (such as delay
+ and skill-lv learned) should be correct now. [Skotlex]
+ * Added a proper check to make aggressive mobs never override homun targets
+ regardless of distance. [Skotlex]
+ * Fixed giving the 100% damage bonus when no-splash-targets are found in
+ the blown path to Grandcross instead of Bowling Bash. Bowling Bash damage
+ equation becomes then +50*lv% rather than +40*lv% when there's no
+ splash-damage (the 50*lv% figure is custom, all we know is that level 10
+ does 600% instead of 500% damage). [Skotlex]
+2006/07/17
+ * Updated mob_db.sql to current mob_db.txt data. [Skotlex]
+ * The char-server will allow off-line character saves when said char is
+ tagged for final-save (this is the scenario when the char-map reconnect).
+ [Skotlex]
+ * Should have fixed the Cart Termination damage code to be scaled correctly
+ when you change the max cart weight. Thanks to The Ultra Mage for the error
+ clarification. [Skotlex]
+ * Implemented Grandcross weird property where if there's noone on the path
+ it'll hit twice for the skill's reported damage, and when there is (or you
+ can't knockback the target) it'll do a splash attack that hits twice for
+ 500% to all affected targets. [Skotlex]
+ * Some cleaning of the combo code. TK Rankers will now get their combo-time
+ extended each time they trigger a kick, enabling them to do "unlimited
+ combos". [Skotlex]
+ * Modified the autosave function to use a sweep across the player db
+ instead of across connected clients. This will cause non-connected players
+ (like autotraders) to also be saved on a regular interval, may help with
+ possible data-loss from said characters on unclean shutdowns. [Skotlex]
+ * Removed the code that forces aggressive mobs to go after a Homun instead
+ of their master (no reason why there should be such a condition). [Skotlex]
+ * Some sign quest map flag updates [MasterOfMuppets]
+ * atcommand_follow is now more verbose. [Adam]
+ * Manually added int_homun.c to the VS8 char_sql project, *should* work [DracoRPG]
+ * Orn's fix to the very critical skill level up bug [DracoRPG]
+ * Updated mob_db.sql to current mob_db.txt data. [Skotlex]
+ * Added Orn's lil fix on homun [Vicious]
+ * Added Homunculus system, enjoy! [orn aka Nylou]
+ - WARNING: This currently only works with the SQL version, as the TXT char-server
+ has no code for it at the moment. You TXT server won't break, but the char-server
+ will complain of an unknown packet if you try to get an Homunculus
+ * Updated nomemo mapflags based on info from http://ro.doddlercon.com/images/memo.jpg [Poki#3]
+
+2006/07/15
+ * Small change in conf/battle/player.conf to say that 199 is max aspd allowed
+ (Haplo says that there are many reports of having over 200 is giving errors) [Evera]
+2006/07/13
+ * Kaahi no longer shows the heal effect to everyone. [Skotlex]
+ * Eska no will cause defense to change randomly every second. [Skotlex]
+ * Tuned up some more NJ_KAENSIN based on Tharis's information. [Skotlex]
+ * Corrected NJ_KAENSIN as per description. [Skotlex]
+ * Fixed a leaking map_freeblocklock on skill_del_unitgroup. [Skotlex]
+ * Changed the default save interval to 5 minutes. Added support for
+ specifying fixed save-intervals by using negative values. [Skotlex] EG:
+ - Save interval set to 300 (5 minutes): all characters will be saved in
+ equal time-slots, so that everyone is saved every 5 minutes regardless of
+ number of players online.
+ - Save interval set to -1000 (1000 ms): One character will be saved every
+ second, regardless of amount of characters online.
+ The new fixed-time-slots method is meant for larger servers, so that they
+ can control the saving-induced stressed on the char-server.
+ * Fixed @storeall and @charstoreall failing when the target character
+ already had the storage open. [Skotlex]
+ * Reverted temporarily the Cart Termination equation until it can be
+ fixed... [Skotlex]
+ * Fixed script command "recovery". [Skotlex]
+2006/07/12
+ * Fixed a small typo in my code [Zido]
+ * Added negative value in bonus exploit fix for more stat bonuses [Zido]
+ * Fixed exploit in pc_bonus there are no checks that check that the value being
+ added onto a status don't make it go below zero, which means if you have a mineral
+ card and reset stats it reduces your base attack to lower than zero, making it
+ go up to 64000. Fixed by adding a check for SP_BASE_ATK, although i recommend
+ doing it for other status bonuses also [Zido]
+ * Recoded NJ_BAKUENRYU to behave as I understand it best from the
+ skill-description (since Haplo told me this skill doesn't really has video
+ information or anything...) [Skotlex]
+ * Fixed NJ_TATAMIGAESHI to use ground-tiles rather than "for each in path"
+ calls. The skill should be working correctly now, except for the fact that
+ the correct "unit id" is missing (this is what would give the ground tile
+ it's correct display). Temporarily it is using 0xba until the correct value
+ is found. [Skotlex]
+ * Added back the undead check to turn undead/resurrection to prevent
+ damaging non-undead targets, removed it from the battle damage section.
+ [Skotlex]
+ * Resurrection will now silently fail when used on non-undead + not-dead
+ characters. [Skotlex]
+ * Poem of bragi/magic String's base delay reduction at level 10 (or above)
+ is now 50% instead of 3*lv%. [Skotlex]
+ * status_damage will no longer fail when the target is not on a map AND the
+ flag is 2 (charge rather than damage). Fixes SP-draining status changes
+ ending suddenly when in-between maps. [Skotlex]
+ * Fixed the IP value being apparently incorrectly casted before inserting
+ into the loginlog table on "connect success" events. [Skotlex]
+ * Fixed Cart Termination's damage. [Skotlex]
+ * Added the missing check to remove character from memory when logging out
+ and using the charsave_method which saves character map-server-side.
+ [Skotlex]
+2006/07/11
+ * Fixed inverted check which was preventing you from buying more than 1
+ from any stackable item.... [Skotlex]
+ * Should have fixed the crash in intif gm message... [Skotlex]
+ * Fixed GTB card only working while you had a status-change active.
+ [Skotlex]
+ * Fixed being unable to compound cards in armor. [Skotlex]
+ * Made @monsterignore be an universal ignore. Means you cannot be targetted
+ as an enemy by anything. Also added alias "@battleignore" which does the
+ same as monsterignore. [Skotlex]
+ * Fixed magic power setting your min matk as max-matk. [Skotlex]
+ * Modified the packets involved in @fakename in hopes it'll refresh
+ correctly on nearby clients now. [Skotlex]
+ * Fixed clif_parse not checking for func_parse before sending data to the
+ connected clients. This in turn required various code-rewrites in: [Skotlex]
+ - duel related messaging functions (added clif targets DUEL/DUEL_WOS).
+ - intif whisper to gm function
+ - day/night timers
+ - Rewrote the parse_console function to stop allocating/deallocating memory
+ on every call.
+ - Modified chrif_charselectreq to receive the player's ip among the data.
+ * Added function clif_disp_message, which is the same as
+ clif_disp_onlyself, except you can specify the targets (it sends a
+ guild-chat packet) [Skotlex]
+ * Fixed the subele bonus (elemental reduction) being applied to the element
+ of the attacker instead of the element of the attack. [Skotlex]
+ * mob skills now won't trigger on unit_stopwalking calls. [Skotlex]
+ * Coded @reset. [Skotlex]
+ * Reenabled @changesex [Skotlex]
+ * Added function pet_create_egg which handles creating pet eggs correctly
+ (when passed item id is indeed a valid petegg). Applied this on @createitem
+ and getitem. [Skotlex]
+ * Cleaned up code of @item [Skotlex]
+ * Cleaned up the itemdb_isequip functions. itemdb_isequip will now return
+ if the item is equipable by players, itemdb_isstackable returns if the item
+ can be stacked, and itemdb_isidentified returns if the item should drop
+ identified. [Skotlex]
+ * Added defines CARD0_PET/CARD0_FORGE/CARD0_CREATED to identify if a given
+ item has "invalid" cards, added define function itemdb_isspecial to
+ simplify this check. [Skotlex]
+ * Removed itemdb.c considering item ids above 20000 as invalid. [Skotlex]
+ * Cleaned up script commands getitem and card-counting related ones.
+ [Skotlex]
+ * Cleaned up a bit more pc_isequip [Skotlex]
+ * Added script function warpportal(x,y,targetmap$,targetx,targety).
+ This creates warp portals as in the skill unit as a volatile alternative
+ to static warp portals. [blackhole89]
+ * Modified the login-sql server to do the ip-ban check only on the
+ auth-packets instead of on every packet. [Skotlex]
+2006/07/10
+ * Corrected Warp Portal being unable to warp people who are standing on it
+ on the moment it triggers. [Skotlex]
+ * Fixed @follow stopping the moment you are warped. [Skotlex]
+ * Fixed pc_additem messing with the equip field of the passed item data.
+ Fixes the famous "equip stuff on your arrow slot" bug. [Skotlex]
+ * Fixed cart-termination crashing the server if you used level 16 of it.
+ [Skotlex]
+ * Fixed check_connect_login_server check in char-sql server. Fixes
+ char-server not reconnecting to the login server. [Skotlex]
+ * Login-sql server will no longer change an account's state to "7" when
+ banning a player. This should fix being able to use @ban to clear out a
+ @blocked player. Players will now be identified as banned only through the
+ banned-until timestamp. [Skotlex]
+ * Fixed a crash when using Gospel... [Skotlex]
+ * The on-place function won't be invoked on setting ground skills if the
+ group's tick is greater than the current tick. As Buuyo pointed out, this
+ should fix Sanctuary and Gospel taking effect inmediately instead of after
+ "x" amount of ms as they should. [Skotlex]
+ * Added login-char packet 0x2737. Sets all characters offline (login-server
+ side). [Skotlex]
+ * Cleaned up char server "set all offline" implementation to remove only
+ characters from the map-server from which the packet was invoked. It will
+ also now correctly kick/set-character offline from the map-server if they
+ are connected. [Skotlex]
+ * Cleaned up the char-sql reconnect code. It no longer sets everyone to
+ offline. [Skotlex]
+ * Removed setting "kick_on_disconnect", servers will no longer kick
+ characters out when there's a disconnection. Instead, it'll use the most
+ logical approach: Set characters into a "lost" state when there's a
+ disconnection, on reconnect, resent the list of online-characters, do a
+ sync, and let the difference be characters to be removed. Also, the
+ map-server won't release character data until it's saved and the ack
+ returns from the char-server to prevent data loss (all this data is resent
+ on reconnect for saving anyway). [Skotlex]
+ * Added a check in pc_equipitem so that when switching weapons and you have
+ the skill_range_by_weapon setting active, the skill info block (which
+ includes range) will be resent when the new weapon to equip has a range
+ different than the previous one. [Skotlex]
+ * One closer inspection, removed that clear in itemdb_reload for a foreach
+ call again. And modified itemdb_load to scrap the dummy item entry from the
+ item_db and replace it with proper data for the item. [Skotlex]
+ * itemdb_reload will clear the itemdb before reloading info instead of only
+ clearing the scripts now. [Skotlex]
+ * Some cleaning of skill_castend_pos2, fixed Gospel, and a
+ map_freeblock_unlock misplacement. [Skotlex]
+ * Sense/Estimation will now display the mob info window to all party
+ members in the same map. [Skotlex]
+2006/07/08
+ * Fixed the new addeff structure not working well with SC_STONE (because
+ SC_STONE is 0, which was by default not handled as a valid value).
+ [Skotlex]
+ * Added back the TF_MISS walking speed bonus to assassin type classes (how
+ did that got lost?) [Skotlex]
+ * Fixed mobinfo displaying exp as signed ints rather than unsigned.
+ [Skotlex]
+ * Added status_check_visibility to check if an object is within range of
+ view of another. Nothing more, nothing less. It's used by unit movement to
+ check whether you can continue chasing your target or not when the "chase
+ target" directive is given. [Skotlex]
+ * Fixed the char table having party/guild_id as smallint when they need int
+ there. Thanks to hermematon for pointing it out (use svn_ugprade7580.sql)
+ [Skotlex]
+ * Applied k3dt fixes to pet-hatching, ice-wall check, and wedding skills.
+ [Skotlex]
+ * Fixed endow skills calling the skill no damage packet twice. [Skotlex]
+ * Fixed a crash on warpwaitingpc when the chat-room is empty. [Skotlex]
+2006/07/07
+ * Fixed the Warm Skills [Skotlex]
+ * Removed the debug message when a player logs out and is removed from
+ memory, it is working fine (tested normal logging off and autotrade). [Skotlex]
+ * Corrected the pet-armor field of the pet not being updated on
+ equip/unequip of accessories, making them not show up inmediately. [Skotlex]
+ * Status_calc_bl will no longer stop you from attacking/walking when the
+ mode is changed unless the new mode no longer includes
+ "can-attack"/"can-move" respectively. [Skotlex]
+ * Should have fixed clif_item_sub to properly store pet egg/armor data.
+ There should be no more "random refine levels" bugs related to these.
+ [Skotlex]
+ * itemdb_exists will now return NULL for item_id 0. [Skotlex]
+ * Added a check to free a character from memory when changing map servers.
+ [Skotlex]
+ * Okay, added a chrif_save_ack packet to the char-server so now the map
+ server will know once a character was "final saved", and only then the
+ character will be removed from memory. On char-server reconnection, all
+ chars that are in final-save state are resent to save (if they are still in
+ memory, it's because the ack hasn't gotten here from the char-server). This
+ should effectively block all dupe problems due to heavy inter-server lag,
+ however as it's untested, it currently prints some debug messages when
+ people are saved and then removed from memory. Need testers so this can be
+ debugged and merged to stable! [Skotlex]
+ * Now, when the login-char connection is cut, the char-server won't set
+ everyone offline on reconnect, instead it will send the list of online
+ accounts to the login server. [Skotlex]
+ * Modified the error on the char-sql server to set chars online when it
+ receives a save packet from a character tagged as offline (until it can be
+ figured out why this is happening) [Skotlex]
+ * Fixed signed/unsigned comparison issues in the char txt/sql server.
+ [Skotlex]
+ * Fixed the cooking success chances. Thanks to Ishizu Chan. [Skotlex]
+ * Added a temporary band-aid to prevent executing the script of non-arrows
+ when they are equipped on the arrow-slot (until the actual cause of why
+ pc_unequipitem is not working correctly is discovered/fixed) [Skotlex]
+2006/07/06
+ * Modified the party_data structure on the map server to remove some
+ redundant data. Added a party_data structure on the char-server to hold a
+ more complete set of information about parties. Added to the party_member
+ structure the class of each member so that the map server can do the
+ appropiate checks even if the character is on another mapserver/offline.
+ Due to the format changes in the party structure, txt servers will have to
+ wipe their party file... (sql save format has not been changed) [Skotlex]
+ * Added function char_family to check if there's a family state given the
+ three character ids, instead of doing individual checks all the time.
+ [Skotlex]
+ * Rewrote all the item restriction functions so that they will take into
+ account slotted card restrictions as well. [Skotlex]
+ * Added no_skill_delay setting, when set, affected object types will have
+ the minimum skill delay for all skills. Defaults to mobs, since they
+ don't have skill delays. [Skotlex]
+ * Cleaned up pc_equipitem. When dual wielding or equipping accessories, if
+ the client actually specifies one of the two positions, it will be taken
+ into account (now, does the client actually does this?) [Skotlex]
+ * Fixed GrandCross and similar skills. [Skotlex]
+ * FogWall will now also affect the caster. [Skotlex]
+2006/07/05
+ * Updated NJ_KAENSIN by Saycyber21 [Vicious]
+ * Updated @refine to take account of MAX_REFINE, thanks to Omega... GM
+ Designer. [Skotlex]
+ - Also optimized the @refine loop for better performance.
+2006/07/04
+ * Fixed compile issue for NJ_BAKUENRYU, by Saycyber21. [Vicious]
+ * Implemented Saycyber21's some NJ work. Untested. :D [Vicious]
+ * Implemented cooking chances. Chance of success is 70% - 7*(dish-lv)% +
+ 12*(cooking set-lv)%. Exception: When using the legendary cooking set,
+ success chance is 100% regardless of dish. [Skotlex]
+ * Added battle config setting emergency_recall, specifies behaviour of that
+ skill (skill.conf): 0 - Disabled. 1 - can't be used in nowarpto maps. 2 -
+ Can be used everywhere. [Skotlex]
+ * Removed the NPC/Dance/Song inf2 check of AbraCadabra. whether a skill can
+ come out or not is entirely decided by the abra db file now. [Skotlex]
+ * Added structure s_addeffect to handle status change additions. Cleaned up
+ relevant code. It is now possible to specify ANY status change, not just
+ the basic ones. NOTE that the code is proof-read, but untested! [Skotlex]
+ * Added support for bonus3 bAddEff/bAddEffWhenHit as follows: [Skotlex]
+ bonus3 bAddEff/bAddEffWhenHit, <SC value>, <rate>, <target flag>.
+ Target flag is 0: Self. 1: Enemy. 2: Both.
+ * Added these descriptions to doc/item_bonus.txt [Skotlex]
+ * Added a check when joining a chat to make sure the target object is of
+ type BL_CHAT. [Skotlex]
+2006/07/03
+ * Cleared up the bAutoSpellWhenHit description in doc/item_bonus.txt
+ [Skotelx]
+ * Fixed Phantasmic Arrow and Magical Bullet not being correctly tagged as a
+ ranged arrow-type attack. [Skotlex]
+ * Updated help.txt and help2.txt, thanks to Inuyasha for providing the
+ updated files. [Skotlex]
+ * Char-server SQL won't perform the reconnect cleanup routines when
+ kick_on_disconnect is disabled. [Skotlex]
+ * Renamed summons_inherit_effects to summons_trigger_autospells as the
+ setting now only makes the attacks of the slaves trigger the autospells of
+ the master (as it should be). [Skotlex]
+ * Corrected code capping no_spawn_on_player to 50 when the max should be
+ 100. [Skotlex]
+ * Warmth will dispel when warping now (or else the effect is left on the
+ ground) [Skotlex]
+ * Fixed reading of the refine_db not working right when MAX_REFINE is
+ increased from 10. [Skotlex]
+ * Some more cleaning to the implementation of Abracadabra [Skotlex]
+ * Fixed a compile warning in login sql/txt [Skotlex]
+ * Fixed pc_makesavestatus not setting your logout position. [Skotlex]
+ * Fixed two dances becoming BA_DISSONANCE instead of DC_UGLYDANCE.
+ [Skotlex]
+ * Added the missing +100% damage modifier of Enchant Deadly Poison.
+ [Skotlex]
+ * Fixed SkillStatusChangeTable not working correctly for Homun/Guild
+ skills. [Skotlex]
+2006/06/30
+ * Fixed a typo in msg_athena.conf, "This item cannot be drop" -> "This item cannot be dropped" [MasterOfMuppets]
+ * Added a check to prevent equipped items from being traded. [Skotlex]
+ * Added UF_SONG (0x400) to differentiate songs from dances. [Skotlex]
+ * Added preliminar support for making a Song+Dance turn into BA_DISSONANCE
+ cells. Beware of potential bugs as it's untested. [Skotlex]
+ * Added mapflag "nochat" to prevent chatting rooms from being created.
+ [Skotlex]
+ * Corrected some of the sleep checks when the char id does not matches with
+ the char-id expected by the script engine. [Skotlex]
+ * Cleanup in itemheal related code, fixed the item heal group bonus not
+ working on Groups beyond 7. [Skotlex]
+ * Fixed pet's loot not being moved to your inventory on logout. [Skotlex]
+2006/06/29
+ * Made the map server send list of characters online to the char-server on
+ reconnection regardless of "kick_on_disconnect" setting, as otherwise, a
+ temporary disconnection would make the char-server tag all characters
+ offline and refuse to save them afterwards. [Skotlex]
+ * Fixed guild storage being "eternally in use" if you quit/logout before
+ closing it. [Skotlex]
+ * Ending SC_CLOAK/SC_HIDE/SC_CHASEWALK will now trigger ontouch npcs.
+ [Skotlex]
+ * [Fixed]
+ - Scripting system screwing up script position after mixing timers with menus.
+ - NPC attached AI mobs display as alive when dead.
+ - View data not updating after buildin_unitdeadsit.
+ [Improved]
+ - NPCE_LOADMAP to execute after all (area) objects are sent to the player.
+ - Simplified scripting system. sd will now use pointer to the script state itself.
+ [Lance]
+
+2006/06/28
+ * changed:
+ dynamic_pass_failure_ban_how_many:from 3 to 7
+ dynamic_pass_failure_ban_how_long:from 60 to 5
+ as in official servers. [Musashiden]
+ * Added a check in script command "set_option" so that invoking
+ "set_option(0)" removes Cart/Peco/Falcon, as expected by scripts. [Skotlex]
+ * Added trade-range check on trade start. [Skotlex]
+ * Added inf2 4096 (INF2_ALLOW_ENEMY) which is to be used in conjunction
+ with INF2_PARTY_ONLY/INF2_GUILD_ONLY when said skill should ALSO be allowed
+ to be used on enemies. [Skotlex]
+ * Cleaned up a bit the code for @item [Skotlex]
+ * Fixed character/storage being sent to be saved TWICE when you logged out
+ while the storage is opened. [Skotlex]
+ * Added save_settings map config. Specifies after which events do
+ characters get saved (defaults to all): 1 - Trade successful, 2 - Vending
+ transaction, 4 - Closing storage/guild storage, 8 - hatching a pet.
+ [Skotlex]
+ * Changed the mob drop rate adjust function to receive a signed int
+ argument. Probably will fix those drops with 0% becoming 100% [Skotlex]
+ * Corrected Musical Strike having a different damage equation from Throw
+ Arrow. [Skotlex]
+ * Added state rewarp to players. It gets set when a pc_setpos call is
+ triggered while the player is changing maps so that when the player finish
+ loading the map, it is inmediately rewarped to where it has been
+ rewarped/recalled to. [Skotlex]
+2006/06/27
+ * Map server will now resent the whole list of online characters to
+ char-server on reconnect when the kick_on_disconnect setting is active.
+ [Skotlex]
+ * Cleaned up and optimized the IP sync code. New login_athena config
+ setting sync_ip_interval specifies how often to sync the ip. The default is
+ 0 (disabled). [Skotlex]
+ * Added mapflag "loadevent", now load-map script events will ONLY trigger
+ on maps with this mapflag on, rather than every map. [Skotlex]
+ * High Jump can now be used in all versus maps. [Skotlex]
+ * Added Kaite's opt3 value, taken from jA [Skotlex]
+ * Added state dirty == 2 to storages. Signals when a storage was sent for
+ final saving. Said storage is removed from memory after the ack from the
+ char-server, and they are sent to save if the map/char servers reconnect
+ before the ack arrives. In short: they are guaranteed to be saved after a
+ char logs out. [Skotlex]
+ * Put pay_arche.gat in the "no experience lost" mapflag file. [MasterOfMuppets]
+2006/06/26
+ * Corrected the element of hunter traps. [Skotlex]
+ * Deadly Poison now also reduces def2 by 25% [Skotlex]
+ * Cleaned up a bit skill_moonlit, Moonlit Petals should work correctly now.
+ [Skotlex]
+ * Fixed @mi displaying always 0 instead of the mob's class. [Skotlex]
+ * Rough implementation of Ground Drift according to description and jA
+ info. [Skotlex]
+ * Implemented Tatami Gaeshi using skill description and jA implementation
+ for reference. [Skotlex]
+ * Merged Mitternacht's max_heal/max_heal_lv config settings. [Skotlex]
+ * Removed support of packet 0xc3 on the new packet versions. Thanks to
+ Meruru for pointing out they aren't being used anymore. [Skotlex]
+ * Autospells will now again check for the skill's nk value, so that skills
+ tagged "nodamage" skills will not trigger autospells. [Skotlex]
+ * Corrected clif_item_sub so that pet eggs will correctly be sent as
+ equipment (fixes them showing up "broken" and with random refine levels)
+ [Skotlex]
+ * [Added]:
+ - buildin_unitkill just for kicks. [Lance]
+
+2006/06/23
+ * [Optimized]:
+ - Setting of variables with defined scope in some frequently executed script
+ events.
+ [Added]:
+ - Missing script_require_trigger flags for some power hungry events.
+ * Updated mob_db.sql and item_db.sql to latest. [Skotlex]
+ * Modified pc_setoption so that it will correctly update sprite AND clothes
+ color when mounting/unmounting changing into/from xmas/wedding sprites.
+ [Skotlex]
+ * Allowed itemdb_exists to return the dummy item. Enables "invalid" items
+ to be sold, traded, dropped, etc. [Skotlex]
+ * Corrected ASC_BREAKER. Int-based damage is applied after attribute fixes
+ and before card reductions. The skill now completely disregards left
+ hand weapon. [Skotlex]
+ * Standarized PF_MEMORIZE to be 50% cast time on all skills (instead of
+ -50% for targetted skills and -66% for ground skills >.>) [Skotlex]
+ * Cleared up the comment on what item_check does and how it works.
+ [Skotlex]
+ * Changed setting for skill_nocast flag 16. It is no longer a "pk-mode map"
+ setting, it's now a clone-forbidden skill. That is, skills with the flag 16
+ will never be copied by clones. If you use a PK-mode server, use flag 2 now
+ to forbid skills from common maps. [Skotlex]
+ * Default skills from not being cloned are Magnus Exorcism and Turn Undead.
+ * The map search free cell will now use the size of the map # of tries
+ before giving up when the spawn area is the whole map. Added a check to
+ inmediately give up when the number of spawn retries has reached the max
+ specified (no_spawn_onplayer = 100). [Skotlex]
+ * Cleaned up a bit the clone code to account for the unit flags
+ UF_NOPC/UF_NOMOB when the skill is not ground-based (accounts for self
+ skill that causes a ground-tile to be placed, like Dances). [Skotlex]
+ * Added pc_bonus_autospell_del, gives support for removing autospell
+ effects. When a negative rate is specified, it will decrease the chance of
+ casting (eg: You have two different cards with autospell Heal +20% each,
+ then do autospell -30. The second card will be cancelled, and the first one
+ will become Heal +10%) [Skotlex]
+ * npc_timers now will not restore the previous timer data when there's no
+ players attached (when it's strictly an npc timer). This should reenable
+ the old behaviour of getnpctimer returning the total ellapsed time since
+ "startnpctimer" even after the last label has been reached. However, this
+ behaviour won't apply to player-attached timers. [Skotlex]
+ * [Fixed]:
+ - MAPREGSQL overloading SQL table with temperory map registries.
+ - Incorrect perfomance calculation for MAPREGSQL loading and saving. [Lance]
+
+2006/06/22
+ * Guessed and added support for the packets 0x22a (idle) and 0x22b (spawn).
+ This should complete the required packets for PACKETVER 7. [Skotlex]
+ * Added support for the PACKETVER 7 packets in the "dummy" current
+ intravision implementation. [Skotlex]
+ * Fixed @autoloot being off by 0.01% when entering a manual value.
+ [Skotlex]
+ * Restored the "Secret" behaviour of Blast Mine and Claymore Trap where
+ each target is hit N times (where N is the number of mobs in the splash
+ area at the moment of triggering). [Skotlex]
+ * Updated the tools/stackdump script to also handle sig-plugin generated
+ backtraces. Now it will also auto-determine whether the exe needs a .exe at
+ the end or not. Help me test it as I want this script on stable NOW :X
+ [Skotlex]
+ * Usage is "stackdump <login/char/map> <txt/sql> [number]". When a number
+ is given, sig-plugin stackdumps are assumed, otherwise it parses the normal
+ stackdump as before. [Skotlex]
+ * Corrected autoloot so that you can specify rate with decimal precision
+ ("@autoloot 0.01" should work) [Skotlex]
+2006/06/21
+ * [Removed]:
+ - Redundant mob name copying. (it's already copied in mob_parse_dataset) [Lance]
+ * [Fixed]:
+ - Compilation warnings and errors.
+ [Improved]:
+ - Changed and moved IP sync status messages to elaborate more. [Lance]
+ * Tested and fixed resolve_hostbyname. Applied said function around most of
+ the code where needed. Removed includes for the OS/network system pretty
+ much from every file (our socket.c file should handle this) [Skotlex]
+ * Made the GM mute request bypass the manner_system setting. [Skotlex]
+ * Applied use of parse_hostbyname() in chrif.c to fix compilation errors.
+ [Skotlex]
+ * status_percent_change will now account for when the target's max hp/sp is
+ above INT_MAX. [Skotlex]
+ * [Added]:
+ - DNS (WAN) sync for those pesky disconnections (dynamic ip renewal). [Lance]
+2006/06/20
+ * Some cleaning up of OPTION related code. OPTION_XMAS and OPTION_FLYING
+ really ARE the same value clientside! (totally stupid), therefore I've
+ opted from removing the flying animation since it really just displays as
+ Xmas for others (and the correct fix involves adding a bunch of
+ class-change packets...) [Skotlex]
+ * Updated skill_require_db to place the Zeny requirements of ZenyNage and
+ Fling. [Skotlex]
+ * Fixed crash when non-players use ZenyNage. Added the correct Zeny check
+ in skill_check_condition, fixed the skill so that it's damage is based on
+ whatever zeny is specified in skill_require_db. [Skotlex]
+ * Can-act delay will not be reset when warping now. [Skotlex]
+ * Fixed Quagmire not altering walking-speed. [Skotlex]
+ * Silence now blocks skills both on begin/end casting. [Skotlex]
+ * Updated status_calc_bl so that when walking speed changes, the character
+ is made to rewalk so that the new speed takes effect inmediately. [Skotlex]
+2006/06/19
+ * Added Ayothaya to nopenalty and nopvp mapflags. [Evera]
+ * Combo-used Skills with State "move_enable" will now override the "can't
+ move delay". Fixes Break-Fall -> Jump-Kick. [Skotlex]
+ * Some more cleanups of battle_calc_damage to account for absorbed damage
+ reductions. [Skotlex]
+ * Moved back Soul Drain code from mob_dead to skill_counter_additional_effect.
+ Now we are back to where the skill animation does not shows, but you DO
+ get SP T.T' [Skotlex]
+ * Some cleanups and corrections in battle.c to account for negative
+ (absorbed) damage. [Skotlex]
+ * Fixed fame-list updating crashing char-sql server when the given char-id
+ just got into ranking. [Skotlex]
+ * Added missing Arunafeltz maps with information from NLZ [Evera]
+2006/06/18
+ * [Fixed]:
+ - Typo in status.c add_sc() using 'skill' instead of 'sk' as index, resulting in
+ filling the SkillStatusChangeTableArray with junk data.
+ - > NEEDS CONFIRMATION < Ends casting if player is knocked with freezing/stun/whatever
+ - Typo in parse_frommap. [Lance]
+ * [Fixed]:
+ - clif_initialstatus using SHRT_MAX instead of USHRT_MAX for status_point.
+ * [Temperory Fixed]:
+ - Crashing of SQL char-server in parse_frommap case 0x2b01. [Lance]
+ * [Removed]:
+ - Large part of scripted mob control commands are removed.
+ - Large part of scripted player control commands are removed.
+ - Scripted mob slaves changing master ID.
+ [Added]:
+ - Unit control commands.
+ - CALLBACK_NPCCLICK for scripted mobs, added this to db/const.txt too.
+ - Macro RECURSIVE_MASTER_CHECK in battle.c
+ [Modified]:
+ - buildin_skilluseid and buildin_skillusepos -> buildin_unitskilluseid
+ and buildin_unitskillusepos.
+ - md->callback_flag to short (double word). [Lance]
+
+2006/06/17
+ * Devotion absorbed damage will now appear to come from oneself (instead of
+ the original attacker changing directions towards the Crusader) [Skotlex]
+ * Updated clif_refres to send inventory, cart, and weight info. [Skotlex]
+ * Fixed intif_guild_memberinfoshort to not leave a dangling pointer when
+ someone logs out <.< [Skotlex]
+ * Changed some mapflags related to the eye of hellion quest. [MasterOfMuppets]
+ * [Added]:
+ - buildin_checkcell, buildin_mobwarp, buildin_pcattack.
+ [Improved]:
+ - buildin_skilluseid and buildin_skillusepos to accept a few more arguments.
+ - mob_script_callback to return sucess value [Lance]
+ * Fixed the party HP packets to send max HP 10000 and scale HP accordingly
+ when the player's HP doesn't fits in the packet's field. Fixes HP bars not
+ correctly displaying the % of life when max HP is above 32k. [Skotlex]
+
+2006/06/16
+ * Fixed option value being reset'ed on login (fixes cart/peco/falcon being
+ lost) [Skotlex]
+ * Corrected @speed to alter your base speed instead of battle one. Means
+ the change remains for much longer (until status_calc_pc is invoked, which
+ could be due to equipping/unequipping stuff) [Skotlex]
+ * Modified the bNoMagicDamage/bNoWeaponDamage bonuses to be a 0-100
+ setting. Meaning you can do bonus bNoMagicDamage,50; To make all magic
+ damage be reduced by half. This bonus stack, so two cards with
+ bNoMagicDamage,50 will give magic immunity. [Skotlex]
+ * Removed setting gtb_pvp_only and replaced it with gtb_sc_immunity which
+ specifies the threshold before the bNoMagicDamage starts blocking support
+ statuses as well. ie: gtb_sc_imunity: 75 will mean that "bonus
+ bNoMagicDamage,70;" reduces magic damage by 70%, but does not blocks heal
+ or support status, while "bonus bNoMagicDamage,80;" does. [Skotlex]
+ * Removed db_tables.sql as it's no longer used. [Skotlex]
+ * the mvp_sd is removed when the mob is the emperium and there's no
+ killer/exp-awarded (assumed killed by script), this prevents the on-kill
+ event from triggering and giving the castle to whoever damaged the most the
+ emperium without destroying it. [Skotlex]
+ * [Added]:
+ - Custom slave mobs to inherit the callback_flag.
+ - Added option #25 to buildin_setmobdata to set the callback_flag. [Lance]
+ * [Improved]:
+ - Cleaned up Custom Mob Script Callback codes. Looks much better now :B. [Lance]
+
+2006/06/15
+ * [Fixed]:
+ - intif_parse_RenamePetOk for not compatible with ANSI-C initialzation specification.
+ [Lance]
+ * Added indexes for loginlog and ipbanlist as they did not have any.
+ (note, someone already put the index on loginlog on trunk.) [Euph]
+ * Merged Adam's patch to let the char-server handle validation of
+ pet-name-change requests through the allowed char letters config. [Skotlex]
+ * Fixed "wedding_ignore_palette: yes" not working when relogging with the
+ gear already equipped. [Skotlex]
+ * Added blocking of the Kick skills when you are a Soul Linker. [Skotlex]
+ * Added enabling to turn off a kick-stance regardless of class. [Skotlex]
+ * Altered a bit how status_set_viewdata behaves in regards to Wedding/Xmas
+ options. [Skotlex]
+ * Added back OPTION_XMAS, but the actual value is missing! [Skotlex]
+ * Corrected chrif_save so that the player is not set offline on map-change.
+ [Skotlex]
+ * Added change-look support in pc_setoption when specifying OPTION_XMAS
+ [Skotlex]
+ * Fixed clif_parse_RemoveOption removing all options instead of just
+ Falcon/Cart/Peco [Skotlex]
+ * Fixed clif_send not sending packets to SELF when specifying AREA if the
+ source is not on the map yet. [Skotlex]
+ * Fixed and cleaned up script command 'equip' [Skotlex]
+ * Fixed 'autoequip' items. [Skotlex]
+ * Fixed Aspd not being updated in your status window after Agi/Dex
+ increasing statuses take effect. [Skotlex]
+2006/06/14
+ * Fixed map_nick2sd so that searching for "Adam" will not match a char
+ named "Adam Smith". Thanks to Adam for reporting it out. [Skotlex]
+ * Modified how luk reduces status changes by reducing the gap. Eg: resist =
+ vit; resist += (max - resist)*luk/300; [Skotlex]
+ * Added battle settings pc_max_sc_luk/mob_max_sc_luk to handle which is the
+ luk threshold at which you gain inmunity (defaults to 300). [Skotlex]
+ * Fixed buildin_getmobdata. It was trying to handle the first parameter as the
+ array to fill in. [blackhole89]
+ * Blocked again skill usage during marionette. [Skotlex]
+ * Fixed main.sql adding a key on char_id rather than account_id for the
+ char table. [Skotlex]
+ * Cleaned up character saving in char-sql, it no longer needs to query the
+ database to see if the player exists on each char-save, instead it checks
+ the received data against the online-players db. No such fix is required
+ for char-txt. [Skotlex]
+ * Added an error message on the char-server when the received player data
+ size does not matches with the expected size (should avoid the crash that
+ happens on such a memcpy). [Skotlex]
+ * [Improved]:
+ - script_save_mapreg for MapregSQL Saving to display perfomance only in slow
+ queries. [Lance]
+2006/06/13
+ * Updated mob_db.sql and item_db.sql to latest. [Skotlex]
+ * Added account_id index to char table. Thanks to Buuyo for reporting it.
+ Sql users apply upgrade_svn7146.sql NOW. [Skotlex]
+ * Marionette and Devotion will now check raw distance and ignore obstacles
+ and the like. [Skotlex]
+ * Added irc_channel_pass setting and prevent crashing when irc server
+ lookup by host fails. Thanks to Trancid for the details. [Skotlex]
+ * [Fixed]:
+ - clif_parse_GetCharNameRequest displaying false alarm for legitimate GM snooping.
+ [Lance]
+ * Added support for reading correctly status change data from Guild and
+ Homun skills. [Skotlex]
+ * Added support for reading Homun skill data (which means the HM skills are
+ now safe to add to skill_db, skill_require_db, etc) [Skotlex]
+ * Oppositions can't be made during WoE now. [Skotlex]
+ * Fixed a few compiler warnings from VC [Skotlex]
+ * Commented out the Homunculus Skills<->Status Change link which was
+ causing some memory corruptions. [Skotlex]
+2006/06/12
+ * [Fixed]:
+ - buildin_npcshopitem not allocating extra 1 block of terminator.
+ [Added]:
+ - Modified versions of Dj-Yhn's buildin_npcshopdelitem and buildin_npcshopadditem
+ [Lance]
+ * Updated clif_disp_onlyself to not use dynamic memory and write directly
+ to the player's buffer. [Skotlex]
+ * Updated @noask to also tell the user what he has just rejected (added
+ msg_athena entries for each of the different requests). Also updated it to
+ use clif_disp_onlyself. [Skotlex]
+ * Fixed a pair of missing initializers in the clif storage functions.
+ [Skotlex]
+ * @heal no longer displays a healing animation. Fixes the client believing
+ you couldn't be healed more than 32K. [Skotlex]
+ * Now you can use any skills (except encore/dancing ones) while under
+ Longing for Freeding. [Skotlex]
+ * Now you can use any skills while under Marionette Control. [Skotlex]
+ * Fixed npc_checknear's distance check returning the opposite of what it
+ should (false when the range is correct and viceversa) [Skotlex]
+ * Added a warning on item loading when an item is of equippable type but
+ has no equippable position. [Skotlex]
+ * Turning an alliance to an opposition won't work now during WoE [Skotlex]
+ * Slaves can summon other mobs now. The only ones who can't do this are
+ player summoned mobs. [Skotlex]
+ * Merged the following functions for faster processing of items: [Skotlex]
+ clif_storageitemlist + clif_storageequiplist = clif_storagelist
+ clif_guildstorageitemlist + clif_guildstorageequiplist = clif_guildstoragelist
+ clif_itemlist + clif_equiplist = clif_inventorylist
+ Note that the changes are a bit substantial and need proper testing!
+ * Increased max knockback value support to 25. [Skotlex]
+ * [Optimized]:
+ - buildin_npcshopitem memory allocation to calculate before reallocating.
+ [Lance]
+ * Made guild member exp an unsigned int. [Skotlex]
+ * Various cleanups to the npc clicking related functions. Should fix quite
+ some possible crashes from crafted packets. [Skotlex]
+ * Added overflow checks for bonus settings mdef_rate/def_rate. [Skotlex]
+ * Added missing update of INT after a buf. [Skotlex]
+ * Small cleanup of how SC_BLEEDING works. [Skotlex]
+ * Fixed party_foreach_samemap invoking the function on the CASTER instead
+ of on the party members. [Skotlex]
+ * Modified clif_parse_NpcClicked to handle the different situations with
+ different bl-objects (attack on players/mobs, click on npcs or mobs with
+ npc attached) [Skotlex]
+2006/06/09
+ * [Fixed]
+ - Compilation warnings on guild.c and int_guild.c [Lance]
+ * Added structure party_data and party_member_data to the map server to
+ hold party-specific required information about parties including
+ Monk/TK/SG/SN states and party member count. Family information is still
+ missing, and handling of the state should probably be done by the
+ char-server, too... [Skotlex]
+ * party Hp updates are no longer done each time the Hp is modified, but
+ together with the party xy timer. It means HP-bars will be a bit delayed
+ before being updated, but packet consumption should be much less during
+ heated battles. [Skotlex]
+ * Fixed MoM's typo [Vicious]
+ * Fixed map_readafm missing strcpy(afm_name, m->name). [Skotlex]
+ * [Improved]:
+ - npc_click interception on BL_MOB and BL_PC to let sd act accordingly.
+ [Lance]
+ * [Fixed]:
+ - Execution of sleep/sleep2 more than once will hang the script_state.
+ [Lance]
+ * Fixed @mapinfo displaying incorrectly maps with nosave which send you
+ back to your last savepoint. [Skotlex]
+ * Moved guild_exp_rate from a mapserver battle config setting to a char
+ server config. It no longer modifies the total taxed exp as seen on the
+ guild information window, but directly modifies the exp that the guild
+ earns. [Skotlex]
+ * Added an error report and correction when the map server receives a guild
+ from the char-server with more guild members than MAX_GUILD. [Skotlex]
+ * Changed the interval between waterballs back to 125 [MasterOfMuppets]
+ * Fixed a typo in char_sql/char.c, thanks to Euph [MasterOfMuppets]
+2006/06/08
+ * Modified guild exp to be an unsigned int rather than a signed one.
+ [Skotlex]
+ * Fixed @skilltree printing out Unknown job for most targets used.
+ [Skotlex]
+ * Cleaned clif_pvpset to not send the packet to nearby characters when the
+ source is GM-hidden. May help fix the crash on PvP with gm-hidden
+ characters. [Skotlex]
+ * Modified map_freeblock_unlock so that aFree errors will report the
+ file/line that INVOKED the function rather than the function itself.
+ [Skotlex]
+ NOTE: Do NOT disable the memory manager as that will break this change.
+ This change is to be temporarily set until the afree'd error can be
+ resolved.
+ * Updated mob_npc_warp to a three-state config switch. 0 disables. 1 enable
+ only on warps that don't lead to nobranch maps. 2 - enable on all warps.
+ [Skotlex]
+ * Adjusted Don't Forget Me, Defender, Longing to use all val entries, and
+ to hold the speed adjustment value rather than speed penalty (eg: 125
+ instead of 25). [Skotlex]
+ * Cleaned up status_calc_speed so that speed penalties are correctly
+ handled (eg: 25% penalty is speed*100/75, not +speed*25/100). Thanks to
+ Euph for pointing it out and Belle for the speed mechanics. [Skotlex]
+2006/06/07
+ * Fixed Sense using mdef instead of mdef2 [Skotlex]
+ * Fixed item-skills not showing up on login. [Skotlex]
+ * Cleaned up clif_parseLoadEndAck, by testing which packets are required
+ only on first-login and which ones are required on all map-changes.
+ Skill-tree, Exp, Skill Points and most of the basic status are no longer
+ sent on map-change (items, cart data and zeny still need to be sent one
+ very map-change). [Skotlex]
+ * Fixed the mob state not being set to Berserk/Angry correctly after the
+ mob reaches the target's location. [Skotlex]
+ * Added config setting mob_npc_warp, when set to yes, enables mobs to be
+ warped between maps when stepping on a npc-warp. [Skotlex]
+ * Added monster_ai setting &64, when enabled makes a mob run to any nearby
+ npc-warp when their current target has switched maps. [Skotlex]
+ * Added pc_calcexp to calculate individual exp bonuses acquired from exp's
+ source (race bonus cards, SG Exp skills, pk-mode higher level exp) [Skotlex]
+ * pc_gain_exp now also receives the source of the exp, when said source
+ exists, bonuses are applicated as needed. [Skotlex]
+ * Added status_kill when capturing a mob, should take care of the mob not
+ respawning after caputed. [Skotlex]
+ * Fixed item info not displaying the found item id [Skotlex]
+ * Fixed item info not displaying the weight value properly. [Skotlex]
+ * Adjusted status resistances and durations taking as base Viccious's info
+ from the kro guidebook. [Skotlex]
+ * Moved souldrain code from skill_counter_additional_effect to mob_dead. It
+ should display the skill animation correctly now. [Skotlex]
+ * Adjusted several sc rate/time reductions as pointed out by Playtester.
+ [Skotlex]
+ - Luk now plays a luk/10 reduction role rather than a luk/3 one.
+ * Removed char_nick2id from char-sql server as it's no longer needed.
+ [Skotlex]
+ * Fixed quitting the map server not properly saving the storage before
+ deleting it. Thanks to Adam for pointing it out. [Skotlex]
+ * Cleaned status_get_sc_tick/status_get_sc_def to use the status_data
+ function. [Skotlex]
+ * SC_STOP's chance and duration can't be reduced anymore. [Skotlex]
+ * Storm Gust no longer has a 100% chance to freeze by passing mdef, now it
+ has a 300% base chance reduced by mdef and the like as explained out by
+ Tharis. [Skotlex]
+ * Frost Diver/Frost Nova's base freezing chance is no longer affected by
+ target's int. [Skotlex]
+ * [Improved]:
+ - mob_dead not to remove script controlled monsters with player sprites.
+ [Added]:
+ - buildin_mobdeadsit :D [Lance]
+ * [Fixed]:
+ - temp++ gets issued before if(mvp_damage<(unsigned int)md->dmglog[i].dmg) in
+ mob_damage. Thanks to seahorsix. [Lance]
+ * [Fixed]:
+ - Corrected login-server SQL to use *((ulong *)p) instead of (ulong)p [Lance]
+ * [Optimized]:
+ - list and size not being initialized (size get intialized in default: switch case)
+ Eliminated default case and initialized list and size at the beginning. [Lance]
+2006/06/06
+ * Hopefully fixed for sure mobs getting extra stats when changing-class due
+ to the mobs level up setting. [Skotlex]
+ * Removed a piece of code that should no longer be needed due to the
+ combo-skill setting (inf = self, inf2 = no-target-self) which is blocking
+ self-skills from being used on others (pets/mobs should be allowed to do
+ that) [Skotlex]
+ * Added a status_check_skilluse call in Sightblaster to prevent it from
+ hitting hidden/cloaked/act-dead/etc players. [Skotlex]
+ * Fixed firewall counter going down by 2 each hit rather than 1. [Skotlex]
+ * Fixed Soul Burn not zapping away all SP. [Skotlex]
+ * The monsters can level up setting will not take effect when the mob's
+ level is LESS than their db counter-part (should prevent under-leveling
+ causing underflows and semi-immortal mobs) [Skotlex]
+ * Fixed mvp-exp calculations being messed up with more than one attacker.
+ [Skotlex]
+ * Changed the mob exp race bonus so that each player gets their own bonus,
+ rather than the killer's bonus applying to everyone. Still not the
+ "correct" way, but one step closer to it. [Skotlex]
+ * [Fixed]:
+ - Allocation of event_list in guild_npc_request_info to aCalloc so
+ memcpy(ev->name,event,strlen(event)) will have a null terminator. [Lance]
+2006/06/05
+ * Fixed a crash when using SL_SMA and the "combo" ain't ready. [Skotlex]
+ * Hopefully fixed changing a mob's class causing them to get all sort of
+ stat bonuses due to the mobs-level-up setting. [Skotlex]
+ * Changed hit, flee, cri, flee2, def2 and mdef2 to signed short, def, mdef
+ to signed char to correctly account for cards with penalties in said stats.
+ [Skotlex]
+ * Fog of Wall won't affect the caster now in any way. [Skotlex]
+ * Added clif_fixpos packets before attacking for the first time to clear
+ any position sync issues with the client. [Skotlex]
+ * Fixed skill_unitsetting using layout->count for the for instead of
+ group->count [Skotlex]
+ * Added SC_INCDEXRATE/SC_INCAGIRATE. NPC_POWERUP/NPC_AGIUP now correctly
+ increase dex/agi by 40% per level. [Skotlex]
+ * Fixed char-sql server not deleting character variables when deleting a
+ char. [Skotlex]
+ * Corrected cloaking not ending on attack if you are near a wall. [Skotlex]
+ * Updated pc_bonus to use cap_value on all status_data modifiers to prevent
+ overflows/underflows. [Skotlex]
+2006/06/03
+ * Fixed @mi/@mobinfo not showing the name collumns correcly [shadow]
+ * Solved the bug that made firewalls only castable a few times until [MasterOfMuppets]
+ you relogged. Thanks to Euph for the fix.
+ * Added variable other_mapserver_count to chrif.c which holds total count
+ of connected map-servers. By using this we prevent sending unnecessary
+ packets to the char-server when there's no more map-servers connected.
+ [Skotlex]
+ - Affected packets are whispers, announces, party messages, guild messages.
+2006/06/02
+ * Fixed Visual Studio 7.1 Solution File (Login TXT and Map TXT were removed)
+ * Fixed a bug in unit_can_reach_bl which breaks path seeking when the
+ target is near obstacles. [Skotlex]
+ * Updated offensive use of Sanctuary to function like on the official servers [MasterOfMuppets]
+ * Changed the interval between waterballs from 150 to 250 milliseconds [MasterOfMuppets]
+ * Corrected clif_parse_takeitem to ALWAYS return a NAK packet when it
+ fails. Fixes cases where the client gets "stuck" and refuses to let you
+ pick any items. [Skotlex]
+ * Removed the walk delay from firewall and changed its knockback [MasterOfMuppets]
+ to 1 tile to make it act more like in the official servers.
+ * Some cleaning of the mob slave ai. [Skotlex]
+ * Corrected Brandish Spear to work on levels above 10. [Skotlex]
+ * Updated Two-HandQuicken, One-HandQuicken to give 30 +2*lv% aspd-rate for
+ skill levels above 10 (meant for boss casted skills) [Skotlex]
+ * Fixed Spear-Quicken messing with the calc_flag [Skotlex]
+ * Fixed Freeze/Stone/Benedictio not changing your elemental LEVEL to 1.
+ [Skotlex]
+ * [Fixed]
+ - Yet another compilation warning. [Lance]
+2006/06/01
+ * Altered status_calc_pc so that equipment scripts are ran before
+ card-scripts. [Skotlex]
+ * Fixed pc_bonus to not underflow/overflow when adjusting def/mdef.
+ [Skotlex]
+ - These two together, should fix Tao Gunka Card.
+ * npc_debug_warps() will now be invoked if warp_point_debug is set.
+ [Skotlex]
+ * Updated item_db.sql/mob_db.sql to current. [Skotlex]
+ * Fixed NPC_SELFDESTRUCTION not showing nor dealing damage. [Skotlex]
+ * NPC_TRANSFORMATION/NPC_METAMORPHOSIS will now preserve the original mob
+ without removing it when the skill level is greater than one. [Skotlex]
+ * Added SC_DANCING declaration in the Status Change tables to signal it
+ modifies Walk speed. [Skotlex]
+ * Fixed pc_damage setting your canlog_tick even if the damage has no source
+ (eg: poison, berserk) [Skotlex]
+ * Berserk's aspd bonus now stacks with other aspd bonuses, but is still
+ affected by Quagmire/Forget-me-not. [Skotlex]
+ * Corrected setting slaves_inherit_mode to not apply to morphosis skills.
+ [Skotlex]
+ * Corrected pc_setoption to invoke status_calc_pc when getting/removing the
+ cart. [Skotlex]
+ * Fixed @mobinfo displaying the wrong element. [Skotlex]
+ * Fixed Autoblitz taking into account target's luck rather than attacker's
+ [Skotlex]
+ * Fixed slaves warping endlessly to their master when the master-slave
+ distance exceeds 30. [Skotlex]
+ * SC_ORCISH will now be dispelled on logout (if debufF_on_logout is set)
+ [Skotlex]
+ * Removed attackrange/attackrange_ from TBL_PC, corrected clif.c using the
+ incorrect range variable. [Skotlex]
+ * You can now equip/unequip stuff while the storage is open. [Skotlex]
+2006/05/31
+ * Fixed Soul Drain not really giving you SP [Skotlex]
+ * [Fixed]:
+ - Suppressed compilation warning in chrif.c [Lance]
+ * [Fixed]:
+ - Guys can't go across map-servers :( [Lance]
+ * [Fixed]:
+ - Restoration and saving of sd->npc_id must be done every time. [Lance]
+ * Added back the Freeze/Petrify adjustments of -50%def and +25%mdef (when
+ where these lost?). Thanks to Buuyo for pointing it out. [Skotlex]
+ * Corrected the mob_ai&2 setting triggering rude-attacked due to can't walk
+ delay. [Skotlex]
+ * Made the char_name_option char_athena.conf setting apply to parties and
+ guilds as well. It cannot be applied to pets yet without adding a
+ change-name-request interserver packet. [Skotlex]
+ * Moved the JOB_* defines from map.h to mmo.h, update char.c to use them.
+ [Skotlex]
+ * Added function char_read_fame_list for famelist reading. Invoked it on
+ init, and made it be sent automatically to connecting map servers.
+ [Skotlex]
+ * Some cleaning of the fame-list reading code. [Skotlex]
+ * Some cleaning of the fame-update code, fixed a logic bug which made the
+ ranking list fail to display the correct ranker names. [Skotlex]
+ * Removed typedef bool from socket.h and included cbasetypes.c instead.
+ [Skotlex]
+ * Cleaned up and corrected the calculation of hit/flee/cri/lucky dodge in
+ status_calc_bl. [Skotlex]
+ * [Fixed]:
+ - Incorrect SQL syntax in login.c (missing collumn) [Lance]
+ * [Improved]:
+ - SQL upgrade file for the new loginlog. Thanks to ultramage. [Lance]
+ * [Fixed]:
+ - nullpo in pet.c caused by equipping without checking if the pet is available.
+ [Lance]
+ * [Fixed]:
+ - Latest client support completed! [Lance]
+ * [Fixed]:
+ - Missing #include for cbasetypes.h in login server SQL.
+ - Logic errors in run_script [Lance]
+ * [Added]:
+ - Partial support for latest login packet. But it seems to have a new security
+ module. [Lance]
+2006/05/30
+ * [Improved]:
+ - Fake NPC interface to use real NPCs.
+ - Scripting interface to restore and save sd->npc_id. [Lance]
+ * Added function pc_check_skilltree for checking if you unlocked new
+ tree-skills when raising non-passive skills. [Skotlex]
+ * Fixed flee/hit calculation in status_calc_bl to account for bonuses from
+ the base status. [Skotlex]
+ * [Fixed]:
+ - Compatibility problems in login.c [Lance]
+ * Fixed pets ignoring can-act delays for skill usage. [Skotlex]
+ * [Added]:
+ - Mercenary.c in VS.NET 2005 project files
+ [Improved]:
+ - loginlog using unsigned long `ip` field.
+ (Please check for compatibility problems). [Lance]
+ * Fixed status_calc_pc not zero'ing ALL vars it should, allowing certain
+ bonuses (like effect-on-hit) to stack. [Skotlex]
+ * slaves inherit speed setting will now work regardless of whether the
+ slave or master has the MD_CANMOVE mode bit. [Skotlex]
+ * Call Slave now invokes slaves on a 5x5 area around master. [Skotlex]
+ * AL_TELEPORT will fail when used by slave mobs. [Skotlex]
+ * Added NPC_ENERGYDRAIN, NPC_MENTALBREAKER to the list of undodgeable
+ attacks. [Skotlex]
+ * Fixed status_damage not setting your HP to 0 when you died [Skotlex]
+ * Fixed the pcbonus2 warnings using the wrong value before printing the
+ invalid Element error. [Skotlex]
+ * Fixed underflow issues when calculating dmotion. [Skotlex]
+ * Fixed Absorb Spirit Spheres [Skotlex]
+ * Added battle_config min_chat_delay (default 0, battle/client.conf)
+ specifies in ms what is the min delay between player sent chats
+ (whisper/global/party/guild). Messages that exceed this threshold are
+ silently ignored for now (perhaps need to add a "DON'T SPAM" reply to the
+ player?) [Skotlex]
+ * [Fixed]:
+ - signed/usigned problem in sprintf and fscanf @ mercenary.c [Lance]
+ * Rewrote/cleaned up @petfriendly. [Skotlex]
+ * Cleaned up final part of status_calc_pc (flags 2/4 do not exist) [Skotlex]
+ * Updated attr_fix_table reading code to account for ELE_MAX (will
+ correctly read bigger elemental tables if ELE_MAX is changed) [Skotlex]
+ * Aggressive mobs will now use battle_check_range rather than mob_can_reach
+ to decide whether to lock-on or not to a target within sight-range. [Skotlex]
+ * Added warnings in mob_readdb when the mob's element is invalid. [Skotlex]
+ * Added error messages in pc_bonus* functions when an invalid element is
+ passed to the relevant bonuses. [Skotlex]
+ * [Optimized]:
+ - clif_specialeffect to use the enums.
+ [Improved]:
+ - buildin_specialeffect and buildin_specialeffect2 to accept effect area
+ definition. [Lance]
+ * [Added]:
+ - Visual Studio .NET 2003 includes for mercenary.c [Lance]
+ * Removed the on-die specific code from unit_remove_map and placed it on
+ the corresponding *_dead functions. unit_remove_map should never assume the
+ char died, it is just a "remove from map" function. [Skotlex]
+ * Updated status_damage to handle the general death code (clearing status
+ changes, clearing skill related data, sending death packet, etc). The
+ return value from the *_dead functions will tell it what to do or not with
+ the object (death aborted, clear it from map/memory, etc) [Skotlex]
+ * Cleaned up pc_dead to take advantage of the fact that status changes are
+ not ended until after the function. [Skotlex]
+ * Disabled ontouch npcs triggering on hidden/chase-walk characters.
+ [Skotlex]
+ * Updated/adapted current Homun code to use the status_data update.
+ [Skotlex]
+ * Updated map-server Makefile to compile mercenary.* files. [Skotlex]
+ * [Fixed]:
+ - Pets attacking even master is dead. [Lance]
+ * Fixed battle_calc_weapon_attack damage capping damage to a minimum of 0
+ (negative values should be allowed when attack is absorbed by target's
+ element) [Skotlex]
+2006/05/29
+ * [Fixed]:
+ - Missing ';' in item #4358 [Lance]
+ * [Fixed]:
+ - Missing maps in map index database. [Lance]
+ * [Fixed]:
+ - Battle mechanics in battle_check_target [Lance]
+ * [Fixed]:
+ - Typo in mob_dead causing crash. Thanks to reddozen and his gang for testing.
+ [Lance]
+ * Cleaned up friend list saving and fixed loading of friends.txt file
+ (char-txt) [Skotlex]
+ * Added the Arunafeltz maps, not tested yet [Playtester]
+ - someone with an up-to-date client should test them
+ * Fixed pc_gainexp resetting your exp to 0 rather than adding it in...
+ [Skotlex]
+ * Corrected aspd calculation code to avoid negative overflows. [Skotlex]
+ * Fixed battle_check_target check on BCT_ALL to check versus BL_CHAR
+ instead of BL_PC and BL_MOB [Skotlex]
+ * [Fixed]:
+ - Declaration of int map_getcellp(struct map_data*,int,int,cell_t); [Lance]
+ * Removed Undead being inmune to poison status. [Skotlex]
+ * Removed speed penalty from SC_SKA [Skotlex]
+ * Fixed SC_SPURT triggering on Soul Linkers. [Skotlex]
+ * SC_DODGE won't be dispelled on death now. [Skotlex]
+ * [Fixed]:
+ - pc_follow_timer possible triggering crash.
+ - pc_reg_received to use battle_status.hp instead of status.hp
+ [Added]:
+ - macro map_id2index for non-cyptic mapid to mapindex conversion. [Lance]
+ * Added a division by zero check in mob_dead to prevent the (impossible)
+ case where a mob dies with received damage of zero. [Skotlex]
+ * Modified skill_get_range2 to return range 9 for skills with range 0 for
+ Non-Players. This usually signals Self skills, and mobs/pets should be able
+ to use them in other characters. [Skotlex]
+ * Optimized a bit the SC_PROVOKE code (to use val3/val4) [Skotlex]
+ * Fixed draining when the amount drained is negative (invoke zap rather
+ than heal) [Skotlex]
+ * Implemented GS_FLING as per the current skill description. [Skotlex]
+ * Fixed pc_readparam/pc_setparam to use battle_status.hp/sp rather than
+ status.hp/sp, fixes scripts reading the wrong Hp/Sp values [Skotlex]
+ * Added some missing SC_* entries on the initial listing (potion related
+ and speed up ones) [Skotlex]
+ * Fixed function declaration of map_getcellp() [Skotlex]
+ * [Fixed]:
+ - status.c:920: warning: 'mbl' might be used uninitialized in this function
+ - skill.c:6648: warning: 'matk_min' might be used uninitialized in this function
+ - skill.c:6648: warning: 'matk_max' might be used uninitialized in this function
+ - skill.c:2826: warning: 'sid' might be used uninitialized in this function [Lance]
+ * [Optimized]:
+ - Removed unused variable (account_id) in storage_guild_storagesaved.
+ * [Optimized]:
+ - Removed unused checks for unsigned data type and possible logic error for
+ char type (gcc treats char as unsigned). [Lance]
+ * [Fixed]:
+ - Relogging in with 0 HP didn't trigger dead event. [Lance]
+2006/05/28
+ * Added functions status_revive, pc_revive and mob_revive to handle revival
+ (it doesn't handles player respawning, though). Fixed reviving @ commands.
+ [Skotlex]
+ * Added SC_BLADESTOP to the skill enum at the beginning of status.c (fixes
+ Bladestop causing an unknown status change message). [Skotlex]
+ * Fixed MSS_DEAD state skills not triggering. [Skotlex]
+ * Changed undeads to by default always sustain 100% of the damage from firewalls [MasterOfMuppets]
+ * [Fixed]:
+ - script functions that doesn't pass references, thanks to End_of_exam. [Lance]
+ * [Protected]:
+ - clif_parse_LGMmessage from possible hacks [Lance]
+ * Fixed unable to store n items into storage unless n was the total amount
+ of items you had. [Skotlex]
+ * Suppressed compilation warnings (unsigned and signed mismatches) [Lance]
+2006/05/27
+ * Added structure status_data which holds status-related information (str,
+ agi, etc, speed, amotion, adelay, dmotion, weapon-damage, race, size, etc)
+ and weapon_atk structure with the weapon specific info (atk, atk2, element)
+ to be used by all combat structures (TODO: Homun needs to be updated to use
+ it). This in change involves a LOT of changes throughout the code and many
+ optimizations were done as well. Partial list (see svn changelog for complete
+ changes): [Skotlex]
+ - NOTE: Changes are substantial! I tested a bunch of stuff and all the
+ skills I changed the most, but it is possible there are unnoticed bugs
+ remaining to fix!
+ - Cleaned up TBL_PC, TBL_MOB, TBL_PC and mob_db structures to use status_data.
+ - Split damage received functions into pc_damage/pc_dead and mob_damage/mob_dead
+ - Added status functions to deal with damage and healing (status_damage,
+ status_heal, status_percent_change) and a bunch of defines for easier
+ handling of them (status_percent_heal, status_percent_damage,
+ status_fix_damage, status_kill, etc). Objects must be hurt/healed through
+ THIS, pc_damage/mob_damage most no longer be directly invoked!
+ - Rewrote and cleaned up battle_calc_misc_attack
+ - Merged config options pc_attack_attr_none, mob_attack_attr_none,
+ pet_attack_attr_none into attack_attr_none (type 4)
+ - Removed config options player_defense_type, monster_defense_type,
+ pet_defense_type in favor of weapon_defense_type
+ - Modified skill_calc_heal to take into account the MEDITATION bonus.
+ - Modified Slim Pitcher so it will work when casted by non-players. Will
+ now also work with SP-healing items.
+ - Rewrote Freedom of Cast code to use function status_freecast_switch to
+ switch adelay/speed when cast begins/ends.
+ - Modified Magic Power to store amplified MATK/MATK2 in val3/val4 for
+ easier updating when used in conjunction with ground skills.
+ - Fixed Asura Strike being usable from within a combo regardless of combo skill.
+ - Added status_calc_bl which does status-change related calculations using
+ as base the base_status of the bl object and the SCB_* flag passed. This is
+ invoked on status changes, and status_calc_pc will no longer be invoked
+ (which results on much faster status-change calculations).
+ - pc_clean_skilltree will now also remove item-granted skills.
+ - Learning skills will now only invoke status_calc_pc when the skill is passive.
+ - Cleaned up pc_check_base/job_lvup to only invoke the lv-up related
+ packets and functions ONCE regardless of skill-levls earned.
+ - Cleaned up pc_ regen related functions.
+ - Made player-sprite mobs have item pickup animation and walkdelay when taking items.
+ - Clones will copy a player's base status rather than battle status (so
+ status-change alterations are not cloned)
+2006/05/26
+ * Part B of the homunculus code. [blackhole89]
+ While most of the homunculus handling functions are in now, it still lacks
+ code required for players to create it.
+ Given I haven't screwed up, you could master yourself one through the DB though.
+ * Fixed crashing in mob.c [Lance]
+ * Patches to allow everything to work right. + 1 more sample script. [Lance]
+ * Mob control engine tested 99% working so far. [Lance]
+ * Change scripting engine's NPC scope vars to dot (.) style.
+ * Improved and (should be fully) fixed the mob control engine. [Lance]
+ * Fixed typos in char.c [Lance]
+ * Rewrote fame rank lists system to reduce char-server load, as requested by
+ Skotlex: now it has a copy of those lists, and updates only the proper one
+ when needed instead of rebuilding all from saves everytime (which required
+ to always save the character before rebuilding the lists) [DracoRPG]
+ - Note it hasn't been compiled nor tested with SQL, please do it for me
+2006/05/25
+ * Simplified ASC_BREAKER by making it a BF_WEAPON attack with an additional
+ int-based damage component (which is added right before elemental
+ modifiers) as described by AuronX. Pending further refining. [Skotlex]
+ * Resolved differences between Stable/Trunk msg_athena.conf. [Lupus]
+ Fixed atcommand @request MSG numbers accordinly.
+ On adding new MSG strings, plzm reserve them in STABLE msg_athena.conf, too
+ * Added NoVending mapflag. You may disable vending in the streets [Lupus]
+ * Increased capacity for Account Variables to 64 [Skotlex]
+ * Reverted Intravision implementation to that of stable's. [Skotlex]
+ * Corrected Login Server taking it's first argument as both login config
+ and lan config. [Skotlex]
+ * Fixed mob control commands.
+ * Fixed memory leak in scripts (again). Still have a few lying. [Lance]
+2006/05/24
+ * Fix to the slave AI problem. [erKURITA], by [Skotlex], reported by Niktout.
+ * Item sharing now shares the same rules as exp sharing (no sharing when
+ dead, or idle, etc) [Skotlex]
+ * Fixed summoned slaves being able to cast onspawn summon-skills (slaves
+ aren't supposed to be able to call minions) [Skotlex]
+ * The clif_skill_poseffect packet will not be invoked in Snap unless the
+ skill was successful. May fix the client-position lag. [Skotlex]
+ * Merged item_db.sql from stable (the one from stable was more recent than
+ the one of trunk...) [Skotlex]
+ * Corrected SL KA* spells not working on other Soul Linkers. [Skotlex]
+ * Corrected a pair of incorrect sql query parsing logic in the login-sql
+ ban request packet. [Skotlex]
+2006/05/23
+ * Corrected mob angry mode, now it only "restores" itself after being hit
+ when the mob has no target within their range of sight rather than on
+ picking a new target. [Skotlex]
+ * Fixed wedding sprite where it would stay active after unequipping. [Zido]
+ * Some cleanup of run_script, should fix the memory leak there. [Skotlex]
+ * the charname request hack message has been downgraded to only include
+ GM-invisible characters. [Skotlex]
+ * corrected clif_charnameack to send negative ID when a disguised player
+ asks for it's own disguised name. [Skotlex]
+ * Cleaned up the disguised target-id checks taking into considering that
+ the only character that sees a negative ID is the same disguised character.
+ [Skotlex]
+ * Modified battle_calc_weapon_attack to use new flags pdef/pdef (pierce
+ defense), Investigate and Icepick will now use the final def/vit-def values
+ rather than the base ones. [Skotlex]
+ * The move-enable condition checks for skills are now checked for only when
+ on skill use, not at cast-end time. [Skotlex]
+ * Corrected clif parse name request failing on disguised characters [Skotlex]
+ * Corrected Soul Drain draining from all non-ground-based skills including
+ non-magic attacks. [Skotlex]
+ * Corrected pc_setoption to change the option and then change class.
+ changing option-wedding will automatically convert the view-class as well.
+ [Skotlex]
+ * Corrected the 15% drop rate increase when killing higher level mobs in
+ pk-mode triggering for all mobs with lower level than yourself. Thanks to
+ Vayu. [Skotlex]
+ * Fixed typo (this time it's not my fault) in script_reload() clearing the same
+ db each time o_o [Lance]
+ * Fixed sleep command. [Lance]
+ * Added 'setd' support for local NPC scope (') variables. [Lance]
+ * [Scripting Engine Update] New variables are ready to be used. [Lance]
+2006/05/22
+ * Updated skill_delayfix to return 0 for mobs since they have no skill
+ delay other than the one specified in mob_skill_db [Skotlex]
+ * Corrected the 20 lvl diff 15% exp bonus on pk_mode servers. Thanks to
+ Vayu for pointing it out. [Skotlex]
+ * status_get_sc_tick will now use directly Stun's formula rather than
+ invoking the status sc chance once. [Skotlex]
+ * Fixed a possible null pointer in script command misc_effect [Skotlex]
+ * Modified Investigate to take into consideration final def/vit-def rather
+ than base values for damage adjustment. [Skotlex]
+ * WARNING: New scripting system contains memory leak
+ TODO: Free all scripts using script_free_code() instead of old methods. [Lance]
+ * Excluded idle and auto-trade party members from TK_POWER list. [Lance]
+ * Fixed compilation errors.
+ Tidy up jobmaster for easy debugging. [Lance]
+2006/05/21
+ * Part A of the Homunculus code.
+ This only features the structures, status_* and clif_* (packets) and is
+ not functional yet in any conventional way, but doesn't interfere
+ with present functionality either.
+ Main purpose is helping me to keep my work organized. [blackhole89]
+ * Fixed the "fake" mute status bug. [Zido]
+ * Speed up array size calculation and deletion. [Lance]
+ * Player must learn the skill before doing auto-spell [Lance]
+ * Exploit prevention in clif_parse_NpcStringInput [Lance]
+ * SC_SPEARSQUICKEN -> SC_SPEARQUICKEN normalized enum name [Lupus]
+ * Thanks to damirych & Falcon for [2006/04/30] STEAL skill [Lupus]
+2006/05/20
+ * grfio_final moved back if any of GRF overriding is enabled so servers
+ with such configuration will not have different values after reloading. [Lance]
+ * jA1983 script.c buildin_menu fix. Thanks to End_of_exam. [Lance]
+ * Abit of alterations to login-server. [Lance]
+2006/05/19
+ * Minor unsigned/signed alteration in pc_additem to shut the compiler up. [Lance]
+ * Small change in pc_additem that could be fixing the current bug with new
+ items not getting added. [Skotlex]
+ * Fixed loginlog definition in main.sql, thanks to Tempesta [Skotlex]
+ * Likely fixed the mob-skill random picking behaviour causing infinite
+ loops sometimes. [Skotlex]
+ * Modified mobskill_use behaviour to pick a random starting point and check
+ skills from that, rather than always checking from first to last. Fixes
+ skills with high priority blocking skills lower down in the list from
+ triggering. [Skotlex]
+ * Updated mob ai behaviour so that mobs use IDLE state skills when their
+ current target cannot be reached for melee fighting. [Skotlex]
+2006/05/18
+ * Added 5 config settings to adjust damage in pk-mode servers (misc.conf)
+ [Skotlex]
+ * Fixed mob_max_skilllvl being capped to 11! [Skotlex]
+ * Rewrote/cleaned up several functions in storage.c [Skotlex]
+ * Optimized pc_additem comparisons to account for items with more than four
+ slots. [Skotlex]
+ * Updated clif.c to enable retrieval of items from cart/storage while
+ trading. Exception is retrieving items from the cart while vending.
+ [Skotlex]
+ - The reasoning is that an ongoing trade will not get "corrupted" if you
+ earn items before it is commited (only if you lose items from your
+ inventory), and it is an annoyance when you realize the stuff you want to
+ trade is on the cart/storage.
+ * skill reiteration code now does not checks for the trigger-area of the
+ skill in the case of non-players, which means mobs can now place traps in
+ cells adjacent to each other. [Skotlex]
+ * Applied an experimental weather code that should lower bandwidth usage to
+ near-none, which's only disadvantage should be the weather not clearing out
+ until moving to another map (even when the mapflag is removed from the
+ current map). Please test and report if there's any anomalies with it.
+ [Skotlex]
+ * NPC_AGIUP will now give movement boost of 50% [Skotlex]
+ * Fixed WZ_WATERBALL number of hits when used by non-players. [Skotlex]
+ * MO_BODYRELOCATION will send the slide packet with the actual src's
+ coordinates rather than selected tile. [Skotlex]
+2006/05/17
+ * Modified mob_can_changetarget to return true always when the new target
+ is the provoked-by character. Fixes provoke not making the mob change
+ target when it already is locked on another player. [Skotlex]
+ * Added check to clear previous skill when combo time ends. Should fix TK
+ Rankers being unable to initiate a combo with the same kick their previous
+ combo was finished with. [Skotlex]
+ * Power Up and Agi Up now increase Hit/Flee by 20%/lv [Skotlex]
+2006/05/16
+ * Modified "hide woe damage" to send the number of hits rather than 1 as
+ damage Because when the damage is less than the number of hits, the client
+ will display MISS. [Skotlex]
+ * Fire Pillar will now do 200%MATK damage per hit when level is >10.
+ [Skotlex]
+ * Blood Drain always hits now. [Skotlex]
+ * Fixed Mob Area Skills not updating their use-time (rendering their skill
+ delay useless) [Skotlex]
+ * Search free cell will now skip picking the center-tile as target
+ location. Will prevent slaves from walking on top of their master, or mobs
+ placing stuff right under themselves with the "around" target conditions
+ among other things. [Skotlex]
+2006/05/15
+ * Small changes to the skill.conf
+ - Monsters now can place ground skills on top of each other by default
+ - Land_Skill_Limit format changed and set to "Only Players" by default
+ * When reading mapflags, when a map is set to be pvp or gvg, the other will
+ be turned off (disables pvp mapflags in gvg maps for pk-servers) [Skotlex]
+ * Firepillar's damage per hit is now 100% MATK (rather than 20%) when the
+ skill level is above 10. [Skotlex]
+ * Sorted out the item_data structure, getiteminfo should work correctly
+ now. [Skotlex]
+ * KA* skills can now be casted on other Soul Linkers as well without the
+ Spirit requirement. [Skotlex]
+ * Soul Drain will now show the SP drained regardless of drain display
+ settings. [Skotlex]
+ * SC_COMBO state will now end in skill_attack rather than
+ skill_check_condition (as it is required there to apply damage bonuses
+ based on combo-casted skills) [Skotlex]
+ * Fixed Option_Wedding in const.txt (0x1000 won't work, it has to be 4096)
+ [Skotlex]
+ * Fixed the nocast flag 2 (not usable in pvp) returning true in pk-mode
+ servers. [Skotlex]
+ * When removing a castle's owning guild, the char servers will erase the
+ guardian data now. [Skotlex]
+ * Changed the behaviour of immobile mobs when they can't chase their
+ target. Rather than using a longrange skill and then unlocking, they will
+ use an attack/angry state skill and then unlock. [Skotlex]
+ * Some adjustments of how disguising + gm-hiding work together. [Skotlex]
+ * Fixed clif_GlobalMessage being the exact same function as clif_message
+ (the first should send to ALL_CLIENT and the later should send to
+ AREA_CHAT_WOS). Should fix globalmes script command. [Skotlex]
+ * Added SC_BLADESTOP to the switch listing in status_change_start [Skotlex]
+ * Characters in vending are now always considered "idle" if the
+ idle_no_share setting is active. [Skotlex]
+ * Players with OPTION_INVISIBLE should not be sent to clients. [Lance]
+ * Remaining fixes for item scripts. [Lance]
+ * Added NPC event deprecated warnings to ease debugging old scripts. [Lance]
+
+2006/05/12
+ * Supplied fake NPC ID in sd->npc_id for item scripts. [Lance]
+ * Bugfix on fake npc [Lance]
+ * Fixed mob_once_spawn not working for non-random coordinates. [blackhole89]
+ * Reverted again the change that stuns the caster on Ske, Ska, Swoo when
+ the target is a nonplayer (rather than always) [Skotlex]
+ * Modified mob_spawn_once so that coordinates -1,-1 are "random around the
+ player" while 0,0 are random around the whole map (regardless of whether
+ there's a player attached or not) [Skotlex]
+ * Knockback will no longer work on traps during woe. [Skotlex]
+2006/05/11
+ * Fixed the definition of the KEY in the loginlog, thanks to TheUltraMage
+ [Skotlex]
+ * NPC_POWERUP and NPC_AGIUP now cause a increase in hit/flee (respectively)
+ of 40% per level. [Skotlex]
+ * Changed a bit the MAX_ZENY checks in trade.c to prevent overflows.
+ [Skotlex]
+ * Rewrote npc_selllist for a more proper-clean implementation. [Skotlex]
+ * Increased NPC_POWERUP's dex bonus to +25*lv [Skotlex]
+ * Moved TK_DOWNKICK's stun time from time to time2 [Skotlex]
+ * Added TK_TURNKICK's stun to splash-pushed mobs. Duration is 2secs (time2)
+ [Skotlex]
+ * Merged the code for Ska, Ske, Swoo together. Swoo stun duration is now 10
+ secs (reducable) if you target a mob that already has Swoo active. [Skotlex]
+ * Added the missing semi-comma from the upgrade_svn6533.sql file. Thanks to
+ Tanaous [Skotlex]
+ * Added back the missing code that substracts arrows when normal-attacking.
+ [Skotlex]
+2006/05/10
+ * Changed the state of Asura back to explosionspirits, added a hardcoded
+ move_enable check when invoking Asura and NOT while in BladeStop or a
+ Combo. [Skotlex]
+ * Added back SC_XMAS to status.c, it got lost sometime during all the
+ previous reworkings. [Skotlex]
+ * Changed wedding costumes to use setoption rather than changebase.
+ [Skotlex]
+ * Modified setoption so that flag 1 or no flag adds an option, and flag 0
+ removes it. [Skotlex]
+ * Updated script_commands with the new behaviour. [Skotlex]
+ * Updated mob_db2.txt and mob_db2.sql to have only 10 drop slots rather
+ than 15. [Skotlex]
+ * Users are now able to use their own dnsbl servers (login_athena) [Zido]
+
+2006/05/09
+ * Rewrote/cleaned up trade.c for a more clean trading implementation.
+ [Skotlex]
+ * Added @request commands, sends a request to all connected GMs of
+ lowest_gm_level or above as a whisper message. Defaults to gm level 20
+ users (UNTESTED). [Skotlex]
+ * Modified @commands to use Meruru's code which is faster and does a fair
+ attempt at tabulating the commands presented. [Skotlex]
+ * Updated SKA to return a random value between 0 and 99 each time
+ status_get_def is invoked. [Skotlex]
+ * Updated Making Arrow to not include unidentified items in the list.
+ [Skotlex]
+ * Reduced drop slots from 15 to 10. [Skotlex]
+ * Updated mob_db.sql with the current data. [Skotlex]
+ * Updated setoption script command to receive a second (optional) argument
+ flag. If the flag is 1, the option is added to what the player currently
+ has; likewise using flag 2 removes only that option. No flag (or any other
+ value) is the older behaviour of removing all other options and setting
+ specificly what is passed. [Skotlex]
+ * Updated script_commands information for setoption due to this change.
+ [Skotlex]
+ * Small fix in npc-created chat rooms to properly include the terminating 0
+ on the chat's event. [Skotlex]
+ * Fixed Fog of Wall's symmetry in respect to Misc attacks, they no longer
+ get reduced by 50% regardless of who is standing on the fog. [Skotlex]
+ * monster_ai&2 will now trigger the rude-attacked skill when the mob can't
+ move and the attacker is out of it's attack range. [Skotlex]
+ * Added missing icon for Joint Beat [Skotlex]
+ * Mob-search functions will now skip enemies with no exp/job_exp. [Skotlex]
+ * Treasure chests will now be excluded from the mob-drop listings
+ (@whodrops) [Skotlex]
+ * Fix on pc_skill which fixes overlapping when one gets more than one bonus
+ for the same skill. [Skotlex]
+ * Updated main.sql's loginlog table structure. [Skotlex]
+ * Added svn_update6533.sql to update the loginlog structure as suggested by
+ theultramage. [Skotlex]
+ * Cleaned up somewhat the implementation of BladeStop. [Skotlex]
+ * Fixed the head_bottom (pet-armor) position in packet 0x22c (walk packet)
+ when crafted for non-players. [Skotlex]
+ * Script commands sc_start, sc_start2 and sc_start4 will now start
+ regardless of sc defense of the target player (that is, they cannot be
+ avoided/blocked) [Skotlex]
+ * Fixed a possible counter overflow in attacked_count, changed the var size
+ to unsigned char since the code can handle the overflow now. [Skotlex]
+ * Multiple targets again reduces armor defense, as reported by Tharis.
+ [Skotlex]
+ * Increased dex bonus of NPC_POWERUP to +20 per level. [Skotlex]
+ * Fog of Wall's -50 hit reduction is now only for ranged attacks. [Skotlex]
+2006/05/08
+ * Reverted the change that was making ES skills stun the caster always.
+ [Skotlex]
+ * Removed the fixpos packet which is sent whenever you are hit while moving
+ as Aegis doesn't sends this packet neither. [Skotlex]
+ * ES magic will now put the caster on stun for 0.5 secs regardless of
+ whether the skill-target is a mob or not. [Skotlex]
+ * Added function clif_party_join_info which sends packet 0x1e9 each time a
+ party-member joins. This packet (as redundant info as it has) should also
+ contain the field for "adoptability", but that needs to be coded in yet.
+ [Skotlex]
+ * Added clif_ParseAdoptRequest which does the basic adoption handling. More
+ checks and the reply packets still need to be coded in. [Skotlex]
+ * Happy State and TK stances won't dispel on death now. [Skotlex]
+ * Cleaned up combo-skill implementation, SC_COMBO is automatically ended in
+ skill_check_condition now. [Skotlex]
+ * Modified TK-ranker infinite combos to behave as described by AuronX.
+ Refer to his thread in the development section for details. [Skotlex]
+ * Made all Soul Link Spirit skills not be castable on self. [Skotlex]
+ * Changed rate of NPC status effect skills to 50+10*lv% base chance
+ (guessed, but better than 100% for all levels) [Skotlex]
+ * Changed max level of NPC status effect skills to 5 [Skotlex]
+ * Increased max number of tries to find a random spot in maps to 1000 since
+ some maps have so many non-walkable tiles it's hard to find one in just 100
+ tries. [Skotlex]
+ * status_set_viewdata will remove the Wedding Option status when you set a
+ class that is not wedding. [Skotlex]
+ * hide_gvg_damage will now send 1 instead of -1 as damage. [Skotlex]
+ * idletime will now be updated on attack-request, not on sit/standup
+ [Skotlex]
+ * Party members sitting will no longer be considered idle. [Skotlex]
+ * Removed SP_DISGUISE from the bonus list (onequip/onunequip should be used
+ with the disguise/undisguise script commands instead). [Skotlex]
+ * Moved Sharp Shooting display to the block with Auto-Counter (since that's
+ the other skill that can show critical as well) [Skotlex]
+ * Corrected some fields in the standing still packet (guild emblem being
+ stored as a Long when it should be Short) [Skotlex]
+ * Modified most fields of view_data to be unsigned shorts rather than
+ signed ones. [Skotlex]
+ * On-Touch NPCs will now make you stop walking when you trigger them.
+ [Skotlex]
+ * ShadowJump/JumpKick will make you land on the target's cell now.
+ [Skotlex]
+ * Fixed Kaahi triggering only once per skill duration. [Skotlex]
+2006/05/07
+ * Fixed readme/changelog.html [KillerBox]
+ * Removed old logs. [Lupus]
+ TODO: 1. Add produce logging into PICKLOG 2. Replace map names with map index
+2006/05/05
+ * Optimized clif.c clif_scriptmenu/input/inputstr to check for sd->state.using_fake_npc
+ before sending one (as it's not required to send twice).
+ * Reinitialize sd->state.using_fake_npc in clif_parse_LoadEndAck (for scripts that warps
+ players and still continues execution to work). [Lance]
+ * Updated item_db.sql to current. [Skotlex]
+ * Fixed a bug in @commands, most likely the reason some people were still
+ getting crashes. [Skotlex]
+ * Fixed @commands not showing the last available commands (unless the total
+ amount of commands is divisible by ten) [Skotlex]
+ * Added a npc-script-event cache to avoid looking up event-scripts every
+ time they need to be executed. Events cached are all those defined in
+ script_config (on login, logout, mapchange, death, kill, level up) [Skotlex]
+ - Since the cache holds direct pointers to the npcs/events, do NOT unload
+ the related NPCs or you'll get dangling pointer crashes. However,
+ @reloadscript will work fine.
+ - Set the etc_log to on to see a summary of npcs/events loaded for script
+ execution on startup.
+ * The Rest bonus activated by using /doridori while in rest should now
+ trigger with all the class tree (TK/SL/SG) [Skotlex]
+ * Fixed Kaupe always triggering when the one who was under Kaupe was a
+ player rather than the one attacking... [Skotlex]
+ * /doridori now won't double the HP/SP regen of TKs, it only activates
+ their "happy" state. [Skotlex]
+ * Added the -50 hit penalty when standing on Wall of Fog. [Skotlex]
+ * Uncommented the status_calc_mdef2 call in status_calc_pc. [Skotlex]
+ * Being in Enjoyable Rest state will now also trigger the HP/SP Time skills
+ (even if there's no other TK around). [Skotlex]
+ * Added battle config settings view_range_rate and chase_range_rate to
+ adjust the view-range and chase-range (range2/range3) of the mob_db without
+ having to manually change them (battle/monster.conf) [Skotlex]
+ * Kaupe now will only block all skills of players, for non-players, only
+ normal attacks can be missed. [Skotlex]
+ * Moved the Kaite spell-reflect code after the damage calculation function,
+ so the reflected damage is exactly the damage the original target would
+ have received. Will only trigger if the damage to be reflected is above 0.
+ [Skotlex]
+ * OnEquip scripts will now trigger on log-on. [Skotlex]
+ * Infinite Endure will no longer give mdef bonus. [Skotlex]
+ * Removed bInfiniteEndure bonus, Eddga card now uses onequip/onunequip to
+ start/end infinite endure. [Skotlex]
+ * Fixed Kaahi's SP cost per heal. [Skotlex]
+ * Now when walkdelay is set to 0, characters will stop walking when hit,
+ but will not have any walk delay. (previously setting walk delay to 0 would
+ not even stop characters from walking when hit) [Skotlex]
+2006/05/04
+ * Some people think its sexy to declare variables after blocks of code. Fixed. [Zido]
+ * Fixed a possible infinite loop in skill_clear_unit_group [Skotlex]
+ * Some clean-ups in the mob_ai [Skotlex]
+ * Improved atcommand autoloot, now displays droprate in percents and notices
+ player if autoloot is already on or off. Also simplified the code [Harbin, Kain],
+ commited by erKURITA
+ * Added one grace range in the mob_loot search function which should fix
+ mob_can_reach failing when invoked with the same distance that distance_bl
+ returned. [Skotlex]
+ * Stun time for using ES magic on non-mobs reduced to 0.5 secs. [Skotlex]
+ * Eska is now usable on bosses. [Skotlex]
+ * Swoo will stun you if attempted on an already 'swooned' enemy. [Skotlex]
+ * clif_skill_failed will print out a debug line with the skill_id (since
+ the current null_po does not helps at all to fix it) [Skotlex]
+ * Applied TheUltraMage's suggested fixes to the grfio module. [Skotlex]
+ * Rewrote Kaahi to behave as it should. It will heal whatever amount of
+ damage accumulates in the time2 interval (500ms by default) after being
+ hit. [Skotlex]
+ * Changed skill_unit_move_unit_group to enable moving of all types of
+ ground-skills except ensembles (fixes warmth not following you) [Skotlex]
+2006/05/03
+ * Kaahi now triggers every 500ms rather than on every hit (but it only
+ heals if in those 500ms an attack that would previously trigger Kaahi has
+ taken effect). In other words, it works just like before, except damage
+ gets "buffered" into 500ms slots. [Skotlex]
+ * Kaite, Kaute will now show a skill effect when they trigger. [Skotlex
+ * Knowledge will now only trigger if you logon to the memorized map, not
+ walk into it. [Skotlex]
+ * Corrected @whomap directly invoking msg_table[] rather than msg_txt()
+ [Skotlex]
+ * Guessed where the pet data goes in spawn packet 0x7c. This may be wrong
+ and not fix the pet issue, but I doubt it'll cause any problems that won't
+ be fixed by making the pet move. [Skotlex]
+ * Updated Charge Attack's state from none to move_enable. [Skotlex]
+ * Made tomahawk an NPC_SKILL so that it may not be plagiarized. [Skotlex]
+2006/05/02
+ * Fixed standing up not really standing you up. [Skotlex]
+ * Moved battle_consume_ammo to the end of skill_castend_damage_id,
+ skill_castend_nodamage_id and skill_castend_pos2 rather than
+ battle_calc_weapon_attack. They will trigger when the player's arrow_atk
+ state is active and a ground skill was not invoked. It should fix all
+ issues with splash/ground skills consuming ammo per target rather than once
+ per skill use. [Skotlex]
+ * Added structure state to the ground skills, their fields are magic_power,
+ into_abyss and ammo_consume to indicate the states that were previously
+ stored in val3. [Skotlex]
+ * Implemented desperado as explained by Rockman-EXE. The skill-effect is
+ not showing up though, I'll need some logged packets to see what's missing.
+ [Skotlex]
+ * Removed the unit_can_move checks in skill cast-end, they should be
+ performed in skill_check_require when the skill's state is move_enabled.
+ [Skotlex]
+ * Changed extremity fist's state to move_enabled, the explosion spirits
+ check is now hardcoded. [Skotlex]
+ * Absorb Spirit Sphere now gives +10SP per sphere as per discussions with
+ Haplo. [Skotlex]
+ * Changed a <= into a < in pc_steal_item. This means drops with 0.01% are
+ impossible to steal unless you have at least 100% steal-rate (where steal
+ rate is dex - opponent dex + skill_lv*3% + 10%) [Skotlex[
+ * Cleaned up clif_parse_action_request to enable sitting/standing while in
+ shops, interacting with npcs, etc. [Skotlex]
+ * Kaite now works against all types of spells. [Skotlex]
+ * Kaupe now works against all skills. [Skotlex]
+ * Sanctuary now won't damage non-enemies. [Skotlex]
+ * Blessing now will always give you bonus stats even if you are wearing
+ undead armor. [Skotlex]
+ * Modified how Rogue's treasure works so that you get +1% to your steal
+ rate rather than +0.01% to the final rate. [Skotlex]
+ * Rewrote Warmth to use ground-skill-units, it should behave now like in
+ officials (implementation is not quite the same, but it should yield the
+ same effects while consuming less bandwidth). "Stacking", as it's called,
+ is possible now, but limited to eA's minimum timer skill interval (100ms).
+ [Skotlex]
+ * Modified NPC_POWERUP so that it gives +10 dex * skill level rather than
+ +5+lv to all stats (as explained by Playtester and Tharis on how the skill
+ behaves). [Skotlex]
+ * Allowed SG_FEEL memorizing the same map for all three. [Skotlex]
+ * SC_FUSION won't end when you die now. [Skotlex]
+2006/05/01
+ * Added knockback when you run into a wall during running. However
+ position is not being refreshed on the client yet... [Skotlex]
+ * Fixed pc_disguise not allowing you to "redisguise". [Skotlex]
+ * Corrected a crash when sd is null in npc_event [Skotlex]
+ * After testing to make sure it works properly, I'm including
+ new battle conf options to limit MVP drops. [Reddozen]
+ * Removed OPTION_XMAS, it seems to not exist.... [Skotlex]
+ * Added SC_SMA to handle "ready to use SMA" status (rather than SC_COMBO)
+ since it has a visual effect to use. [Skotlex]
+ * Corrected the value of OPTION_FLYING [Skotlex]
+ * Using SG_FUSION ends Soul Linked effect. [Skotlex]
+ * status_setviewdata will set your option accordingly when the previous/new
+ view-class is wedding or xmas suit. [Skotlex]
+ * Added function map_foreachinshootrange, behaves the same way as
+ map_foreachinrange, but it also performs a "shoot-path" check before
+ invoking the function. Used in the skill subtimer function if
+ skill_wall_check is defined. [Skotlex]
+ * Fixed AL_WARP displaying "Unknown Area" selections when you don't have
+ all memo points used up. [Skotlex]
+ * Fixed alive_count not being reset on skill unitsetting, which leads to
+ some groups not being cleared once all their units expire. [Skotlex]
+ * Optimized Kaahi/Kahai, will now only show the amount of HP healed. Moved
+ to skill_counter additional effect so it may trigger even on miss. [Skotlex]
+ * SKA no longer blocks skills. [Skotlex]
+ * Optimized fake npc system. Added npc_checknear back to npc_buysellsel. [Lance]
diff --git a/src/common/socket.c b/src/common/socket.c
index f9262f424..4651f1dac 100644
--- a/src/common/socket.c
+++ b/src/common/socket.c
@@ -1,1360 +1,1360 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <errno.h>
-
-#ifdef __WIN32
-#define __USE_W32_SOCKETS
-#include <windows.h>
-#include <winsock.h>
-#include <io.h>
-
-typedef int socklen_t;
-#else
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <netinet/tcp.h>
-#include <net/if.h>
-#include <unistd.h>
-#include <sys/time.h>
-#include <sys/ioctl.h>
-#include <netdb.h>
-#include <arpa/inet.h>
-
-#ifndef SIOCGIFCONF
-#include <sys/sockio.h> // SIOCGIFCONF on Solaris, maybe others? [Shinomori]
-#endif
-
-#endif
-
-#ifdef _WIN32
-#define SEBADF WSAENOTSOCK
-#define serrno WSAGetLastError()
-#else
-#define SEBADF EBADF
-#define serrno errno
-#endif
-
-#include <fcntl.h>
-#include <string.h>
-
-#include "../common/socket.h"
-#include "../common/mmo.h" // [Valaris] thanks to fov
-#include "../common/timer.h"
-#include "../common/malloc.h"
-#include "../common/showmsg.h"
-
-fd_set readfds;
-int fd_max;
-time_t last_tick;
-time_t stall_time = 60;
-int ip_rules = 1;
-
-// reuse port
-#ifndef SO_REUSEPORT
- #define SO_REUSEPORT 15
-#endif
-
-#ifndef TCP_FRAME_LEN
-#define TCP_FRAME_LEN 1024
-#endif
-
-static int mode_neg=1;
-static unsigned int frame_size=TCP_FRAME_LEN;
-
-#ifndef MINICORE
-enum {
- ACO_DENY_ALLOW=0,
- ACO_ALLOW_DENY,
- ACO_MUTUAL_FAILTURE,
-};
-
-static struct _access_control *access_allow;
-static struct _access_control *access_deny;
-static int access_order=ACO_DENY_ALLOW;
-static int access_allownum=0;
-static int access_denynum=0;
-static int access_debug=0;
-static int ddos_count = 10;
-static int ddos_interval = 3000;
-static int ddos_autoreset = 600*1000;
-#endif
-
-
-// values derived from freya
-// a player that send more than 2k is probably a hacker without be parsed
-// biggest known packet: S 0153 <len>.w <emblem data>.?B -> 24x24 256 color .bmp (0153 + len.w + 1618/1654/1756 bytes)
-size_t rfifo_size = (16*1024);
-size_t wfifo_size = (16*1024);
-
-#define CONVIP(ip) ip&0xFF,(ip>>8)&0xFF,(ip>>16)&0xFF,ip>>24
-
-struct socket_data *session[FD_SETSIZE];
-
-static int null_parse(int fd);
-static int (*default_func_parse)(int) = null_parse;
-
-static int null_console_parse(char *buf);
-static int (*default_console_parse)(char*) = null_console_parse;
-#ifndef MINICORE
-static int connect_check(unsigned int ip);
-#else
- #define connect_check(n) 1
-#endif
-
-/*======================================
- * CORE : Set function
- *--------------------------------------
- */
-void set_defaultparse(int (*defaultparse)(int))
-{
- default_func_parse = defaultparse;
-}
-
-void set_nonblocking(int fd, int yes) {
- // I don't think we need this
- // TCP_NODELAY BOOL Disables the Nagle algorithm for send coalescing.
- if(mode_neg)
- setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,(char *)&yes,sizeof yes);
-
- // FIONBIO Use with a nonzero argp parameter to enable the nonblocking mode of socket s.
- // The argp parameter is zero if nonblocking is to be disabled.
-#ifdef __WIN32
- ioctlsocket(fd, FIONBIO, &yes);
-#else
- ioctl(fd,FIONBIO,&yes);
-#endif
-}
-
-static void setsocketopts(int fd)
-{
- int yes = 1; // reuse fix
-#ifndef WIN32
- // set SO_REAUSEADDR to true, unix only. on windows this option causes
- // the previous owner of the socket to give up, which is not desirable
- // in most cases, neither compatible with unix.
- setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,(char *)&yes,sizeof(yes));
-#ifdef SO_REUSEPORT
- setsockopt(fd,SOL_SOCKET,SO_REUSEPORT,(char *)&yes,sizeof(yes));
-#endif
-#endif
- setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,(char *)&yes,sizeof(yes));
-// setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (char *) &wfifo_size , sizeof(rfifo_size ));
-// setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (char *) &rfifo_size , sizeof(rfifo_size ));
-#ifdef __WIN32
-{ //set SO_LINGER option (from Freya)
- //(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/closesocket_2.asp)
- struct linger opt;
- opt.l_onoff = 1;
- opt.l_linger = 0;
- if (setsockopt(fd, SOL_SOCKET, SO_LINGER, (char*)&opt, sizeof(opt)))
- ShowWarning("setsocketopts: Unable to set SO_LINGER mode for connection %d!\n",fd);
-}
-#endif
-}
-
-/*======================================
- * CORE : Socket Sub Function
- *--------------------------------------
- */
-static void set_eof(int fd)
-{ //Marks a connection eof and invokes the parse_function to disconnect it right away. [Skotlex]
- if (session_isActive(fd))
- session[fd]->eof=1;
-}
-
-static int recv_to_fifo(int fd)
-{
- int len;
-
- if( (fd<0) || (fd>=FD_SETSIZE) || (NULL==session[fd]) )
- return -1;
-
- if(session[fd]->eof)
- return -1;
-
-#ifdef __WIN32
- len=recv(fd,(char *)session[fd]->rdata+session[fd]->rdata_size, RFIFOSPACE(fd), 0);
- if (len == SOCKET_ERROR) {
- if (WSAGetLastError() == WSAECONNABORTED) {
- ShowWarning("recv_to_fifo: Software caused connection abort on session #%d\n", fd);
- FD_CLR(fd, &readfds); //Remove the socket so the select() won't hang on it.
-// exit(1); //Windows can't really recover from this one. [Skotlex]
- }
- if (WSAGetLastError() != WSAEWOULDBLOCK) {
-// ShowDebug("recv_to_fifo: error %d, ending connection #%d\n", WSAGetLastError(), fd);
- set_eof(fd);
- }
- return 0;
- }
-#else
- len=read(fd,session[fd]->rdata+session[fd]->rdata_size, RFIFOSPACE(fd));
- if (len == -1)
- {
- if (errno == ECONNABORTED)
- {
- ShowFatalError("recv_to_fifo: Network broken (Software caused connection abort on session #%d)\n", fd);
-// exit(1); //Temporal debug, maybe this can be fixed.
- }
- if (errno != EAGAIN) { //Connection error.
-// perror("closing session: recv_to_fifo");
- set_eof(fd);
- }
- return 0;
- }
-#endif
- if (len <= 0) { //Normal connection end.
- set_eof(fd);
- return 0;
- }
-
- session[fd]->rdata_size+=len;
- session[fd]->rdata_tick = last_tick;
- return 0;
-}
-
-static int send_from_fifo(int fd)
-{
- int len;
- if( !session_isValid(fd) )
- return -1;
-
-// if (s->eof) // if we close connection, we can not send last information (you're been disconnected, etc...) [Yor]
-// return -1;
-/*
- // clear write buffer if not connected <- I really like more the idea of sending the last information. [Skotlex]
- if( session[fd]->eof )
- {
- session[fd]->wdata_size = 0;
- return -1;
- }
-*/
-
- if (session[fd]->wdata_size == 0)
- return 0;
-
-#ifdef __WIN32
- len=send(fd, (const char *)session[fd]->wdata,session[fd]->wdata_size, 0);
- if (len == SOCKET_ERROR) {
- if (WSAGetLastError() == WSAECONNABORTED) {
- ShowWarning("send_from_fifo: Software caused connection abort on session #%d\n", fd);
- session[fd]->wdata_size = 0; //Clear the send queue as we can't send anymore. [Skotlex]
- set_eof(fd);
- FD_CLR(fd, &readfds); //Remove the socket so the select() won't hang on it.
- }
- if (WSAGetLastError() != WSAEWOULDBLOCK) {
-// ShowDebug("send_from_fifo: error %d, ending connection #%d\n", WSAGetLastError(), fd);
- session[fd]->wdata_size = 0; //Clear the send queue as we can't send anymore. [Skotlex]
- set_eof(fd);
- }
- return 0;
- }
-#else
- len=send(fd, session[fd]->wdata, session[fd]->wdata_size, MSG_NOSIGNAL);
- if (len == -1)
- {
- if (errno == ECONNABORTED)
- {
- ShowWarning("send_from_fifo: Network broken (Software caused connection abort on session #%d)\n", fd);
- session[fd]->wdata_size = 0; //Clear the send queue as we can't send anymore. [Skotlex]
- set_eof(fd);
- }
- if (errno != EAGAIN) {
-// perror("closing session: send_from_fifo");
- session[fd]->wdata_size = 0; //Clear the send queue as we can't send anymore. [Skotlex]
- set_eof(fd);
- }
- return 0;
- }
-#endif
-
- //{ int i; ShowMessage("send %d : ",fd); for(i=0;i<len;i++){ ShowMessage("%02x ",session[fd]->wdata[i]); } ShowMessage("\n");}
- if(len>0){
- if((unsigned int)len<session[fd]->wdata_size){
- memmove(session[fd]->wdata,session[fd]->wdata+len,session[fd]->wdata_size-len);
- session[fd]->wdata_size-=len;
- } else {
- session[fd]->wdata_size=0;
- }
- }
- return 0;
-}
-
-void flush_fifo(int fd)
-{
- if(session[fd] != NULL && session[fd]->func_send == send_from_fifo)
- {
- set_nonblocking(fd, 1);
- send_from_fifo(fd);
- set_nonblocking(fd, 0);
- }
-}
-
-void flush_fifos(void)
-{
- int i;
- for(i=1;i<fd_max;i++)
- if(session[i] != NULL &&
- session[i]->func_send == send_from_fifo)
- send_from_fifo(i);
-}
-
-static int null_parse(int fd)
-{
- ShowMessage("null_parse : %d\n",fd);
- session[fd]->rdata_pos = session[fd]->rdata_size; //RFIFOSKIP(fd, RFIFOREST(fd)); simplify calculation
- return 0;
-}
-
-/*======================================
- * CORE : Socket Function
- *--------------------------------------
- */
-
-static int connect_client(int listen_fd)
-{
- int fd;
- struct sockaddr_in client_address;
-#ifdef __WIN32
- int len;
-#else
- socklen_t len;
-#endif
- //ShowMessage("connect_client : %d\n",listen_fd);
-
- len=sizeof(client_address);
-
- fd = accept(listen_fd,(struct sockaddr*)&client_address,&len);
-#ifdef __WIN32
- if (fd == SOCKET_ERROR || fd == INVALID_SOCKET || fd < 0) {
- ShowError("accept failed (code %i)!\n", WSAGetLastError());
- return -1;
- }
-#else
- if(fd==-1) {
- perror("accept");
- return -1;
- }
-#endif
-
- if(fd_max<=fd) fd_max=fd+1;
-
- setsocketopts(fd);
-
-#ifdef __WIN32
- {
- unsigned long val = 1;
- if (ioctlsocket(fd, FIONBIO, &val) != 0)
- ShowError("Couldn't set the socket to non-blocking mode (code %d)!\n", WSAGetLastError());
- }
-#else
- if (fcntl(fd, F_SETFL, O_NONBLOCK) == -1)
- perror("connect_client (set nonblock)");
-#endif
-
- if (ip_rules && !connect_check(*(unsigned int*)(&client_address.sin_addr))) {
- do_close(fd);
- return -1;
- } else
- FD_SET(fd,&readfds);
-
- CREATE(session[fd], struct socket_data, 1);
- CREATE_A(session[fd]->rdata, unsigned char, rfifo_size);
- CREATE_A(session[fd]->wdata, unsigned char, wfifo_size);
-
- session[fd]->max_rdata = (int)rfifo_size;
- session[fd]->max_wdata = (int)wfifo_size;
- session[fd]->func_recv = recv_to_fifo;
- session[fd]->func_send = send_from_fifo;
- if(!session[listen_fd]->func_parse)
- session[fd]->func_parse = default_func_parse;
- else
- session[fd]->func_parse = session[listen_fd]->func_parse;
- session[fd]->client_addr = client_address;
- session[fd]->rdata_tick = last_tick;
- session[fd]->type = SESSION_UNKNOWN; // undefined type
-
- //ShowMessage("new_session : %d %d\n",fd,session[fd]->eof);
- return fd;
-}
-
-int make_listen_bind(long ip,int port)
-{
- struct sockaddr_in server_address;
- int fd;
- int result;
-
- fd = (int)socket( AF_INET, SOCK_STREAM, 0 );
-
-#ifdef __WIN32
- if (fd == INVALID_SOCKET) {
- ShowError("socket() creation failed (code %d)!\n", fd, WSAGetLastError());
- exit(1);
- }
-#else
- if (fd == -1) {
- perror("make_listen_port:socket()");
- exit(1);
- }
-#endif
-
-#ifdef __WIN32
- {
- unsigned long val = 1;
- if (ioctlsocket(fd, FIONBIO, &val) != 0)
- ShowError("Couldn't set the socket to non-blocking mode (code %d)!\n", WSAGetLastError());
- }
-#else
- if (fcntl(fd, F_SETFL, O_NONBLOCK) == -1)
- perror("make_listen_bind (set nonblock)");
-#endif
-
- setsocketopts(fd);
-
- server_address.sin_family = AF_INET;
- server_address.sin_addr.s_addr = ip;
- server_address.sin_port = htons((unsigned short)port);
-
- result = bind(fd, (struct sockaddr*)&server_address, sizeof(server_address));
-#ifdef __WIN32
- if( result == SOCKET_ERROR ) {
- ShowError("bind failed (socket %d, code %d)!\n", fd, WSAGetLastError());
- exit(1);
- }
-#else
- if( result == -1 ) {
- perror("bind");
- exit(1);
- }
-#endif
- result = listen( fd, 5 );
-#ifdef __WIN32
- if( result == SOCKET_ERROR ) {
- ShowError("listen failed (socket %d, code %d)!\n", fd, WSAGetLastError());
- exit(1);
- }
-#else
- if( result != 0) { /* error */
- perror("listen");
- exit(1);
- }
-#endif
- if ( fd < 0 || fd > FD_SETSIZE )
- { //Crazy error that can happen in Windows? (info from Freya)
- ShowFatalError("listen() returned invalid fd %d!\n",fd);
- exit(1);
- }
-
- if(fd_max<=fd) fd_max=fd+1;
- FD_SET(fd, &readfds );
-
- CREATE(session[fd], struct socket_data, 1);
-
- malloc_set(session[fd],0,sizeof(*session[fd]));
- session[fd]->func_recv = connect_client;
-
- return fd;
-}
-
-int make_listen_port(int port)
-{
- return make_listen_bind(INADDR_ANY,port);
-}
-
-// Console Reciever [Wizputer]
-int console_recieve(int i) {
- int n;
- char *buf;
-
- CREATE_A(buf, char, 64);
- malloc_tsetdword(buf,0,sizeof(64));
-
- n = read(0, buf , 64);
- if ( n < 0 )
- ShowError("Console input read error\n");
- else
- {
- ShowNotice ("Sorry, the console is currently non-functional.\n");
-// session[0]->func_console(buf);
- }
-
- aFree(buf);
- return 0;
-}
-
-void set_defaultconsoleparse(int (*defaultparse)(char*))
-{
- default_console_parse = defaultparse;
-}
-
-static int null_console_parse(char *buf)
-{
- ShowMessage("null_console_parse : %s\n",buf);
- return 0;
-}
-
-// function parse table
-// To-do: -- use dynamic arrays
-// -- add a register_parse_func();
-struct func_parse_table func_parse_table[SESSION_MAX];
-
-int default_func_check (struct socket_data *sd) { return 1; }
-
-void func_parse_check (struct socket_data *sd)
-{
- int i;
- for (i = SESSION_HTTP; i < SESSION_MAX; i++) {
- if (func_parse_table[i].func &&
- func_parse_table[i].check &&
- func_parse_table[i].check(sd) != 0)
- {
- sd->type = i;
- sd->func_parse = func_parse_table[i].func;
- return;
- }
- }
-
- // undefined -- treat as raw socket (using default parse)
- sd->type = SESSION_RAW;
-}
-
-// Console Input [Wizputer]
-int start_console(void) {
-
- //Until a better plan is came up with... can't be using session[0] anymore! [Skotlex]
- ShowNotice("The console is currently nonfunctional.\n");
- return 0;
-
- FD_SET(0,&readfds);
-
- if (!session[0]) { // dummy socket already uses fd 0
- CREATE(session[0], struct socket_data, 1);
- }
- malloc_set(session[0],0,sizeof(*session[0]));
-
- session[0]->func_recv = console_recieve;
- session[0]->func_console = default_console_parse;
-
- return 0;
-}
-
-int make_connection(long ip,int port)
-{
- struct sockaddr_in server_address;
- int fd;
- int result;
-
- fd = (int)socket( AF_INET, SOCK_STREAM, 0 );
-
-#ifdef __WIN32
- if (fd == INVALID_SOCKET) {
- ShowError("socket() creation failed (code %d)!\n", fd, WSAGetLastError());
- return -1;
- }
-#else
- if (fd == -1) {
- perror("make_connection:socket()");
- return -1;
- }
-#endif
-
- setsocketopts(fd);
-
- server_address.sin_family = AF_INET;
- server_address.sin_addr.s_addr = ip;
- server_address.sin_port = htons((unsigned short)port);
-
- ShowStatus("Connecting to %d.%d.%d.%d:%i\n",
- (ip)&0xFF,(ip>>8)&0xFF,(ip>>16)&0xFF,(ip>>24)&0xFF,port);
-
- result = connect(fd, (struct sockaddr *)(&server_address), sizeof(struct sockaddr_in));
-#ifdef __WIN32
- if( result == SOCKET_ERROR ) {
- ShowError("connect failed (socket %d, code %d)!\n", fd, WSAGetLastError());
- do_close(fd);
- return -1;
- }
-#else
- if (result < 0) { //This is only used when the map/char server try to connect to each other, so it can be handled. [Skotlex]
- perror("make_connection");
- do_close(fd);
- return -1;
- }
-#endif
-//Now the socket can be made non-blocking. [Skotlex]
-#ifdef __WIN32
- {
- unsigned long val = 1;
- if (ioctlsocket(fd, FIONBIO, &val) != 0)
- ShowError("Couldn't set the socket to non-blocking mode (code %d)!\n", WSAGetLastError());
- }
-#else
- if (fcntl(fd, F_SETFL, O_NONBLOCK) == -1)
- perror("make_connection (set nonblock)");
-#endif
-
- if (fd_max <= fd)
- fd_max = fd + 1;
- FD_SET(fd,&readfds);
-
- CREATE(session[fd], struct socket_data, 1);
- CREATE_A(session[fd]->rdata, unsigned char, rfifo_size);
- CREATE_A(session[fd]->wdata, unsigned char, wfifo_size);
-
- session[fd]->max_rdata = (int)rfifo_size;
- session[fd]->max_wdata = (int)wfifo_size;
- session[fd]->func_recv = recv_to_fifo;
- session[fd]->func_send = send_from_fifo;
- session[fd]->func_parse = default_func_parse;
- session[fd]->rdata_tick = last_tick;
-
- return fd;
-}
-
-void free_session_mem(int fd)
-{
- if (session[fd]){
- if (session[fd]->rdata)
- aFree(session[fd]->rdata);
- if (session[fd]->wdata)
- aFree(session[fd]->wdata);
- if (session[fd]->session_data)
- aFree(session[fd]->session_data);
- aFree(session[fd]);
- session[fd] = NULL;
- }
-}
-
-int delete_session(int fd)
-{
- if (fd <= 0 || fd >= FD_SETSIZE)
- return -1;
- FD_CLR(fd, &readfds);
- free_session_mem(fd);
- //ShowMessage("delete_session:%d\n",fd);
- return 0;
-}
-
-int realloc_fifo(int fd,unsigned int rfifo_size,unsigned int wfifo_size)
-{
- if( !session_isValid(fd) )
- return 0;
-
- if( session[fd]->max_rdata != rfifo_size && session[fd]->rdata_size < rfifo_size){
- RECREATE(session[fd]->rdata, unsigned char, rfifo_size);
- session[fd]->max_rdata = rfifo_size;
- }
-
- if( session[fd]->max_wdata != wfifo_size && session[fd]->wdata_size < wfifo_size){
- RECREATE(session[fd]->wdata, unsigned char, wfifo_size);
- session[fd]->max_wdata = wfifo_size;
- }
- return 0;
-}
-
-int realloc_writefifo(int fd, size_t addition)
-{
- size_t newsize;
-
- if( !session_isValid(fd) ) // might not happen
- return 0;
-
- if( session[fd]->wdata_size + (int)addition > session[fd]->max_wdata )
- { // grow rule; grow in multiples of wfifo_size
- newsize = wfifo_size;
- while( session[fd]->wdata_size + addition > newsize ) newsize += newsize;
- }
- else if( session[fd]->max_wdata>=FIFOSIZE_SERVERLINK) {
- //Inter-server adjust. [Skotlex]
- if ((session[fd]->wdata_size+(int)addition)*4 < session[fd]->max_wdata)
- newsize = session[fd]->max_wdata/2;
- else
- return 0; //No change
- } else if( session[fd]->max_wdata>(int)wfifo_size &&
- (session[fd]->wdata_size+(int)addition)*4 < session[fd]->max_wdata )
- { // shrink rule, shrink by 2 when only a quater of the fifo is used, don't shrink below 4*addition
- newsize = session[fd]->max_wdata/2;
- }
- else // no change
- return 0;
-
- RECREATE(session[fd]->wdata, unsigned char, newsize);
- session[fd]->max_wdata = (int)newsize;
-
- return 0;
-}
-
-int WFIFOSET(int fd,int len)
-{
- size_t newreserve;
- struct socket_data *s = session[fd];
-
- if( !session_isValid(fd) || s->wdata == NULL )
- return 0;
-
- // we have written len bytes to the buffer already before calling WFIFOSET
- if(s->wdata_size+len > s->max_wdata)
- { // actually there was a buffer overflow already
- unsigned char *sin_addr = (unsigned char *)&s->client_addr.sin_addr;
- ShowFatalError("socket: Buffer Overflow. Connection %d (%d.%d.%d.%d) has written %d byteson a %d/%d bytes buffer.\n", fd,
- sin_addr[0], sin_addr[1], sin_addr[2], sin_addr[3], len, s->wdata_size, s->max_wdata);
- ShowDebug("Likely command that caused it: 0x%x\n",
- (*(unsigned short*)(s->wdata+s->wdata_size)));
- // no other chance, make a better fifo model
- exit(1);
- }
-
- s->wdata_size += len;
- // always keep a wfifo_size reserve in the buffer
- // For inter-server connections, let the reserve be 1/8th of the link size.
- newreserve = s->wdata_size + (s->max_wdata>=FIFOSIZE_SERVERLINK?FIFOSIZE_SERVERLINK<<3:wfifo_size);
-
- if(s->wdata_size >= frame_size)
- send_from_fifo(fd);
-
- // realloc after sending
- // readfifo does not need to be realloced at all
- // Even the inter-server buffer may need reallocating! [Skotlex]
- realloc_writefifo(fd, newreserve);
-
- return 0;
-}
-
-int do_sendrecv(int next)
-{
- fd_set rfd,efd; //Added the Error Set so that such sockets can be made eof. They are the same as the rfd for now. [Skotlex]
- struct sockaddr_in addr_check;
- struct timeval timeout;
- int ret,i,size;
-
- last_tick = time(0);
-
-
- //PRESEND Need to do this to ensure that the clients get something to do
- //which hopefully will cause them to send packets. [Meruru]
- for (i = 1; i < fd_max; i++)
- {
- if(!session[i])
- continue;
-
- if(session[i]->wdata_size && session[i]->func_send)
- session[i]->func_send(i);
- }
-
- timeout.tv_sec = next/1000;
- timeout.tv_usec = next%1000*1000;
-
- for(memcpy(&rfd, &readfds, sizeof(rfd)),
- memcpy(&efd, &readfds, sizeof(efd));
- (ret = select(fd_max, &rfd, NULL, &efd, &timeout))<0;
- memcpy(&rfd, &readfds, sizeof(rfd)),
- memcpy(&efd, &readfds, sizeof(efd)))
- {
- if(serrno != SEBADF)
- return 0;
-
- //Well then the error is due to a bad socket. Lets find and remove it
- //and try again
- for(i = 1; i < fd_max; i++)
- {
- if(!session[i])
- continue;
-
- //check the validity of the socket. Does what the last thing did
- //just alot faster [Meruru]
- size = sizeof(struct sockaddr);
- if(getsockname(i,(struct sockaddr*)&addr_check,&size)<0)
- if(serrno == SEBADF) //See the #defines at the top
- {
- free_session_mem(i); //free the bad session
- continue;
- }
-
- FD_SET(i,&readfds);
- ret = i;
- }
-
- fd_max = ret;
- }
-
- //ok under windows to use FD_ISSET is FUCKING stupid
- //because windows uses an array so lets do them part by part [Meruru]
-#ifdef _WIN32
- //Do the socket sets. Unlike linux which uses a bit mask windows uses
- //a array. So calls to FS_ISSET are SLOW AS SHIT. So we have to do
- //a special case for them which actually turns out ok [Meruru]
- for(i=0;i<(int)rfd.fd_count;i++)
- {
- if(session[rfd.fd_array[i]] &&
- session[rfd.fd_array[i]]->func_recv)
- session[rfd.fd_array[i]]->func_recv(rfd.fd_array[i]);
- }
- for(i=0;i<(int)efd.fd_count;i++)
- set_eof(efd.fd_array[i]);
-
- for (i = 1; i < fd_max; i++)
- {
- if(!session[i])
- continue;
-
- //POSTSEND: Does write EVER BLOCK? NO!! not unless WE ARE CURRENTLY SENDING SOMETHING
- //Or just have opened a connection and dont know if its ready
- //And since eA isn't multi threaded and all the sockets are non blocking THIS ISNT A PROBLEM! [Meruru]
-
- if(session[i]->wdata_size && session[i]->func_send)
- session[i]->func_send(i);
-
- if(session[i] && session[i]->eof) //The session check is for when the connection ended in func_parse
- { //Finally, even if there is no data to parse, connections signalled eof should be closed, so we call parse_func [Skotlex]
- if (session[i]->func_parse)
- session[i]->func_parse(i); //This should close the session inmediately.
- }
- }
-
-#else //where under linux its just a bit check so its smart [Meruru]
-
- for (i = 1; i < fd_max; i++){
- if(!session[i])
- continue;
-
- if(FD_ISSET(i,&efd)){
- //ShowMessage("error:%d\n",i);
- ShowDebug("do_sendrecv: Connection error on Session %d.\n", i);
- set_eof(i);
- continue;
- }
-
-
- if(FD_ISSET(i,&rfd)){
- //ShowMessage("read:%d\n",i);
- if(session[i]->func_recv)
- session[i]->func_recv(i);
- }
-
- //Does write EVER BLOCK. NO not unless WE ARE CURRENTALLY SENDING SOMETHING
- //And sence eA isnt multi threaded THIS ISNT A PROBLEM!
- if(session[i]->wdata_size && session[i]->func_send)
- session[i]->func_send(i);
-
- if(session[i] && session[i]->eof) //The session check is for when the connection ended in func_parse
- { //Finally, even if there is no data to parse, connections signalled eof should be closed, so we call parse_func [Skotlex]
- if (session[i]->func_parse)
- session[i]->func_parse(i); //This should close the session inmediately.
- }
- }
-#endif
-
- return 0;
-}
-
-int do_parsepacket(void)
-{
- int i;
- struct socket_data *sd;
- for(i = 1; i < fd_max; i++){
- sd = session[i];
- if(!sd)
- continue;
- if (sd->rdata_tick && DIFF_TICK(last_tick,sd->rdata_tick) > stall_time) {
- ShowInfo ("Session #%d timed out\n", i);
- sd->eof = 1;
- }
- if(sd->rdata_size == 0 && sd->eof == 0)
- continue;
- if(sd->func_parse){
- if(sd->type == SESSION_UNKNOWN)
- func_parse_check(sd);
- if(sd->type != SESSION_UNKNOWN)
- sd->func_parse(i);
- if(!session[i])
- continue;
- /* after parse, check client's RFIFO size to know if there is an invalid packet (too big and not parsed) */
- if (session[i]->rdata_size == rfifo_size && session[i]->max_rdata == rfifo_size) {
- session[i]->eof = 1;
- continue;
- }
- }
- RFIFOFLUSH(i);
- }
- return 0;
-}
-
-/* DDoS 攻撃対策 */
-#ifndef MINICORE
-struct _access_control {
- unsigned int ip;
- unsigned int mask;
-};
-
-struct _connect_history {
- struct _connect_history *next;
- struct _connect_history *prev;
- int status;
- int count;
- unsigned int ip;
- unsigned int tick;
-};
-static struct _connect_history *connect_history[0x10000];
-static int connect_check_(unsigned int ip);
-
-// 接続できるかどうかの確認
-// false : 接続OK
-// true : 接続NG
-static int connect_check(unsigned int ip) {
- int result = connect_check_(ip);
- if(access_debug) {
- ShowMessage("connect_check: Connection from %d.%d.%d.%d %s\n",
- CONVIP(ip),result ? "allowed." : "denied!");
- }
- return result;
-}
-
-static int connect_check_(unsigned int ip) {
- struct _connect_history *hist = connect_history[ip & 0xFFFF];
- struct _connect_history *hist_new;
- int i,is_allowip = 0,is_denyip = 0,connect_ok = 0;
-
- // allow , deny リストに入っているか確認
- for(i = 0;i < access_allownum; i++) {
- if((ip & access_allow[i].mask) == (access_allow[i].ip & access_allow[i].mask)) {
- if(access_debug) {
- ShowMessage("connect_check: Found match from allow list:%d.%d.%d.%d IP:%d.%d.%d.%d Mask:%d.%d.%d.%d\n",
- CONVIP(ip),
- CONVIP(access_allow[i].ip),
- CONVIP(access_allow[i].mask));
- }
- is_allowip = 1;
- break;
- }
- }
- for(i = 0;i < access_denynum; i++) {
- if((ip & access_deny[i].mask) == (access_deny[i].ip & access_deny[i].mask)) {
- if(access_debug) {
- ShowMessage("connect_check: Found match from deny list:%d.%d.%d.%d IP:%d.%d.%d.%d Mask:%d.%d.%d.%d\n",
- CONVIP(ip),
- CONVIP(access_deny[i].ip),
- CONVIP(access_deny[i].mask));
- }
- is_denyip = 1;
- break;
- }
- }
- // コネクト出来るかどうか確認
- // connect_ok
- // 0 : 無条件に拒否
- // 1 : 田代砲チェックの結果次第
- // 2 : 無条件に許可
- switch(access_order) {
- case ACO_DENY_ALLOW:
- default:
- if(is_allowip) {
- connect_ok = 2;
- } else if(is_denyip) {
- connect_ok = 0;
- } else {
- connect_ok = 1;
- }
- break;
- case ACO_ALLOW_DENY:
- if(is_denyip) {
- connect_ok = 0;
- } else if(is_allowip) {
- connect_ok = 2;
- } else {
- connect_ok = 1;
- }
- break;
- case ACO_MUTUAL_FAILTURE:
- if(is_allowip) {
- connect_ok = 2;
- } else {
- connect_ok = 0;
- }
- break;
- }
-
- // 接続履歴を調べる
- while(hist) {
- if(ip == hist->ip) {
- // 同じIP発見
- if(hist->status) {
- // ban フラグが立ってる
- return (connect_ok == 2 ? 1 : 0);
- } else if(DIFF_TICK(gettick(),hist->tick) < ddos_interval) {
- // ddos_interval秒以内にリクエスト有り
- hist->tick = gettick();
- if(hist->count++ >= ddos_count) {
- // ddos 攻撃を検出
- hist->status = 1;
- ShowWarning("connect_check: DDOS Attack detected from %d.%d.%d.%d!\n",
- CONVIP(ip));
- return (connect_ok == 2 ? 1 : 0);
- } else {
- return connect_ok;
- }
- } else {
- // ddos_interval秒以内にリクエスト無いのでタイマークリア
- hist->tick = gettick();
- hist->count = 0;
- return connect_ok;
- }
- }
- hist = hist->next;
- }
- // IPリストに無いので新規作成
- hist_new = (struct _connect_history *) aCalloc(1,sizeof(struct _connect_history));
- hist_new->ip = ip;
- hist_new->tick = gettick();
- if(connect_history[ip & 0xFFFF] != NULL) {
- hist = connect_history[ip & 0xFFFF];
- hist->prev = hist_new;
- hist_new->next = hist;
- }
- connect_history[ip & 0xFFFF] = hist_new;
- return connect_ok;
-}
-
-static int connect_check_clear(int tid,unsigned int tick,int id,int data) {
- int i;
- int clear = 0;
- int list = 0;
- struct _connect_history *hist , *hist2;
- for(i = 0;i < 0x10000 ; i++) {
- hist = connect_history[i];
- while(hist) {
- if ((DIFF_TICK(tick,hist->tick) > ddos_interval * 3 && !hist->status) ||
- (DIFF_TICK(tick,hist->tick) > ddos_autoreset && hist->status)) {
- // clear data
- hist2 = hist->next;
- if(hist->prev) {
- hist->prev->next = hist->next;
- } else {
- connect_history[i] = hist->next;
- }
- if(hist->next) {
- hist->next->prev = hist->prev;
- }
- aFree(hist);
- hist = hist2;
- clear++;
- } else {
- hist = hist->next;
- }
- list++;
- }
- }
- if(access_debug) {
- ShowMessage("connect_check_clear: Cleared %d of %d from IP list.\n", clear, list);
- }
- return list;
-}
-
-// IPマスクチェック
-int access_ipmask(const char *str,struct _access_control* acc)
-{
- unsigned int mask=0,i=0,m,ip, a0,a1,a2,a3;
- if( !strcmp(str,"all") ) {
- ip = 0;
- mask = 0;
- } else {
- if( sscanf(str,"%d.%d.%d.%d%n",&a0,&a1,&a2,&a3,&i)!=4 || i==0) {
- ShowError("access_ipmask: Unknown format %s!\n",str);
- return 0;
- }
- ip = (a3 << 24) | (a2 << 16) | (a1 << 8) | a0;
-
- if(sscanf(str+i,"/%d.%d.%d.%d",&a0,&a1,&a2,&a3)==4 ){
- mask = (a3 << 24) | (a2 << 16) | (a1 << 8) | a0;
- } else if(sscanf(str+i,"/%d",&m) == 1) {
- for(i=0;i<m;i++) {
- mask = (mask >> 1) | 0x80000000;
- }
- mask = ntohl(mask);
- } else {
- mask = 0xFFFFFFFF;
- }
- }
- if(access_debug) {
- ShowMessage("access_ipmask: Loaded IP:%d.%d.%d.%d mask:%d.%d.%d.%d\n",
- CONVIP(ip), CONVIP(mask));
- }
- acc->ip = ip;
- acc->mask = mask;
- return 1;
-}
-#endif
-
-int socket_config_read(const char *cfgName) {
- int i;
- char line[1024],w1[1024],w2[1024];
- FILE *fp;
-
- fp=fopen(cfgName, "r");
- if(fp==NULL){
- ShowError("File not found: %s\n", cfgName);
- return 1;
- }
- while(fgets(line,1020,fp)){
- if(line[0] == '/' && line[1] == '/')
- continue;
- i=sscanf(line,"%[^:]: %[^\r\n]",w1,w2);
- if(i!=2)
- continue;
- if(strcmpi(w1,"stall_time")==0){
- stall_time = atoi(w2);
- #ifndef MINICORE
- } else if(strcmpi(w1,"enable_ip_rules")==0){
- if(strcmpi(w2,"yes")==0)
- ip_rules = 1;
- else if(strcmpi(w2,"no")==0)
- ip_rules = 0;
- else ip_rules = atoi(w2);
- } else if(strcmpi(w1,"order")==0){
- access_order=atoi(w2);
- if(strcmpi(w2,"deny,allow")==0) access_order=ACO_DENY_ALLOW;
- if(strcmpi(w2,"allow,deny")==0) access_order=ACO_ALLOW_DENY;
- if(strcmpi(w2,"mutual-failure")==0) access_order=ACO_MUTUAL_FAILTURE;
- } else if(strcmpi(w1,"allow")==0){
- access_allow = (struct _access_control *) aRealloc(access_allow,(access_allownum+1)*sizeof(struct _access_control));
- if(access_ipmask(w2,&access_allow[access_allownum])) {
- access_allownum++;
- }
- } else if(strcmpi(w1,"deny")==0){
- access_deny = (struct _access_control *) aRealloc(access_deny,(access_denynum+1)*sizeof(struct _access_control));
- if(access_ipmask(w2,&access_deny[access_denynum])) {
- access_denynum++;
- }
- } else if(!strcmpi(w1,"ddos_interval")){
- ddos_interval = atoi(w2);
- } else if(!strcmpi(w1,"ddos_count")){
- ddos_count = atoi(w2);
- } else if(!strcmpi(w1,"ddos_autoreset")){
- ddos_autoreset = atoi(w2);
- } else if(!strcmpi(w1,"debug")){
- if(strcmpi(w2,"yes")==0)
- access_debug = 1;
- else if(strcmpi(w2,"no")==0)
- access_debug = 0;
- else access_debug = atoi(w2);
- #endif
- } else if (strcmpi(w1, "mode_neg") == 0)
- {
- if(strcmpi(w2,"yes")==0)
- mode_neg = 1;
- else if(strcmpi(w2,"no")==0)
- mode_neg = 0;
- else mode_neg = atoi(w2);
- } else if (strcmpi(w1, "frame_size") == 0)
- frame_size = strtoul(w2, NULL, 10);
- else if (strcmpi(w1, "import") == 0)
- socket_config_read(w2);
- }
- fclose(fp);
- return 0;
-}
-
-int RFIFOSKIP(int fd,int len)
-{
- struct socket_data *s;
-
- if ( !session_isActive(fd) ) //Nullpo error here[Kevin]
- return 0;
-
- s = session[fd];
-
- if ((signed int)(s->rdata_size-s->rdata_pos-len)<0) {
- //fprintf(stderr,"too many skip\n");
- //exit(1);
- //better than a COMPLETE program abort // TEST! :)
- ShowError("too many skip (%d) now skipped: %d (FD: %d)\n", len, RFIFOREST(fd), fd);
- len = RFIFOREST(fd);
- }
- s->rdata_pos = s->rdata_pos+len;
- return 0;
-}
-
-
-unsigned int addr_[16]; // ip addresses of local host (host byte order)
-unsigned int naddr_ = 0; // # of ip addresses
-
-void socket_final (void)
-{
- int i;
-#ifndef MINICORE
- struct _connect_history *hist , *hist2;
- for(i = 0; i < 0x10000; i++) {
- hist = connect_history[i];
- while(hist) {
- hist2 = hist->next;
- aFree(hist);
- hist = hist2;
- }
- }
- if (access_allow)
- aFree(access_allow);
- if (access_deny)
- aFree(access_deny);
-#endif
-
- for (i = 1; i < fd_max; i++) {
- if(session[i])
- delete_session(i);
- }
-
- // session[0] のダミーデータを削除
- aFree(session[0]->rdata);
- aFree(session[0]->wdata);
- aFree(session[0]);
-}
-
-//Closes a socket.
-//Needed to simplify shutdown code as well as manage the subtle differences in socket management from Windows and *nix.
-void do_close(int fd)
-{
-//We don't really care if these closing functions return an error, we are just shutting down and not reusing this socket.
-#ifdef __WIN32
-// shutdown(fd, SD_BOTH); //FIXME: Shutdown requires winsock2.h! What would be the proper shutting down method for winsock1?
- if (session[fd] && session[fd]->func_send == send_from_fifo)
- session[fd]->func_send(fd); //Flush the data as it is gonna be closed down, but it may not succeed as it is a nonblocking socket! [Skotlex]
- closesocket(fd);
-#else
- if (close(fd))
- perror("do_close: close");
-#endif
- if (session[fd])
- delete_session(fd);
-}
-
-void socket_init (void)
-{
- char *SOCKET_CONF_FILENAME = "conf/packet_athena.conf";
-#ifdef __WIN32
- char** a;
- unsigned int i;
- char fullhost[255];
- struct hostent* hent;
-
- /* Start up the windows networking */
- WORD version_wanted = MAKEWORD(1, 1); //Demand at least WinSocket version 1.1 (from Freya)
- WSADATA wsaData;
-
- if ( WSAStartup(version_wanted, &wsaData) != 0 ) {
- ShowFatalError("SYSERR: WinSock not available!\n");
- exit(1);
- }
-
- if(gethostname(fullhost, sizeof(fullhost)) == SOCKET_ERROR) {
- ShowError("Ugg.. no hostname defined!\n");
- return;
- }
-
- // XXX This should look up the local IP addresses in the registry
- // instead of calling gethostbyname. However, the way IP addresses
- // are stored in the registry is annoyingly complex, so I'll leave
- // this as T.B.D.
- hent = gethostbyname(fullhost);
- if (hent == NULL) {
- ShowError("Cannot resolve our own hostname to a IP address");
- return;
- }
-
- a = hent->h_addr_list;
- for(i = 0; a[i] != 0 && i < 16; ++i) {
- unsigned long addr1 = ntohl(*(unsigned long*) a[i]);
- addr_[i] = addr1;
- }
- naddr_ = i;
-#else
- int pos;
- int fdes = socket(AF_INET, SOCK_STREAM, 0);
- char buf[16 * sizeof(struct ifreq)];
- struct ifconf ic;
-
- // The ioctl call will fail with Invalid Argument if there are more
- // interfaces than will fit in the buffer
- ic.ifc_len = sizeof(buf);
- ic.ifc_buf = buf;
- if(ioctl(fdes, SIOCGIFCONF, &ic) == -1) {
- ShowError("SIOCGIFCONF failed!\n");
- return;
- }
-
- for(pos = 0; pos < ic.ifc_len;)
- {
- struct ifreq * ir = (struct ifreq *) (ic.ifc_buf + pos);
-
- struct sockaddr_in * a = (struct sockaddr_in *) &(ir->ifr_addr);
-
- if(a->sin_family == AF_INET) {
- u_long ad = ntohl(a->sin_addr.s_addr);
- if(ad != INADDR_LOOPBACK && ad != INADDR_ANY) {
- addr_[naddr_ ++] = ad;
- if(naddr_ == 16)
- break;
- }
- }
-
- #if defined(_AIX) || defined(__APPLE__)
- pos += ir->ifr_addr.sa_len; // For when we port athena to run on Mac's :)
- pos += sizeof(ir->ifr_name);
- #else
- pos += sizeof(struct ifreq);
- #endif
- }
-#endif
-
- FD_ZERO(&readfds);
-
- socket_config_read(SOCKET_CONF_FILENAME);
-
- // initialise last send-receive tick
- last_tick = time(0);
-
- // session[0] Was for the console (whatever that was?), but is now currently used for disconnected sessions of the map
- // server, and as such, should hold enough buffer (it is a vacuum so to speak) as it is never flushed. [Skotlex]
- CREATE(session[0], struct socket_data, 1);
- CREATE_A(session[0]->rdata, unsigned char, 2*rfifo_size);
- CREATE_A(session[0]->wdata, unsigned char, 2*wfifo_size);
- session[0]->max_rdata = (int)2*rfifo_size;
- session[0]->max_wdata = (int)2*wfifo_size;
-
- malloc_set (func_parse_table, 0, sizeof(func_parse_table));
- func_parse_table[SESSION_RAW].check = default_func_check;
- func_parse_table[SESSION_RAW].func = default_func_parse;
-
-#ifndef MINICORE
- // とりあえず5分ごとに不要なデータを削除する
- add_timer_func_list(connect_check_clear, "connect_check_clear");
- add_timer_interval(gettick()+1000,connect_check_clear,0,0,300*1000);
-#endif
-}
-
-
-bool session_isValid(int fd)
-{ //End of Exam has pointed out that fd==0 is actually an unconnected session! [Skotlex]
- //But this is not so true, it is used... for... something. The console uses it, would this not cause problems? [Skotlex]
- return ( (fd>0) && (fd<FD_SETSIZE) && (NULL!=session[fd]) );
-}
-
-bool session_isActive(int fd)
-{
- return ( session_isValid(fd) && !session[fd]->eof );
-}
-
-in_addr_t resolve_hostbyname(char* hostname, unsigned char *ip, char *ip_str) {
- struct hostent *h = gethostbyname(hostname);
- char ip_buf[16];
- unsigned char ip2[4];
- if (!h) return 0;
- if (ip == NULL) ip = ip2;
- ip[0] = (unsigned char) h->h_addr[0];
- ip[1] = (unsigned char) h->h_addr[1];
- ip[2] = (unsigned char) h->h_addr[2];
- ip[3] = (unsigned char) h->h_addr[3];
- if (ip_str == NULL) ip_str = ip_buf;
- sprintf(ip_str, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
- return inet_addr(ip_str);
-}
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <errno.h>
+
+#ifdef __WIN32
+#define __USE_W32_SOCKETS
+#include <windows.h>
+#include <winsock.h>
+#include <io.h>
+
+typedef int socklen_t;
+#else
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netinet/tcp.h>
+#include <net/if.h>
+#include <unistd.h>
+#include <sys/time.h>
+#include <sys/ioctl.h>
+#include <netdb.h>
+#include <arpa/inet.h>
+
+#ifndef SIOCGIFCONF
+#include <sys/sockio.h> // SIOCGIFCONF on Solaris, maybe others? [Shinomori]
+#endif
+
+#endif
+
+#ifdef _WIN32
+#define SEBADF WSAENOTSOCK
+#define serrno WSAGetLastError()
+#else
+#define SEBADF EBADF
+#define serrno errno
+#endif
+
+#include <fcntl.h>
+#include <string.h>
+
+#include "../common/socket.h"
+#include "../common/mmo.h" // [Valaris] thanks to fov
+#include "../common/timer.h"
+#include "../common/malloc.h"
+#include "../common/showmsg.h"
+
+fd_set readfds;
+int fd_max;
+time_t last_tick;
+time_t stall_time = 60;
+int ip_rules = 1;
+
+// reuse port
+#ifndef SO_REUSEPORT
+ #define SO_REUSEPORT 15
+#endif
+
+#ifndef TCP_FRAME_LEN
+#define TCP_FRAME_LEN 1024
+#endif
+
+static int mode_neg=1;
+static size_t frame_size=TCP_FRAME_LEN;
+
+#ifndef MINICORE
+enum {
+ ACO_DENY_ALLOW=0,
+ ACO_ALLOW_DENY,
+ ACO_MUTUAL_FAILTURE,
+};
+
+static struct _access_control *access_allow;
+static struct _access_control *access_deny;
+static int access_order=ACO_DENY_ALLOW;
+static int access_allownum=0;
+static int access_denynum=0;
+static int access_debug=0;
+static int ddos_count = 10;
+static int ddos_interval = 3000;
+static int ddos_autoreset = 600*1000;
+#endif
+
+
+// values derived from freya
+// a player that send more than 2k is probably a hacker without be parsed
+// biggest known packet: S 0153 <len>.w <emblem data>.?B -> 24x24 256 color .bmp (0153 + len.w + 1618/1654/1756 bytes)
+size_t rfifo_size = (16*1024);
+size_t wfifo_size = (16*1024);
+
+#define CONVIP(ip) ip&0xFF,(ip>>8)&0xFF,(ip>>16)&0xFF,ip>>24
+
+struct socket_data *session[FD_SETSIZE];
+
+static int null_parse(int fd);
+static int (*default_func_parse)(int) = null_parse;
+
+static int null_console_parse(char *buf);
+static int (*default_console_parse)(char*) = null_console_parse;
+#ifndef MINICORE
+static int connect_check(unsigned int ip);
+#else
+ #define connect_check(n) 1
+#endif
+
+/*======================================
+ * CORE : Set function
+ *--------------------------------------
+ */
+void set_defaultparse(int (*defaultparse)(int))
+{
+ default_func_parse = defaultparse;
+}
+
+void set_nonblocking(int fd, int yes) {
+ // I don't think we need this
+ // TCP_NODELAY BOOL Disables the Nagle algorithm for send coalescing.
+ if(mode_neg)
+ setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,(char *)&yes,sizeof yes);
+
+ // FIONBIO Use with a nonzero argp parameter to enable the nonblocking mode of socket s.
+ // The argp parameter is zero if nonblocking is to be disabled.
+#ifdef __WIN32
+ ioctlsocket(fd, FIONBIO, &yes);
+#else
+ ioctl(fd,FIONBIO,&yes);
+#endif
+}
+
+static void setsocketopts(int fd)
+{
+ int yes = 1; // reuse fix
+#ifndef WIN32
+ // set SO_REAUSEADDR to true, unix only. on windows this option causes
+ // the previous owner of the socket to give up, which is not desirable
+ // in most cases, neither compatible with unix.
+ setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,(char *)&yes,sizeof(yes));
+#ifdef SO_REUSEPORT
+ setsockopt(fd,SOL_SOCKET,SO_REUSEPORT,(char *)&yes,sizeof(yes));
+#endif
+#endif
+ setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,(char *)&yes,sizeof(yes));
+// setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (char *) &wfifo_size , sizeof(rfifo_size ));
+// setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (char *) &rfifo_size , sizeof(rfifo_size ));
+#ifdef __WIN32
+{ //set SO_LINGER option (from Freya)
+ //(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/closesocket_2.asp)
+ struct linger opt;
+ opt.l_onoff = 1;
+ opt.l_linger = 0;
+ if (setsockopt(fd, SOL_SOCKET, SO_LINGER, (char*)&opt, sizeof(opt)))
+ ShowWarning("setsocketopts: Unable to set SO_LINGER mode for connection %d!\n",fd);
+}
+#endif
+}
+
+/*======================================
+ * CORE : Socket Sub Function
+ *--------------------------------------
+ */
+static void set_eof(int fd)
+{ //Marks a connection eof and invokes the parse_function to disconnect it right away. [Skotlex]
+ if (session_isActive(fd))
+ session[fd]->eof=1;
+}
+
+static int recv_to_fifo(int fd)
+{
+ int len;
+
+ if( (fd<0) || (fd>=FD_SETSIZE) || (NULL==session[fd]) )
+ return -1;
+
+ if(session[fd]->eof)
+ return -1;
+
+#ifdef __WIN32
+ len=recv(fd,(char *)session[fd]->rdata+session[fd]->rdata_size, RFIFOSPACE(fd), 0);
+ if (len == SOCKET_ERROR) {
+ if (WSAGetLastError() == WSAECONNABORTED) {
+ ShowWarning("recv_to_fifo: Software caused connection abort on session #%d\n", fd);
+ FD_CLR(fd, &readfds); //Remove the socket so the select() won't hang on it.
+// exit(1); //Windows can't really recover from this one. [Skotlex]
+ }
+ if (WSAGetLastError() != WSAEWOULDBLOCK) {
+// ShowDebug("recv_to_fifo: error %d, ending connection #%d\n", WSAGetLastError(), fd);
+ set_eof(fd);
+ }
+ return 0;
+ }
+#else
+ len=read(fd,session[fd]->rdata+session[fd]->rdata_size, RFIFOSPACE(fd));
+ if (len == -1)
+ {
+ if (errno == ECONNABORTED)
+ {
+ ShowFatalError("recv_to_fifo: Network broken (Software caused connection abort on session #%d)\n", fd);
+// exit(1); //Temporal debug, maybe this can be fixed.
+ }
+ if (errno != EAGAIN) { //Connection error.
+// perror("closing session: recv_to_fifo");
+ set_eof(fd);
+ }
+ return 0;
+ }
+#endif
+ if (len <= 0) { //Normal connection end.
+ set_eof(fd);
+ return 0;
+ }
+
+ session[fd]->rdata_size+=len;
+ session[fd]->rdata_tick = last_tick;
+ return 0;
+}
+
+static int send_from_fifo(int fd)
+{
+ int len;
+ if( !session_isValid(fd) )
+ return -1;
+
+// if (s->eof) // if we close connection, we can not send last information (you're been disconnected, etc...) [Yor]
+// return -1;
+/*
+ // clear write buffer if not connected <- I really like more the idea of sending the last information. [Skotlex]
+ if( session[fd]->eof )
+ {
+ session[fd]->wdata_size = 0;
+ return -1;
+ }
+*/
+
+ if (session[fd]->wdata_size == 0)
+ return 0;
+
+#ifdef __WIN32
+ len=send(fd, (const char *)session[fd]->wdata,session[fd]->wdata_size, 0);
+ if (len == SOCKET_ERROR) {
+ if (WSAGetLastError() == WSAECONNABORTED) {
+ ShowWarning("send_from_fifo: Software caused connection abort on session #%d\n", fd);
+ session[fd]->wdata_size = 0; //Clear the send queue as we can't send anymore. [Skotlex]
+ set_eof(fd);
+ FD_CLR(fd, &readfds); //Remove the socket so the select() won't hang on it.
+ }
+ if (WSAGetLastError() != WSAEWOULDBLOCK) {
+// ShowDebug("send_from_fifo: error %d, ending connection #%d\n", WSAGetLastError(), fd);
+ session[fd]->wdata_size = 0; //Clear the send queue as we can't send anymore. [Skotlex]
+ set_eof(fd);
+ }
+ return 0;
+ }
+#else
+ len=send(fd, session[fd]->wdata, session[fd]->wdata_size, MSG_NOSIGNAL);
+ if (len == -1)
+ {
+ if (errno == ECONNABORTED)
+ {
+ ShowWarning("send_from_fifo: Network broken (Software caused connection abort on session #%d)\n", fd);
+ session[fd]->wdata_size = 0; //Clear the send queue as we can't send anymore. [Skotlex]
+ set_eof(fd);
+ }
+ if (errno != EAGAIN) {
+// perror("closing session: send_from_fifo");
+ session[fd]->wdata_size = 0; //Clear the send queue as we can't send anymore. [Skotlex]
+ set_eof(fd);
+ }
+ return 0;
+ }
+#endif
+
+ //{ int i; ShowMessage("send %d : ",fd); for(i=0;i<len;i++){ ShowMessage("%02x ",session[fd]->wdata[i]); } ShowMessage("\n");}
+ if(len>0){
+ if((size_t)len<session[fd]->wdata_size){
+ memmove(session[fd]->wdata,session[fd]->wdata+len,session[fd]->wdata_size-len);
+ session[fd]->wdata_size-=len;
+ } else {
+ session[fd]->wdata_size=0;
+ }
+ }
+ return 0;
+}
+
+void flush_fifo(int fd)
+{
+ if(session[fd] != NULL && session[fd]->func_send == send_from_fifo)
+ {
+ set_nonblocking(fd, 1);
+ send_from_fifo(fd);
+ set_nonblocking(fd, 0);
+ }
+}
+
+void flush_fifos(void)
+{
+ int i;
+ for(i=1;i<fd_max;i++)
+ if(session[i] != NULL &&
+ session[i]->func_send == send_from_fifo)
+ send_from_fifo(i);
+}
+
+static int null_parse(int fd)
+{
+ ShowMessage("null_parse : %d\n",fd);
+ session[fd]->rdata_pos = session[fd]->rdata_size; //RFIFOSKIP(fd, RFIFOREST(fd)); simplify calculation
+ return 0;
+}
+
+/*======================================
+ * CORE : Socket Function
+ *--------------------------------------
+ */
+
+static int connect_client(int listen_fd)
+{
+ int fd;
+ struct sockaddr_in client_address;
+#ifdef __WIN32
+ int len;
+#else
+ socklen_t len;
+#endif
+ //ShowMessage("connect_client : %d\n",listen_fd);
+
+ len=sizeof(client_address);
+
+ fd = accept(listen_fd,(struct sockaddr*)&client_address,&len);
+#ifdef __WIN32
+ if ( fd == INVALID_SOCKET ) {
+ ShowError("accept failed (code %i)!\n", WSAGetLastError());
+ return -1;
+ }
+#else
+ if(fd==-1) {
+ perror("accept");
+ return -1;
+ }
+#endif
+
+ if(fd_max<=fd) fd_max=fd+1;
+
+ setsocketopts(fd);
+
+#ifdef __WIN32
+ {
+ unsigned long val = 1;
+ if (ioctlsocket(fd, FIONBIO, &val) != 0)
+ ShowError("Couldn't set the socket to non-blocking mode (code %d)!\n", WSAGetLastError());
+ }
+#else
+ if (fcntl(fd, F_SETFL, O_NONBLOCK) == -1)
+ perror("connect_client (set nonblock)");
+#endif
+
+ if (ip_rules && !connect_check(*(unsigned int*)(&client_address.sin_addr))) {
+ do_close(fd);
+ return -1;
+ } else
+ FD_SET(fd,&readfds);
+
+ CREATE(session[fd], struct socket_data, 1);
+ CREATE(session[fd]->rdata, unsigned char, rfifo_size);
+ CREATE(session[fd]->wdata, unsigned char, wfifo_size);
+
+ session[fd]->max_rdata = rfifo_size;
+ session[fd]->max_wdata = wfifo_size;
+ session[fd]->func_recv = recv_to_fifo;
+ session[fd]->func_send = send_from_fifo;
+ if(!session[listen_fd]->func_parse)
+ session[fd]->func_parse = default_func_parse;
+ else
+ session[fd]->func_parse = session[listen_fd]->func_parse;
+ session[fd]->client_addr = client_address;
+ session[fd]->rdata_tick = last_tick;
+ session[fd]->type = SESSION_UNKNOWN; // undefined type
+
+ //ShowMessage("new_session : %d %d\n",fd,session[fd]->eof);
+ return fd;
+}
+
+int make_listen_bind(long ip,int port)
+{
+ struct sockaddr_in server_address;
+ int fd;
+ int result;
+
+ fd = (int)socket( AF_INET, SOCK_STREAM, 0 );
+
+#ifdef __WIN32
+ if (fd == INVALID_SOCKET) {
+ ShowError("socket() creation failed (code %d)!\n", fd, WSAGetLastError());
+ exit(1);
+ }
+#else
+ if (fd == -1) {
+ perror("make_listen_port:socket()");
+ exit(1);
+ }
+#endif
+
+#ifdef __WIN32
+ {
+ unsigned long val = 1;
+ if (ioctlsocket(fd, FIONBIO, &val) != 0)
+ ShowError("Couldn't set the socket to non-blocking mode (code %d)!\n", WSAGetLastError());
+ }
+#else
+ if (fcntl(fd, F_SETFL, O_NONBLOCK) == -1)
+ perror("make_listen_bind (set nonblock)");
+#endif
+
+ setsocketopts(fd);
+
+ server_address.sin_family = AF_INET;
+ server_address.sin_addr.s_addr = ip;
+ server_address.sin_port = htons((unsigned short)port);
+
+ result = bind(fd, (struct sockaddr*)&server_address, sizeof(server_address));
+#ifdef __WIN32
+ if( result == SOCKET_ERROR ) {
+ ShowError("bind failed (socket %d, code %d)!\n", fd, WSAGetLastError());
+ exit(1);
+ }
+#else
+ if( result == -1 ) {
+ perror("bind");
+ exit(1);
+ }
+#endif
+ result = listen( fd, 5 );
+#ifdef __WIN32
+ if( result == SOCKET_ERROR ) {
+ ShowError("listen failed (socket %d, code %d)!\n", fd, WSAGetLastError());
+ exit(1);
+ }
+#else
+ if( result != 0) { /* error */
+ perror("listen");
+ exit(1);
+ }
+#endif
+ if ( fd < 0 || fd > FD_SETSIZE )
+ { //Crazy error that can happen in Windows? (info from Freya)
+ ShowFatalError("listen() returned invalid fd %d!\n",fd);
+ exit(1);
+ }
+
+ if(fd_max<=fd) fd_max=fd+1;
+ FD_SET(fd, &readfds );
+
+ CREATE(session[fd], struct socket_data, 1);
+
+ malloc_set(session[fd],0,sizeof(*session[fd]));
+ session[fd]->func_recv = connect_client;
+
+ return fd;
+}
+
+int make_listen_port(int port)
+{
+ return make_listen_bind(INADDR_ANY,port);
+}
+
+// Console Reciever [Wizputer]
+int console_recieve(int i) {
+ int n;
+ char *buf;
+
+ CREATE(buf, char, 64);
+ malloc_tsetdword(buf,0,sizeof(64));
+
+ n = read(0, buf , 64);
+ if ( n < 0 )
+ ShowError("Console input read error\n");
+ else
+ {
+ ShowNotice ("Sorry, the console is currently non-functional.\n");
+// session[0]->func_console(buf);
+ }
+
+ aFree(buf);
+ return 0;
+}
+
+void set_defaultconsoleparse(int (*defaultparse)(char*))
+{
+ default_console_parse = defaultparse;
+}
+
+static int null_console_parse(char *buf)
+{
+ ShowMessage("null_console_parse : %s\n",buf);
+ return 0;
+}
+
+// function parse table
+// To-do: -- use dynamic arrays
+// -- add a register_parse_func();
+struct func_parse_table func_parse_table[SESSION_MAX];
+
+int default_func_check (struct socket_data *sd) { return 1; }
+
+void func_parse_check (struct socket_data *sd)
+{
+ int i;
+ for (i = SESSION_HTTP; i < SESSION_MAX; i++) {
+ if (func_parse_table[i].func &&
+ func_parse_table[i].check &&
+ func_parse_table[i].check(sd) != 0)
+ {
+ sd->type = i;
+ sd->func_parse = func_parse_table[i].func;
+ return;
+ }
+ }
+
+ // undefined -- treat as raw socket (using default parse)
+ sd->type = SESSION_RAW;
+}
+
+// Console Input [Wizputer]
+int start_console(void) {
+
+ //Until a better plan is came up with... can't be using session[0] anymore! [Skotlex]
+ ShowNotice("The console is currently nonfunctional.\n");
+ return 0;
+
+ FD_SET(0,&readfds);
+
+ if (!session[0]) { // dummy socket already uses fd 0
+ CREATE(session[0], struct socket_data, 1);
+ }
+ malloc_set(session[0],0,sizeof(*session[0]));
+
+ session[0]->func_recv = console_recieve;
+ session[0]->func_console = default_console_parse;
+
+ return 0;
+}
+
+int make_connection(long ip,int port)
+{
+ struct sockaddr_in server_address;
+ int fd;
+ int result;
+
+ fd = (int)socket( AF_INET, SOCK_STREAM, 0 );
+
+#ifdef __WIN32
+ if (fd == INVALID_SOCKET) {
+ ShowError("socket() creation failed (code %d)!\n", fd, WSAGetLastError());
+ return -1;
+ }
+#else
+ if (fd == -1) {
+ perror("make_connection:socket()");
+ return -1;
+ }
+#endif
+
+ setsocketopts(fd);
+
+ server_address.sin_family = AF_INET;
+ server_address.sin_addr.s_addr = ip;
+ server_address.sin_port = htons((unsigned short)port);
+
+ ShowStatus("Connecting to %d.%d.%d.%d:%i\n",
+ (ip)&0xFF,(ip>>8)&0xFF,(ip>>16)&0xFF,(ip>>24)&0xFF,port);
+
+ result = connect(fd, (struct sockaddr *)(&server_address), sizeof(struct sockaddr_in));
+#ifdef __WIN32
+ if( result == SOCKET_ERROR ) {
+ ShowError("connect failed (socket %d, code %d)!\n", fd, WSAGetLastError());
+ do_close(fd);
+ return -1;
+ }
+#else
+ if (result < 0) { //This is only used when the map/char server try to connect to each other, so it can be handled. [Skotlex]
+ perror("make_connection");
+ do_close(fd);
+ return -1;
+ }
+#endif
+//Now the socket can be made non-blocking. [Skotlex]
+#ifdef __WIN32
+ {
+ unsigned long val = 1;
+ if (ioctlsocket(fd, FIONBIO, &val) != 0)
+ ShowError("Couldn't set the socket to non-blocking mode (code %d)!\n", WSAGetLastError());
+ }
+#else
+ if (fcntl(fd, F_SETFL, O_NONBLOCK) == -1)
+ perror("make_connection (set nonblock)");
+#endif
+
+ if (fd_max <= fd)
+ fd_max = fd + 1;
+ FD_SET(fd,&readfds);
+
+ CREATE(session[fd], struct socket_data, 1);
+ CREATE(session[fd]->rdata, unsigned char, rfifo_size);
+ CREATE(session[fd]->wdata, unsigned char, wfifo_size);
+
+ session[fd]->max_rdata = rfifo_size;
+ session[fd]->max_wdata = wfifo_size;
+ session[fd]->func_recv = recv_to_fifo;
+ session[fd]->func_send = send_from_fifo;
+ session[fd]->func_parse = default_func_parse;
+ session[fd]->rdata_tick = last_tick;
+
+ return fd;
+}
+
+void free_session_mem(int fd)
+{
+ if (session[fd]){
+ if (session[fd]->rdata)
+ aFree(session[fd]->rdata);
+ if (session[fd]->wdata)
+ aFree(session[fd]->wdata);
+ if (session[fd]->session_data)
+ aFree(session[fd]->session_data);
+ aFree(session[fd]);
+ session[fd] = NULL;
+ }
+}
+
+int delete_session(int fd)
+{
+ if (fd <= 0 || fd >= FD_SETSIZE)
+ return -1;
+ FD_CLR(fd, &readfds);
+ free_session_mem(fd);
+ //ShowMessage("delete_session:%d\n",fd);
+ return 0;
+}
+
+int realloc_fifo(int fd,unsigned int rfifo_size,unsigned int wfifo_size)
+{
+ if( !session_isValid(fd) )
+ return 0;
+
+ if( session[fd]->max_rdata != rfifo_size && session[fd]->rdata_size < rfifo_size){
+ RECREATE(session[fd]->rdata, unsigned char, rfifo_size);
+ session[fd]->max_rdata = rfifo_size;
+ }
+
+ if( session[fd]->max_wdata != wfifo_size && session[fd]->wdata_size < wfifo_size){
+ RECREATE(session[fd]->wdata, unsigned char, wfifo_size);
+ session[fd]->max_wdata = wfifo_size;
+ }
+ return 0;
+}
+
+int realloc_writefifo(int fd, size_t addition)
+{
+ size_t newsize;
+
+ if( !session_isValid(fd) ) // might not happen
+ return 0;
+
+ if( session[fd]->wdata_size + addition > session[fd]->max_wdata )
+ { // grow rule; grow in multiples of wfifo_size
+ newsize = wfifo_size;
+ while( session[fd]->wdata_size + addition > newsize ) newsize += newsize;
+ }
+ else if( session[fd]->max_wdata>=FIFOSIZE_SERVERLINK) {
+ //Inter-server adjust. [Skotlex]
+ if ((session[fd]->wdata_size+addition)*4 < session[fd]->max_wdata)
+ newsize = session[fd]->max_wdata/2;
+ else
+ return 0; //No change
+ } else if( session[fd]->max_wdata>wfifo_size &&
+ (session[fd]->wdata_size+addition)*4 < session[fd]->max_wdata )
+ { // shrink rule, shrink by 2 when only a quater of the fifo is used, don't shrink below 4*addition
+ newsize = session[fd]->max_wdata/2;
+ }
+ else // no change
+ return 0;
+
+ RECREATE(session[fd]->wdata, unsigned char, newsize);
+ session[fd]->max_wdata = newsize;
+
+ return 0;
+}
+
+int WFIFOSET(int fd,int len)
+{
+ size_t newreserve;
+ struct socket_data *s = session[fd];
+
+ if( !session_isValid(fd) || s->wdata == NULL )
+ return 0;
+
+ // we have written len bytes to the buffer already before calling WFIFOSET
+ if(s->wdata_size+len > s->max_wdata)
+ { // actually there was a buffer overflow already
+ unsigned char *sin_addr = (unsigned char *)&s->client_addr.sin_addr;
+ ShowFatalError("socket: Buffer Overflow. Connection %d (%d.%d.%d.%d) has written %d byteson a %d/%d bytes buffer.\n", fd,
+ sin_addr[0], sin_addr[1], sin_addr[2], sin_addr[3], len, s->wdata_size, s->max_wdata);
+ ShowDebug("Likely command that caused it: 0x%x\n",
+ (*(unsigned short*)(s->wdata+s->wdata_size)));
+ // no other chance, make a better fifo model
+ exit(1);
+ }
+
+ s->wdata_size += len;
+ // always keep a wfifo_size reserve in the buffer
+ // For inter-server connections, let the reserve be 1/8th of the link size.
+ newreserve = s->wdata_size + (s->max_wdata>=FIFOSIZE_SERVERLINK?FIFOSIZE_SERVERLINK<<3:wfifo_size);
+
+ if(s->wdata_size >= frame_size)
+ send_from_fifo(fd);
+
+ // realloc after sending
+ // readfifo does not need to be realloced at all
+ // Even the inter-server buffer may need reallocating! [Skotlex]
+ realloc_writefifo(fd, newreserve);
+
+ return 0;
+}
+
+int do_sendrecv(int next)
+{
+ fd_set rfd,efd; //Added the Error Set so that such sockets can be made eof. They are the same as the rfd for now. [Skotlex]
+ struct sockaddr_in addr_check;
+ struct timeval timeout;
+ int ret,i,size;
+
+ last_tick = time(0);
+
+
+ //PRESEND Need to do this to ensure that the clients get something to do
+ //which hopefully will cause them to send packets. [Meruru]
+ for (i = 1; i < fd_max; i++)
+ {
+ if(!session[i])
+ continue;
+
+ if(session[i]->wdata_size && session[i]->func_send)
+ session[i]->func_send(i);
+ }
+
+ timeout.tv_sec = next/1000;
+ timeout.tv_usec = next%1000*1000;
+
+ for(memcpy(&rfd, &readfds, sizeof(rfd)),
+ memcpy(&efd, &readfds, sizeof(efd));
+ (ret = select(fd_max, &rfd, NULL, &efd, &timeout))<0;
+ memcpy(&rfd, &readfds, sizeof(rfd)),
+ memcpy(&efd, &readfds, sizeof(efd)))
+ {
+ if(serrno != SEBADF)
+ return 0;
+
+ //Well then the error is due to a bad socket. Lets find and remove it
+ //and try again
+ for(i = 1; i < fd_max; i++)
+ {
+ if(!session[i])
+ continue;
+
+ //check the validity of the socket. Does what the last thing did
+ //just alot faster [Meruru]
+ size = sizeof(struct sockaddr);
+ if(getsockname(i,(struct sockaddr*)&addr_check,&size)<0)
+ if(serrno == SEBADF) //See the #defines at the top
+ {
+ free_session_mem(i); //free the bad session
+ continue;
+ }
+
+ FD_SET(i,&readfds);
+ ret = i;
+ }
+
+ fd_max = ret;
+ }
+
+ //ok under windows to use FD_ISSET is FUCKING stupid
+ //because windows uses an array so lets do them part by part [Meruru]
+#ifdef _WIN32
+ //Do the socket sets. Unlike linux which uses a bit mask windows uses
+ //a array. So calls to FS_ISSET are SLOW AS SHIT. So we have to do
+ //a special case for them which actually turns out ok [Meruru]
+ for(i=0;i<(int)rfd.fd_count;i++)
+ {
+ if(session[rfd.fd_array[i]] &&
+ session[rfd.fd_array[i]]->func_recv)
+ session[rfd.fd_array[i]]->func_recv(rfd.fd_array[i]);
+ }
+ for(i=0;i<(int)efd.fd_count;i++)
+ set_eof(efd.fd_array[i]);
+
+ for (i = 1; i < fd_max; i++)
+ {
+ if(!session[i])
+ continue;
+
+ //POSTSEND: Does write EVER BLOCK? NO!! not unless WE ARE CURRENTLY SENDING SOMETHING
+ //Or just have opened a connection and dont know if its ready
+ //And since eA isn't multi threaded and all the sockets are non blocking THIS ISNT A PROBLEM! [Meruru]
+
+ if(session[i]->wdata_size && session[i]->func_send)
+ session[i]->func_send(i);
+
+ if(session[i]->eof) //The session check is for when the connection ended in func_parse
+ { //Finally, even if there is no data to parse, connections signalled eof should be closed, so we call parse_func [Skotlex]
+ if (session[i]->func_parse)
+ session[i]->func_parse(i); //This should close the session inmediately.
+ }
+ }
+
+#else //where under linux its just a bit check so its smart [Meruru]
+
+ for (i = 1; i < fd_max; i++){
+ if(!session[i])
+ continue;
+
+ if(FD_ISSET(i,&efd)){
+ //ShowMessage("error:%d\n",i);
+ ShowDebug("do_sendrecv: Connection error on Session %d.\n", i);
+ set_eof(i);
+ continue;
+ }
+
+
+ if(FD_ISSET(i,&rfd)){
+ //ShowMessage("read:%d\n",i);
+ if(session[i]->func_recv)
+ session[i]->func_recv(i);
+ }
+
+ //Does write EVER BLOCK. NO not unless WE ARE CURRENTALLY SENDING SOMETHING
+ //And sence eA isnt multi threaded THIS ISNT A PROBLEM!
+ if(session[i]->wdata_size && session[i]->func_send)
+ session[i]->func_send(i);
+
+ if(session[i] && session[i]->eof) //The session check is for when the connection ended in func_parse
+ { //Finally, even if there is no data to parse, connections signalled eof should be closed, so we call parse_func [Skotlex]
+ if (session[i]->func_parse)
+ session[i]->func_parse(i); //This should close the session inmediately.
+ }
+ }
+#endif
+
+ return 0;
+}
+
+int do_parsepacket(void)
+{
+ int i;
+ struct socket_data *sd;
+ for(i = 1; i < fd_max; i++){
+ sd = session[i];
+ if(!sd)
+ continue;
+ if (sd->rdata_tick && DIFF_TICK(last_tick,sd->rdata_tick) > stall_time) {
+ ShowInfo ("Session #%d timed out\n", i);
+ sd->eof = 1;
+ }
+ if(sd->rdata_size == 0 && sd->eof == 0)
+ continue;
+ if(sd->func_parse){
+ if(sd->type == SESSION_UNKNOWN)
+ func_parse_check(sd);
+ if(sd->type != SESSION_UNKNOWN)
+ sd->func_parse(i);
+ if(!session[i])
+ continue;
+ /* after parse, check client's RFIFO size to know if there is an invalid packet (too big and not parsed) */
+ if (session[i]->rdata_size == rfifo_size && session[i]->max_rdata == rfifo_size) {
+ session[i]->eof = 1;
+ continue;
+ }
+ }
+ RFIFOFLUSH(i);
+ }
+ return 0;
+}
+
+/* DDoS 攻撃対策 */
+#ifndef MINICORE
+struct _access_control {
+ unsigned int ip;
+ unsigned int mask;
+};
+
+struct _connect_history {
+ struct _connect_history *next;
+ struct _connect_history *prev;
+ int status;
+ int count;
+ unsigned int ip;
+ unsigned int tick;
+};
+static struct _connect_history *connect_history[0x10000];
+static int connect_check_(unsigned int ip);
+
+// 接続できるかどうかの確認
+// false : 接続OK
+// true : 接続NG
+static int connect_check(unsigned int ip) {
+ int result = connect_check_(ip);
+ if(access_debug) {
+ ShowMessage("connect_check: Connection from %d.%d.%d.%d %s\n",
+ CONVIP(ip),result ? "allowed." : "denied!");
+ }
+ return result;
+}
+
+static int connect_check_(unsigned int ip) {
+ struct _connect_history *hist = connect_history[ip & 0xFFFF];
+ struct _connect_history *hist_new;
+ int i,is_allowip = 0,is_denyip = 0,connect_ok = 0;
+
+ // allow , deny リストに入っているか確認
+ for(i = 0;i < access_allownum; i++) {
+ if((ip & access_allow[i].mask) == (access_allow[i].ip & access_allow[i].mask)) {
+ if(access_debug) {
+ ShowMessage("connect_check: Found match from allow list:%d.%d.%d.%d IP:%d.%d.%d.%d Mask:%d.%d.%d.%d\n",
+ CONVIP(ip),
+ CONVIP(access_allow[i].ip),
+ CONVIP(access_allow[i].mask));
+ }
+ is_allowip = 1;
+ break;
+ }
+ }
+ for(i = 0;i < access_denynum; i++) {
+ if((ip & access_deny[i].mask) == (access_deny[i].ip & access_deny[i].mask)) {
+ if(access_debug) {
+ ShowMessage("connect_check: Found match from deny list:%d.%d.%d.%d IP:%d.%d.%d.%d Mask:%d.%d.%d.%d\n",
+ CONVIP(ip),
+ CONVIP(access_deny[i].ip),
+ CONVIP(access_deny[i].mask));
+ }
+ is_denyip = 1;
+ break;
+ }
+ }
+ // コネクト出来るかどうか確認
+ // connect_ok
+ // 0 : 無条件に拒否
+ // 1 : 田代砲チェックの結果次第
+ // 2 : 無条件に許可
+ switch(access_order) {
+ case ACO_DENY_ALLOW:
+ default:
+ if(is_allowip) {
+ connect_ok = 2;
+ } else if(is_denyip) {
+ connect_ok = 0;
+ } else {
+ connect_ok = 1;
+ }
+ break;
+ case ACO_ALLOW_DENY:
+ if(is_denyip) {
+ connect_ok = 0;
+ } else if(is_allowip) {
+ connect_ok = 2;
+ } else {
+ connect_ok = 1;
+ }
+ break;
+ case ACO_MUTUAL_FAILTURE:
+ if(is_allowip) {
+ connect_ok = 2;
+ } else {
+ connect_ok = 0;
+ }
+ break;
+ }
+
+ // 接続履歴を調べる
+ while(hist) {
+ if(ip == hist->ip) {
+ // 同じIP発見
+ if(hist->status) {
+ // ban フラグが立ってる
+ return (connect_ok == 2 ? 1 : 0);
+ } else if(DIFF_TICK(gettick(),hist->tick) < ddos_interval) {
+ // ddos_interval秒以内にリクエスト有り
+ hist->tick = gettick();
+ if(hist->count++ >= ddos_count) {
+ // ddos 攻撃を検出
+ hist->status = 1;
+ ShowWarning("connect_check: DDOS Attack detected from %d.%d.%d.%d!\n",
+ CONVIP(ip));
+ return (connect_ok == 2 ? 1 : 0);
+ } else {
+ return connect_ok;
+ }
+ } else {
+ // ddos_interval秒以内にリクエスト無いのでタイマークリア
+ hist->tick = gettick();
+ hist->count = 0;
+ return connect_ok;
+ }
+ }
+ hist = hist->next;
+ }
+ // IPリストに無いので新規作成
+ hist_new = (struct _connect_history *) aCalloc(1,sizeof(struct _connect_history));
+ hist_new->ip = ip;
+ hist_new->tick = gettick();
+ if(connect_history[ip & 0xFFFF] != NULL) {
+ hist = connect_history[ip & 0xFFFF];
+ hist->prev = hist_new;
+ hist_new->next = hist;
+ }
+ connect_history[ip & 0xFFFF] = hist_new;
+ return connect_ok;
+}
+
+static int connect_check_clear(int tid,unsigned int tick,int id,int data) {
+ int i;
+ int clear = 0;
+ int list = 0;
+ struct _connect_history *hist , *hist2;
+ for(i = 0;i < 0x10000 ; i++) {
+ hist = connect_history[i];
+ while(hist) {
+ if ((DIFF_TICK(tick,hist->tick) > ddos_interval * 3 && !hist->status) ||
+ (DIFF_TICK(tick,hist->tick) > ddos_autoreset && hist->status)) {
+ // clear data
+ hist2 = hist->next;
+ if(hist->prev) {
+ hist->prev->next = hist->next;
+ } else {
+ connect_history[i] = hist->next;
+ }
+ if(hist->next) {
+ hist->next->prev = hist->prev;
+ }
+ aFree(hist);
+ hist = hist2;
+ clear++;
+ } else {
+ hist = hist->next;
+ }
+ list++;
+ }
+ }
+ if(access_debug) {
+ ShowMessage("connect_check_clear: Cleared %d of %d from IP list.\n", clear, list);
+ }
+ return list;
+}
+
+// IPマスクチェック
+int access_ipmask(const char *str,struct _access_control* acc)
+{
+ unsigned int mask=0,i=0,m,ip, a0,a1,a2,a3;
+ if( !strcmp(str,"all") ) {
+ ip = 0;
+ mask = 0;
+ } else {
+ if( sscanf(str,"%d.%d.%d.%d%n",&a0,&a1,&a2,&a3,&i)!=4 || i==0) {
+ ShowError("access_ipmask: Unknown format %s!\n",str);
+ return 0;
+ }
+ ip = (a3 << 24) | (a2 << 16) | (a1 << 8) | a0;
+
+ if(sscanf(str+i,"/%d.%d.%d.%d",&a0,&a1,&a2,&a3)==4 ){
+ mask = (a3 << 24) | (a2 << 16) | (a1 << 8) | a0;
+ } else if(sscanf(str+i,"/%d",&m) == 1) {
+ for(i=0;i<m;i++) {
+ mask = (mask >> 1) | 0x80000000;
+ }
+ mask = ntohl(mask);
+ } else {
+ mask = 0xFFFFFFFF;
+ }
+ }
+ if(access_debug) {
+ ShowMessage("access_ipmask: Loaded IP:%d.%d.%d.%d mask:%d.%d.%d.%d\n",
+ CONVIP(ip), CONVIP(mask));
+ }
+ acc->ip = ip;
+ acc->mask = mask;
+ return 1;
+}
+#endif
+
+int socket_config_read(const char *cfgName) {
+ int i;
+ char line[1024],w1[1024],w2[1024];
+ FILE *fp;
+
+ fp=fopen(cfgName, "r");
+ if(fp==NULL){
+ ShowError("File not found: %s\n", cfgName);
+ return 1;
+ }
+ while(fgets(line,1020,fp)){
+ if(line[0] == '/' && line[1] == '/')
+ continue;
+ i=sscanf(line,"%[^:]: %[^\r\n]",w1,w2);
+ if(i!=2)
+ continue;
+ if(strcmpi(w1,"stall_time")==0){
+ stall_time = atoi(w2);
+ #ifndef MINICORE
+ } else if(strcmpi(w1,"enable_ip_rules")==0){
+ if(strcmpi(w2,"yes")==0)
+ ip_rules = 1;
+ else if(strcmpi(w2,"no")==0)
+ ip_rules = 0;
+ else ip_rules = atoi(w2);
+ } else if(strcmpi(w1,"order")==0){
+ access_order=atoi(w2);
+ if(strcmpi(w2,"deny,allow")==0) access_order=ACO_DENY_ALLOW;
+ if(strcmpi(w2,"allow,deny")==0) access_order=ACO_ALLOW_DENY;
+ if(strcmpi(w2,"mutual-failure")==0) access_order=ACO_MUTUAL_FAILTURE;
+ } else if(strcmpi(w1,"allow")==0){
+ access_allow = (struct _access_control *) aRealloc(access_allow,(access_allownum+1)*sizeof(struct _access_control));
+ if(access_ipmask(w2,&access_allow[access_allownum])) {
+ access_allownum++;
+ }
+ } else if(strcmpi(w1,"deny")==0){
+ access_deny = (struct _access_control *) aRealloc(access_deny,(access_denynum+1)*sizeof(struct _access_control));
+ if(access_ipmask(w2,&access_deny[access_denynum])) {
+ access_denynum++;
+ }
+ } else if(!strcmpi(w1,"ddos_interval")){
+ ddos_interval = atoi(w2);
+ } else if(!strcmpi(w1,"ddos_count")){
+ ddos_count = atoi(w2);
+ } else if(!strcmpi(w1,"ddos_autoreset")){
+ ddos_autoreset = atoi(w2);
+ } else if(!strcmpi(w1,"debug")){
+ if(strcmpi(w2,"yes")==0)
+ access_debug = 1;
+ else if(strcmpi(w2,"no")==0)
+ access_debug = 0;
+ else access_debug = atoi(w2);
+ #endif
+ } else if (strcmpi(w1, "mode_neg") == 0)
+ {
+ if(strcmpi(w2,"yes")==0)
+ mode_neg = 1;
+ else if(strcmpi(w2,"no")==0)
+ mode_neg = 0;
+ else mode_neg = atoi(w2);
+ } else if (strcmpi(w1, "frame_size") == 0)
+ frame_size = (size_t)strtoul(w2, NULL, 10);
+ else if (strcmpi(w1, "import") == 0)
+ socket_config_read(w2);
+ }
+ fclose(fp);
+ return 0;
+}
+
+int RFIFOSKIP(int fd,int len)
+{
+ struct socket_data *s;
+
+ if ( !session_isActive(fd) ) //Nullpo error here[Kevin]
+ return 0;
+
+ s = session[fd];
+
+ if ( s->rdata_size - s->rdata_pos - len < 0 ) {
+ //fprintf(stderr,"too many skip\n");
+ //exit(1);
+ //better than a COMPLETE program abort // TEST! :)
+ ShowError("too many skip (%d) now skipped: %d (FD: %d)\n", len, RFIFOREST(fd), fd);
+ len = RFIFOREST(fd);
+ }
+ s->rdata_pos = s->rdata_pos+len;
+ return 0;
+}
+
+
+unsigned int addr_[16]; // ip addresses of local host (host byte order)
+unsigned int naddr_ = 0; // # of ip addresses
+
+void socket_final (void)
+{
+ int i;
+#ifndef MINICORE
+ struct _connect_history *hist , *hist2;
+ for(i = 0; i < 0x10000; i++) {
+ hist = connect_history[i];
+ while(hist) {
+ hist2 = hist->next;
+ aFree(hist);
+ hist = hist2;
+ }
+ }
+ if (access_allow)
+ aFree(access_allow);
+ if (access_deny)
+ aFree(access_deny);
+#endif
+
+ for (i = 1; i < fd_max; i++) {
+ if(session[i])
+ delete_session(i);
+ }
+
+ // session[0] のダミーデータを削除
+ aFree(session[0]->rdata);
+ aFree(session[0]->wdata);
+ aFree(session[0]);
+}
+
+//Closes a socket.
+//Needed to simplify shutdown code as well as manage the subtle differences in socket management from Windows and *nix.
+void do_close(int fd)
+{
+//We don't really care if these closing functions return an error, we are just shutting down and not reusing this socket.
+#ifdef __WIN32
+// shutdown(fd, SD_BOTH); //FIXME: Shutdown requires winsock2.h! What would be the proper shutting down method for winsock1?
+ if (session[fd] && session[fd]->func_send == send_from_fifo)
+ session[fd]->func_send(fd); //Flush the data as it is gonna be closed down, but it may not succeed as it is a nonblocking socket! [Skotlex]
+ closesocket(fd);
+#else
+ if (close(fd))
+ perror("do_close: close");
+#endif
+ if (session[fd])
+ delete_session(fd);
+}
+
+void socket_init (void)
+{
+ char *SOCKET_CONF_FILENAME = "conf/packet_athena.conf";
+#ifdef __WIN32
+ char** a;
+ unsigned int i;
+ char fullhost[255];
+ struct hostent* hent;
+
+ /* Start up the windows networking */
+ WORD version_wanted = MAKEWORD(1, 1); //Demand at least WinSocket version 1.1 (from Freya)
+ WSADATA wsaData;
+
+ if ( WSAStartup(version_wanted, &wsaData) != 0 ) {
+ ShowFatalError("SYSERR: WinSock not available!\n");
+ exit(1);
+ }
+
+ if(gethostname(fullhost, sizeof(fullhost)) == SOCKET_ERROR) {
+ ShowError("Ugg.. no hostname defined!\n");
+ return;
+ }
+
+ // XXX This should look up the local IP addresses in the registry
+ // instead of calling gethostbyname. However, the way IP addresses
+ // are stored in the registry is annoyingly complex, so I'll leave
+ // this as T.B.D.
+ hent = gethostbyname(fullhost);
+ if (hent == NULL) {
+ ShowError("Cannot resolve our own hostname to a IP address");
+ return;
+ }
+
+ a = hent->h_addr_list;
+ for(i = 0; a[i] != 0 && i < 16; ++i) {
+ unsigned long addr1 = ntohl(*(unsigned long*) a[i]);
+ addr_[i] = addr1;
+ }
+ naddr_ = i;
+#else
+ int pos;
+ int fdes = socket(AF_INET, SOCK_STREAM, 0);
+ char buf[16 * sizeof(struct ifreq)];
+ struct ifconf ic;
+
+ // The ioctl call will fail with Invalid Argument if there are more
+ // interfaces than will fit in the buffer
+ ic.ifc_len = sizeof(buf);
+ ic.ifc_buf = buf;
+ if(ioctl(fdes, SIOCGIFCONF, &ic) == -1) {
+ ShowError("SIOCGIFCONF failed!\n");
+ return;
+ }
+
+ for(pos = 0; pos < ic.ifc_len;)
+ {
+ struct ifreq * ir = (struct ifreq *) (ic.ifc_buf + pos);
+
+ struct sockaddr_in * a = (struct sockaddr_in *) &(ir->ifr_addr);
+
+ if(a->sin_family == AF_INET) {
+ u_long ad = ntohl(a->sin_addr.s_addr);
+ if(ad != INADDR_LOOPBACK && ad != INADDR_ANY) {
+ addr_[naddr_ ++] = ad;
+ if(naddr_ == 16)
+ break;
+ }
+ }
+
+ #if defined(_AIX) || defined(__APPLE__)
+ pos += ir->ifr_addr.sa_len; // For when we port athena to run on Mac's :)
+ pos += sizeof(ir->ifr_name);
+ #else
+ pos += sizeof(struct ifreq);
+ #endif
+ }
+#endif
+
+ FD_ZERO(&readfds);
+
+ socket_config_read(SOCKET_CONF_FILENAME);
+
+ // initialise last send-receive tick
+ last_tick = time(0);
+
+ // session[0] Was for the console (whatever that was?), but is now currently used for disconnected sessions of the map
+ // server, and as such, should hold enough buffer (it is a vacuum so to speak) as it is never flushed. [Skotlex]
+ CREATE(session[0], struct socket_data, 1);
+ CREATE(session[0]->rdata, unsigned char, 2*rfifo_size);
+ CREATE(session[0]->wdata, unsigned char, 2*wfifo_size);
+ session[0]->max_rdata = 2*rfifo_size;
+ session[0]->max_wdata = 2*wfifo_size;
+
+ malloc_set(func_parse_table, 0, sizeof(func_parse_table));
+ func_parse_table[SESSION_RAW].check = default_func_check;
+ func_parse_table[SESSION_RAW].func = default_func_parse;
+
+#ifndef MINICORE
+ // とりあえず5分ごとに不要なデータを削除する
+ add_timer_func_list(connect_check_clear, "connect_check_clear");
+ add_timer_interval(gettick()+1000,connect_check_clear,0,0,300*1000);
+#endif
+}
+
+
+bool session_isValid(int fd)
+{ //End of Exam has pointed out that fd==0 is actually an unconnected session! [Skotlex]
+ //But this is not so true, it is used... for... something. The console uses it, would this not cause problems? [Skotlex]
+ return ( (fd>0) && (fd<FD_SETSIZE) && (NULL!=session[fd]) );
+}
+
+bool session_isActive(int fd)
+{
+ return ( session_isValid(fd) && !session[fd]->eof );
+}
+
+in_addr_t resolve_hostbyname(char* hostname, unsigned char *ip, char *ip_str) {
+ struct hostent *h = gethostbyname(hostname);
+ char ip_buf[16];
+ unsigned char ip2[4];
+ if (!h) return 0;
+ if (ip == NULL) ip = ip2;
+ ip[0] = (unsigned char) h->h_addr[0];
+ ip[1] = (unsigned char) h->h_addr[1];
+ ip[2] = (unsigned char) h->h_addr[2];
+ ip[3] = (unsigned char) h->h_addr[3];
+ if (ip_str == NULL) ip_str = ip_buf;
+ sprintf(ip_str, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
+ return inet_addr(ip_str);
+}
diff --git a/src/common/socket.h b/src/common/socket.h
index ae13353b2..eb3a78f7e 100644
--- a/src/common/socket.h
+++ b/src/common/socket.h
@@ -1,176 +1,176 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _SOCKET_H_
-#define _SOCKET_H_
-
-#include <stdio.h>
-
-#ifdef __WIN32
-#define __USE_W32_SOCKETS
-#include <windows.h>
-typedef long in_addr_t;
-#else
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#endif
-#include <time.h>
-#include "../common/malloc.h"
-#include "cbasetypes.h"
-
-extern time_t last_tick;
-extern time_t stall_time;
-
-// define declaration
-
-#define RFIFOSPACE(fd) (session[fd]->max_rdata-session[fd]->rdata_size)
-#ifdef TURBO
-#define RFIFOHEAD(fd) char *rbPtr ## fd = session[fd]->rdata+session[fd]->rdata_pos
-#define RFIFOP(fd,pos) (&rbPtr ## fd[pos])
-#else
-//Make it a comment so it does not disrupts the rest of code.
-#define RFIFOHEAD(fd) //
-#define RFIFOP(fd,pos) (session[fd]->rdata+session[fd]->rdata_pos+(pos))
-#endif
-// use function instead of macro.
-#define RFIFOB(fd,pos) (*(unsigned char*)RFIFOP(fd,pos))
-#define RFIFOW(fd,pos) (*(unsigned short*)RFIFOP(fd,pos))
-#define RFIFOL(fd,pos) (*(unsigned long*)RFIFOP(fd,pos))
-#define RFIFOREST(fd) (session[fd]->rdata_size-session[fd]->rdata_pos)
-#define RFIFOFLUSH(fd) \
- if(session[fd]->rdata_size == session[fd]->rdata_pos) \
- { session[fd]->rdata_size = session[fd]->rdata_pos = 0; } else { \
- session[fd]->rdata_size -= session[fd]->rdata_pos; \
- memmove(session[fd]->rdata, session[fd]->rdata+session[fd]->rdata_pos, session[fd]->rdata_size); \
- session[fd]->rdata_pos=0; \
- }
-
-//#define RFIFOSKIP(fd,len) ((session[fd]->rdata_size-session[fd]->rdata_pos-(len)<0) ? (fprintf(stderr,"too many skip\n"),exit(1)) : (session[fd]->rdata_pos+=(len)))
-
-#define RBUFP(p,pos) (((unsigned char*)(p))+(pos))
-#define RBUFB(p,pos) (*(unsigned char*)RBUFP((p),(pos)))
-#define RBUFW(p,pos) (*(unsigned short*)RBUFP((p),(pos)))
-#define RBUFL(p,pos) (*(unsigned long*)RBUFP((p),(pos)))
-
-#define WFIFOSPACE(fd) (session[fd]->max_wdata-session[fd]->wdata_size)
-#ifdef TURBO
-#define WFIFOHEAD(fd, x) char *wbPtr ## fd = fd?(session[fd]->wdata+session[fd]->wdata_size):0;
-#define WFIFOP(fd,pos) (&wbPtr ## fd[pos])
-#else
-#define WFIFOHEAD(fd, size) { if((fd) && session[fd]->wdata_size + (size) > session[fd]->max_wdata ) realloc_writefifo(fd, size); }
-
-#define WFIFOP(fd,pos) (session[fd]->wdata+session[fd]->wdata_size+(pos))
-#endif
-#define WFIFOB(fd,pos) (*(unsigned char*)WFIFOP(fd,pos))
-#define WFIFOW(fd,pos) (*(unsigned short*)WFIFOP(fd,pos))
-#define WFIFOL(fd,pos) (*(unsigned long*)WFIFOP(fd,pos))
-// use function instead of macro.
-//#define WFIFOSET(fd,len) (session[fd]->wdata_size = (session[fd]->wdata_size + (len) + 2048 < session[fd]->max_wdata) ? session[fd]->wdata_size + len : session[fd]->wdata_size)
-#define WBUFP(p,pos) (((unsigned char*)(p)) + (pos))
-#define WBUFB(p,pos) (*(unsigned char*)((p) + (pos)))
-#define WBUFW(p,pos) (*(unsigned short*)((p) + (pos)))
-#define WBUFL(p,pos) (*(unsigned long*)((p) + (pos)))
-
-//FD_SETSIZE must be modified on the project files/Makefile, since a change here won't affect
-// dependant windows libraries.
-/*
-#ifdef __WIN32
-//The default FD_SETSIZE is kinda small for windows systems.
- #ifdef FD_SETSIZE
- #undef FD_SETSIZE
- #endif
-#define FD_SETSIZE 4096
-#endif
-*/
-#ifdef __INTERIX
-#define FD_SETSIZE 4096
-#endif // __INTERIX
-
-/* Removed Cygwin FD_SETSIZE declarations, now are directly passed on to the compiler through Makefile [Valaris] */
-
-// Session type
-enum SessionType {
- SESSION_UNKNOWN = -1,
- SESSION_RAW = 0,
- SESSION_HTTP = 1,
-//-----------------
- SESSION_MAX = 2
-};
-
-// Struct declaration
-
-struct socket_data{
- unsigned char eof;
- unsigned char *rdata, *wdata;
- unsigned int max_rdata, max_wdata;
- unsigned int rdata_size, wdata_size;
- int rdata_pos;
- time_t rdata_tick;
- struct sockaddr_in client_addr;
- int (*func_recv)(int);
- int (*func_send)(int);
- int (*func_parse)(int);
- int (*func_console)(char*);
- void* session_data;
- void* session_data2;
- enum SessionType type;
-};
-
-// Parse functions table
-struct func_parse_table {
- int (*func)(int);
- int (*check)(struct socket_data *);
-};
-extern struct func_parse_table func_parse_table[SESSION_MAX];
-
-
-// Data prototype declaration
-
-extern struct socket_data *session[FD_SETSIZE];
-
-extern int fd_max;
-
-//////////////////////////////////
-// some checking on sockets
-extern bool session_isValid(int fd);
-extern bool session_isActive(int fd);
-//////////////////////////////////
-
-// Function prototype declaration
-
-int make_listen_port(int);
-int make_listen_bind(long,int);
-int make_connection(long,int);
-int delete_session(int);
-int realloc_fifo(int fd,unsigned int rfifo_size,unsigned int wfifo_size);
-int realloc_writefifo(int fd, size_t addition);
-int WFIFOSET(int fd,int len);
-int RFIFOSKIP(int fd,int len);
-
-int do_sendrecv(int next);
-int do_parsepacket(void);
-void do_close(int fd);
-void socket_init(void);
-void socket_final(void);
-
-extern void flush_fifo(int fd);
-extern void flush_fifos(void);
-extern void set_nonblocking(int fd, int yes);
-
-int start_console(void);
-
-void set_defaultparse(int (*defaultparse)(int));
-void set_defaultconsoleparse(int (*defaultparse)(char*));
-
-//Resolves the hostname and stores the string representation of the string in ip.
-//Meant to simplify calls to gethostbyname without the need of all the
-//required network includes.
-//hostname is the name to resolve.
-//ip is an array of char[4] where the individual parts of the ip are stored (optional)
-//ip_str is a char[16] where the whole ip is stored in string notation (optional)
-in_addr_t resolve_hostbyname(char* hostname, unsigned char *ip, char *ip_str);
-
-extern unsigned int addr_[16]; // ip addresses of local host (host byte order)
-extern unsigned int naddr_; // # of ip addresses
-#endif // _SOCKET_H_
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef _SOCKET_H_
+#define _SOCKET_H_
+
+#include <stdio.h>
+
+#ifdef __WIN32
+#define __USE_W32_SOCKETS
+#include <windows.h>
+typedef long in_addr_t;
+#else
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#endif
+#include <time.h>
+#include "../common/malloc.h"
+#include "cbasetypes.h"
+
+extern time_t last_tick;
+extern time_t stall_time;
+
+// define declaration
+
+#define RFIFOSPACE(fd) (session[fd]->max_rdata-session[fd]->rdata_size)
+#ifdef TURBO
+#define RFIFOHEAD(fd) char *rbPtr ## fd = session[fd]->rdata+session[fd]->rdata_pos
+#define RFIFOP(fd,pos) (&rbPtr ## fd[pos])
+#else
+//Make it a comment so it does not disrupts the rest of code.
+#define RFIFOHEAD(fd) //
+#define RFIFOP(fd,pos) (session[fd]->rdata+session[fd]->rdata_pos+(pos))
+#endif
+// use function instead of macro.
+#define RFIFOB(fd,pos) (*(unsigned char*)RFIFOP(fd,pos))
+#define RFIFOW(fd,pos) (*(unsigned short*)RFIFOP(fd,pos))
+#define RFIFOL(fd,pos) (*(unsigned long*)RFIFOP(fd,pos))
+#define RFIFOREST(fd) (session[fd]->rdata_size-session[fd]->rdata_pos)
+#define RFIFOFLUSH(fd) \
+ if(session[fd]->rdata_size == session[fd]->rdata_pos) \
+ { session[fd]->rdata_size = session[fd]->rdata_pos = 0; } else { \
+ session[fd]->rdata_size -= session[fd]->rdata_pos; \
+ memmove(session[fd]->rdata, session[fd]->rdata+session[fd]->rdata_pos, session[fd]->rdata_size); \
+ session[fd]->rdata_pos=0; \
+ }
+
+//#define RFIFOSKIP(fd,len) ((session[fd]->rdata_size-session[fd]->rdata_pos-(len)<0) ? (fprintf(stderr,"too many skip\n"),exit(1)) : (session[fd]->rdata_pos+=(len)))
+
+#define RBUFP(p,pos) (((unsigned char*)(p))+(pos))
+#define RBUFB(p,pos) (*(unsigned char*)RBUFP((p),(pos)))
+#define RBUFW(p,pos) (*(unsigned short*)RBUFP((p),(pos)))
+#define RBUFL(p,pos) (*(unsigned long*)RBUFP((p),(pos)))
+
+#define WFIFOSPACE(fd) (session[fd]->max_wdata-session[fd]->wdata_size)
+#ifdef TURBO
+#define WFIFOHEAD(fd, x) char *wbPtr ## fd = fd?(session[fd]->wdata+session[fd]->wdata_size):0;
+#define WFIFOP(fd,pos) (&wbPtr ## fd[pos])
+#else
+#define WFIFOHEAD(fd, size) { if((fd) && session[fd]->wdata_size + (size) > session[fd]->max_wdata ) realloc_writefifo(fd, size); }
+
+#define WFIFOP(fd,pos) (session[fd]->wdata+session[fd]->wdata_size+(pos))
+#endif
+#define WFIFOB(fd,pos) (*(unsigned char*)WFIFOP(fd,pos))
+#define WFIFOW(fd,pos) (*(unsigned short*)WFIFOP(fd,pos))
+#define WFIFOL(fd,pos) (*(unsigned long*)WFIFOP(fd,pos))
+// use function instead of macro.
+//#define WFIFOSET(fd,len) (session[fd]->wdata_size = (session[fd]->wdata_size + (len) + 2048 < session[fd]->max_wdata) ? session[fd]->wdata_size + len : session[fd]->wdata_size)
+#define WBUFP(p,pos) (((unsigned char*)(p)) + (pos))
+#define WBUFB(p,pos) (*(unsigned char*)((p) + (pos)))
+#define WBUFW(p,pos) (*(unsigned short*)((p) + (pos)))
+#define WBUFL(p,pos) (*(unsigned long*)((p) + (pos)))
+
+//FD_SETSIZE must be modified on the project files/Makefile, since a change here won't affect
+// dependant windows libraries.
+/*
+#ifdef __WIN32
+//The default FD_SETSIZE is kinda small for windows systems.
+ #ifdef FD_SETSIZE
+ #undef FD_SETSIZE
+ #endif
+#define FD_SETSIZE 4096
+#endif
+*/
+#ifdef __INTERIX
+#define FD_SETSIZE 4096
+#endif // __INTERIX
+
+/* Removed Cygwin FD_SETSIZE declarations, now are directly passed on to the compiler through Makefile [Valaris] */
+
+// Session type
+enum SessionType {
+ SESSION_UNKNOWN = -1,
+ SESSION_RAW = 0,
+ SESSION_HTTP = 1,
+//-----------------
+ SESSION_MAX = 2
+};
+
+// Struct declaration
+
+struct socket_data{
+ unsigned char eof;
+ unsigned char *rdata, *wdata;
+ size_t max_rdata, max_wdata;
+ size_t rdata_size, wdata_size;
+ size_t rdata_pos;
+ time_t rdata_tick;
+ struct sockaddr_in client_addr;
+ int (*func_recv)(int);
+ int (*func_send)(int);
+ int (*func_parse)(int);
+ int (*func_console)(char*);
+ void* session_data;
+ void* session_data2;
+ enum SessionType type;
+};
+
+// Parse functions table
+struct func_parse_table {
+ int (*func)(int);
+ int (*check)(struct socket_data *);
+};
+extern struct func_parse_table func_parse_table[SESSION_MAX];
+
+
+// Data prototype declaration
+
+extern struct socket_data *session[FD_SETSIZE];
+
+extern int fd_max;
+
+//////////////////////////////////
+// some checking on sockets
+extern bool session_isValid(int fd);
+extern bool session_isActive(int fd);
+//////////////////////////////////
+
+// Function prototype declaration
+
+int make_listen_port(int);
+int make_listen_bind(long,int);
+int make_connection(long,int);
+int delete_session(int);
+int realloc_fifo(int fd,unsigned int rfifo_size,unsigned int wfifo_size);
+int realloc_writefifo(int fd, size_t addition);
+int WFIFOSET(int fd,int len);
+int RFIFOSKIP(int fd,int len);
+
+int do_sendrecv(int next);
+int do_parsepacket(void);
+void do_close(int fd);
+void socket_init(void);
+void socket_final(void);
+
+extern void flush_fifo(int fd);
+extern void flush_fifos(void);
+extern void set_nonblocking(int fd, int yes);
+
+int start_console(void);
+
+void set_defaultparse(int (*defaultparse)(int));
+void set_defaultconsoleparse(int (*defaultparse)(char*));
+
+//Resolves the hostname and stores the string representation of the string in ip.
+//Meant to simplify calls to gethostbyname without the need of all the
+//required network includes.
+//hostname is the name to resolve.
+//ip is an array of char[4] where the individual parts of the ip are stored (optional)
+//ip_str is a char[16] where the whole ip is stored in string notation (optional)
+in_addr_t resolve_hostbyname(char* hostname, unsigned char *ip, char *ip_str);
+
+extern unsigned int addr_[16]; // ip addresses of local host (host byte order)
+extern unsigned int naddr_; // # of ip addresses
+#endif // _SOCKET_H_
diff --git a/src/common/strlib.c b/src/common/strlib.c
index 8cff2a878..92601f9b1 100644
--- a/src/common/strlib.c
+++ b/src/common/strlib.c
@@ -1,194 +1,194 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-
-#include "strlib.h"
-#include "utils.h"
-#include "../common/malloc.h"
-
-//-----------------------------------------------
-// string lib.
-char* jstrescape (char* pt) {
- //copy from here
- char *ptr;
- int i =0, j=0;
-
- //copy string to temporary
- CREATE_A(ptr, char, J_MAX_MALLOC_SIZE);
- strcpy(ptr,pt);
-
- while (ptr[i] != '\0') {
- switch (ptr[i]) {
- case '\'':
- pt[j++] = '\\';
- pt[j++] = ptr[i++];
- break;
- case '\\':
- pt[j++] = '\\';
- pt[j++] = ptr[i++];
- break;
- case '%':
- pt[j++] = '_'; i++;
- break;
- default:
- pt[j++] = ptr[i++];
- }
- }
- pt[j++] = '\0';
- aFree (ptr);
- return &pt[0];
-}
-
-char* jstrescapecpy (char* pt,char* spt) {
- //copy from here
- //WARNING: Target string pt should be able to hold strlen(spt)*2, as each time
- //a escape character is found, the target's final length increases! [Skotlex]
- int i =0, j=0;
-
- if (!spt) { //Return an empty string [Skotlex]
- pt[0] = '\0';
- return &pt[0];
- }
-
- while (spt[i] != '\0') {
- switch (spt[i]) {
- case '\'':
- pt[j++] = '\\';
- pt[j++] = spt[i++];
- break;
- case '\\':
- pt[j++] = '\\';
- pt[j++] = spt[i++];
- break;
- case '%':
- pt[j++] = '_'; i++;
- break;
- default:
- pt[j++] = spt[i++];
- }
- }
- pt[j++] = '\0';
- return &pt[0];
-}
-int jmemescapecpy (char* pt,char* spt, int size) {
- //copy from here
- int i =0, j=0;
-
- while (i < size) {
- switch (spt[i]) {
- case '\'':
- pt[j++] = '\\';
- pt[j++] = spt[i++];
- break;
- case '\\':
- pt[j++] = '\\';
- pt[j++] = spt[i++];
- break;
- case '%':
- pt[j++] = '_'; i++;
- break;
- default:
- pt[j++] = spt[i++];
- }
- }
- // copy size is 0 ~ (j-1)
- return j;
-}
-
-//-----------------------------------------------------
-// Function to suppress control characters in a string.
-//-----------------------------------------------------
-//int remove_control_chars(char *str) {
-int remove_control_chars(unsigned char *str) {
- int i;
- int change = 0;
-
- for(i = 0; str[i]; i++) {
- if (str[i] < 32) {
- str[i] = '_';
- change = 1;
- }
- }
-
- return change;
-}
-
-//Trims a string, also removes illegal characters such as \t and reduces continous spaces to a single one. by [Foruken]
-char *trim(char *str, const char *delim)
-{
- char *strp = strtok(str,delim);
- char buf[1024];
- char *bufp = buf;
- malloc_tsetdword(buf,0,sizeof buf);
-
- while(strp) {
- strcpy(bufp, strp);
- bufp = bufp + strlen(strp);
- strp = strtok(NULL, delim);
- if (strp) {
- strcpy(bufp," ");
- bufp++;
- }
- }
- strcpy(str,buf);
- return str;
-}
-
-
-//stristr: Case insensitive version of strstr, code taken from
-//http://www.daniweb.com/code/snippet313.html, Dave Sinkula
-//
-const char *stristr(const char *haystack, const char *needle)
-{
- if ( !*needle )
- {
- return haystack;
- }
- for ( ; *haystack; ++haystack )
- {
- if ( toupper(*haystack) == toupper(*needle) )
- {
- /*
- * Matched starting char -- loop through remaining chars.
- */
- const char *h, *n;
- for ( h = haystack, n = needle; *h && *n; ++h, ++n )
- {
- if ( toupper(*h) != toupper(*n) )
- {
- break;
- }
- }
- if ( !*n ) /* matched all of 'needle' to null termination */
- {
- return haystack; /* return the start of the match */
- }
- }
- }
- return 0;
-}
-
-#ifdef __WIN32
-char *_strtok_r(char *s1, const char *s2, char **lasts)
-{
- char *ret;
-
- if (s1 == NULL)
- s1 = *lasts;
- while(*s1 && strchr(s2, *s1))
- ++s1;
- if(*s1 == '\0')
- return NULL;
- ret = s1;
- while(*s1 && !strchr(s2, *s1))
- ++s1;
- if(*s1)
- *s1++ = '\0';
- *lasts = s1;
- return ret;
-}
-#endif
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "strlib.h"
+#include "utils.h"
+#include "../common/malloc.h"
+
+//-----------------------------------------------
+// string lib.
+char* jstrescape (char* pt) {
+ //copy from here
+ char *ptr;
+ int i =0, j=0;
+
+ //copy string to temporary
+ CREATE(ptr, char, J_MAX_MALLOC_SIZE);
+ strcpy(ptr,pt);
+
+ while (ptr[i] != '\0') {
+ switch (ptr[i]) {
+ case '\'':
+ pt[j++] = '\\';
+ pt[j++] = ptr[i++];
+ break;
+ case '\\':
+ pt[j++] = '\\';
+ pt[j++] = ptr[i++];
+ break;
+ case '%':
+ pt[j++] = '_'; i++;
+ break;
+ default:
+ pt[j++] = ptr[i++];
+ }
+ }
+ pt[j++] = '\0';
+ aFree(ptr);
+ return &pt[0];
+}
+
+char* jstrescapecpy (char* pt,char* spt) {
+ //copy from here
+ //WARNING: Target string pt should be able to hold strlen(spt)*2, as each time
+ //a escape character is found, the target's final length increases! [Skotlex]
+ int i =0, j=0;
+
+ if (!spt) { //Return an empty string [Skotlex]
+ pt[0] = '\0';
+ return &pt[0];
+ }
+
+ while (spt[i] != '\0') {
+ switch (spt[i]) {
+ case '\'':
+ pt[j++] = '\\';
+ pt[j++] = spt[i++];
+ break;
+ case '\\':
+ pt[j++] = '\\';
+ pt[j++] = spt[i++];
+ break;
+ case '%':
+ pt[j++] = '_'; i++;
+ break;
+ default:
+ pt[j++] = spt[i++];
+ }
+ }
+ pt[j++] = '\0';
+ return &pt[0];
+}
+int jmemescapecpy (char* pt,char* spt, int size) {
+ //copy from here
+ int i =0, j=0;
+
+ while (i < size) {
+ switch (spt[i]) {
+ case '\'':
+ pt[j++] = '\\';
+ pt[j++] = spt[i++];
+ break;
+ case '\\':
+ pt[j++] = '\\';
+ pt[j++] = spt[i++];
+ break;
+ case '%':
+ pt[j++] = '_'; i++;
+ break;
+ default:
+ pt[j++] = spt[i++];
+ }
+ }
+ // copy size is 0 ~ (j-1)
+ return j;
+}
+
+//-----------------------------------------------------
+// Function to suppress control characters in a string.
+//-----------------------------------------------------
+//int remove_control_chars(char *str) {
+int remove_control_chars(unsigned char *str) {
+ int i;
+ int change = 0;
+
+ for(i = 0; str[i]; i++) {
+ if (str[i] < 32) {
+ str[i] = '_';
+ change = 1;
+ }
+ }
+
+ return change;
+}
+
+//Trims a string, also removes illegal characters such as \t and reduces continous spaces to a single one. by [Foruken]
+char *trim(char *str, const char *delim)
+{
+ char *strp = strtok(str,delim);
+ char buf[1024];
+ char *bufp = buf;
+ malloc_tsetdword(buf,0,sizeof buf);
+
+ while(strp) {
+ strcpy(bufp, strp);
+ bufp = bufp + strlen(strp);
+ strp = strtok(NULL, delim);
+ if (strp) {
+ strcpy(bufp," ");
+ bufp++;
+ }
+ }
+ strcpy(str,buf);
+ return str;
+}
+
+
+//stristr: Case insensitive version of strstr, code taken from
+//http://www.daniweb.com/code/snippet313.html, Dave Sinkula
+//
+const char *stristr(const char *haystack, const char *needle)
+{
+ if ( !*needle )
+ {
+ return haystack;
+ }
+ for ( ; *haystack; ++haystack )
+ {
+ if ( toupper(*haystack) == toupper(*needle) )
+ {
+ /*
+ * Matched starting char -- loop through remaining chars.
+ */
+ const char *h, *n;
+ for ( h = haystack, n = needle; *h && *n; ++h, ++n )
+ {
+ if ( toupper(*h) != toupper(*n) )
+ {
+ break;
+ }
+ }
+ if ( !*n ) /* matched all of 'needle' to null termination */
+ {
+ return haystack; /* return the start of the match */
+ }
+ }
+ }
+ return 0;
+}
+
+#ifdef __WIN32
+char *_strtok_r(char *s1, const char *s2, char **lasts)
+{
+ char *ret;
+
+ if (s1 == NULL)
+ s1 = *lasts;
+ while(*s1 && strchr(s2, *s1))
+ ++s1;
+ if(*s1 == '\0')
+ return NULL;
+ ret = s1;
+ while(*s1 && !strchr(s2, *s1))
+ ++s1;
+ if(*s1)
+ *s1++ = '\0';
+ *lasts = s1;
+ return ret;
+}
+#endif
diff --git a/src/map/intif.c b/src/map/intif.c
index 025d76c9b..40cd52136 100644
--- a/src/map/intif.c
+++ b/src/map/intif.c
@@ -1,1574 +1,1579 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <sys/types.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <signal.h>
-#include <fcntl.h>
-#include <string.h>
-
-#include "../common/showmsg.h"
-#include "../common/socket.h"
-#include "../common/timer.h"
-#include "../common/nullpo.h"
-#include "../common/malloc.h"
-#include "map.h"
-#include "battle.h"
-#include "chrif.h"
-#include "clif.h"
-#include "pc.h"
-#include "intif.h"
-#include "storage.h"
-#include "party.h"
-#include "guild.h"
-#include "pet.h"
-#include "atcommand.h"
-#include "mercenary.h" //albator
-
-static const int packet_len_table[]={
- -1,-1,27,-1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3800-0x380f
- -1, 7, 0, 0, 0, 0, 0, 0, -1,11, 0, 0, 0, 0, 0, 0, //0x3810
- 39,-1,15,15, 14,19, 7,-1, 0, 0, 0, 0, 0, 0, 0, 0, //0x3820
- 10,-1,15, 0, 79,19, 7,-1, 0,-1,-1,-1, 14,67,186,-1, //0x3830
- 9, 9,-1,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3840
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 11,-1, 7, 3, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3880
- -1,-1, 7, 3, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3890 Homunculus [albator]
-};
-
-extern int char_fd; // inter serverのfdはchar_fdを使う
-#define inter_fd (char_fd) // エイリアス
-
-//-----------------------------------------------------------------
-// inter serverへの送信
-
-int CheckForCharServer(void) {
- return ((char_fd <= 0) || session[char_fd] == NULL || session[char_fd]->wdata == NULL);
-}
-
-// pet
-int intif_create_pet(int account_id,int char_id,short pet_class,short pet_lv,short pet_egg_id,
- short pet_equip,short intimate,short hungry,char rename_flag,char incuvate,char *pet_name)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOHEAD(inter_fd, 24 + NAME_LENGTH);
- WFIFOW(inter_fd,0) = 0x3080;
- WFIFOL(inter_fd,2) = account_id;
- WFIFOL(inter_fd,6) = char_id;
- WFIFOW(inter_fd,10) = pet_class;
- WFIFOW(inter_fd,12) = pet_lv;
- WFIFOW(inter_fd,14) = pet_egg_id;
- WFIFOW(inter_fd,16) = pet_equip;
- WFIFOW(inter_fd,18) = intimate;
- WFIFOW(inter_fd,20) = hungry;
- WFIFOB(inter_fd,22) = rename_flag;
- WFIFOB(inter_fd,23) = incuvate;
- memcpy(WFIFOP(inter_fd,24),pet_name,NAME_LENGTH);
- WFIFOSET(inter_fd,24+NAME_LENGTH);
-
- return 0;
-}
-
-int intif_request_petdata(int account_id,int char_id,int pet_id)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOHEAD(inter_fd, 14);
- WFIFOW(inter_fd,0) = 0x3081;
- WFIFOL(inter_fd,2) = account_id;
- WFIFOL(inter_fd,6) = char_id;
- WFIFOL(inter_fd,10) = pet_id;
- WFIFOSET(inter_fd,14);
-
- return 0;
-}
-
-int intif_save_petdata(int account_id,struct s_pet *p)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOHEAD(inter_fd, sizeof(struct s_pet) + 8);
- WFIFOW(inter_fd,0) = 0x3082;
- WFIFOW(inter_fd,2) = sizeof(struct s_pet) + 8;
- WFIFOL(inter_fd,4) = account_id;
- memcpy(WFIFOP(inter_fd,8),p,sizeof(struct s_pet));
- WFIFOSET(inter_fd,WFIFOW(inter_fd,2));
-
- return 0;
-}
-
-int intif_delete_petdata(int pet_id)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOHEAD(inter_fd,6);
- WFIFOW(inter_fd,0) = 0x3083;
- WFIFOL(inter_fd,2) = pet_id;
- WFIFOSET(inter_fd,6);
-
- return 1;
-}
-int intif_rename_pet(struct map_session_data *sd,char *name)
-{
- if (CheckForCharServer())
- return 1;
-
- WFIFOHEAD(inter_fd,NAME_LENGTH+11);
- WFIFOW(inter_fd,0) = 0x3084;
- WFIFOL(inter_fd,2) = sd->status.account_id;
- WFIFOL(inter_fd,6) = sd->status.char_id;
- memcpy(WFIFOP(inter_fd,10),name, NAME_LENGTH);
- WFIFOSET(inter_fd,NAME_LENGTH+11);
- return 0;
-}
-
-
-// GMメッセージを送信
-int intif_GMmessage(char* mes,int len,int flag)
-{
- int lp = (flag&0x10) ? 8 : 4;
-
- // Send to the local players
- clif_GMmessage(NULL, mes, len, flag);
-
- if (CheckForCharServer())
- return 0;
-
- if (other_mapserver_count < 1)
- return 0; //No need to send.
-
- WFIFOHEAD(inter_fd,lp + len + 4);
- WFIFOW(inter_fd,0) = 0x3000;
- WFIFOW(inter_fd,2) = lp + len + 4;
- WFIFOL(inter_fd,4) = 0xFF000000; //"invalid" color signals standard broadcast.
- WFIFOL(inter_fd,8) = 0x65756c62;
- memcpy(WFIFOP(inter_fd,4+lp), mes, len);
- WFIFOSET(inter_fd, WFIFOW(inter_fd,2));
- return 0;
-}
-
-int intif_announce(char* mes,int len, unsigned long color, int flag)
-{
- // Send to the local players
- if(color == 0xFE000000) // This is main chat message [LuzZza]
- clif_MainChatMessage(mes);
- else
- clif_announce(NULL, mes, len, color, flag);
-
- if (CheckForCharServer())
- return 0;
-
- if (other_mapserver_count < 1)
- return 0; //No need to send.
-
- WFIFOHEAD(inter_fd, 8 + len);
- WFIFOW(inter_fd,0) = 0x3000;
- WFIFOW(inter_fd,2) = 8 + len;
- WFIFOL(inter_fd,4) = color;
- memcpy(WFIFOP(inter_fd,8), mes, len);
- WFIFOSET(inter_fd, WFIFOW(inter_fd,2));
- return 0;
-}
-
-// The transmission of Wisp/Page to inter-server (player not found on this server)
-int intif_wis_message(struct map_session_data *sd, char *nick, char *mes, int mes_len) {
- nullpo_retr(0, sd);
- if (CheckForCharServer())
- return 0;
-
- if (other_mapserver_count < 1)
- { //Character not found.
- clif_wis_end(sd->fd, 1);
- return 0;
- }
-
- WFIFOHEAD(inter_fd,mes_len + 52);
- WFIFOW(inter_fd,0) = 0x3001;
- WFIFOW(inter_fd,2) = mes_len + 52;
- memcpy(WFIFOP(inter_fd,4), sd->status.name, NAME_LENGTH);
- memcpy(WFIFOP(inter_fd,4+NAME_LENGTH), nick, NAME_LENGTH);
- memcpy(WFIFOP(inter_fd,4+2*NAME_LENGTH), mes, mes_len);
- WFIFOSET(inter_fd, WFIFOW(inter_fd,2));
-
- if (battle_config.etc_log)
- ShowInfo("intif_wis_message from %s to %s (message: '%s')\n", sd->status.name, nick, mes);
-
- return 0;
-}
-
-// The reply of Wisp/page
-int intif_wis_replay(int id, int flag) {
- if (CheckForCharServer())
- return 0;
- WFIFOHEAD(inter_fd,7);
- WFIFOW(inter_fd,0) = 0x3002;
- WFIFOL(inter_fd,2) = id;
- WFIFOB(inter_fd,6) = flag; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
- WFIFOSET(inter_fd,7);
-
- if (battle_config.etc_log)
- ShowInfo("intif_wis_replay: id: %d, flag:%d\n", id, flag);
-
- return 0;
-}
-
-// The transmission of GM only Wisp/Page from server to inter-server
-int intif_wis_message_to_gm(char *Wisp_name, int min_gm_level, char *mes) {
- int mes_len;
- if (CheckForCharServer())
- return 0;
- mes_len = strlen(mes) + 1; // + null
- WFIFOHEAD(inter_fd, mes_len + 30);
- WFIFOW(inter_fd,0) = 0x3003;
- WFIFOW(inter_fd,2) = mes_len + 30;
- memcpy(WFIFOP(inter_fd,4), Wisp_name, NAME_LENGTH);
- WFIFOW(inter_fd,4+NAME_LENGTH) = (short)min_gm_level;
- memcpy(WFIFOP(inter_fd,6+NAME_LENGTH), mes, mes_len);
- WFIFOSET(inter_fd, WFIFOW(inter_fd,2));
-
- if (battle_config.etc_log)
- ShowNotice("intif_wis_message_to_gm: from: '%s', min level: %d, message: '%s'.\n", Wisp_name, min_gm_level, mes);
-
- return 0;
-}
-
-int intif_regtostr(char* str, struct global_reg *reg, int qty) {
- int len =0, i;
-
- for (i = 0; i < qty; i++) {
- len+= sprintf(str+len, "%s", reg[i].str)+1; //We add 1 to consider the '\0' in place.
- len+= sprintf(str+len, "%s", reg[i].value)+1;
- }
- return len;
-}
-
-//Request for saving registry values.
-int intif_saveregistry(struct map_session_data *sd, int type)
-{
- struct global_reg *reg;
- int count;
-
- if (CheckForCharServer())
- return -1;
-
- switch (type) {
- case 3: //Character reg
- reg = sd->save_reg.global;
- count = sd->save_reg.global_num;
- sd->state.reg_dirty &= ~0x4;
- break;
- case 2: //Account reg
- reg = sd->save_reg.account;
- count = sd->save_reg.account_num;
- sd->state.reg_dirty &= ~0x2;
- break;
- case 1: //Account2 reg
- reg = sd->save_reg.account2;
- count = sd->save_reg.account2_num;
- sd->state.reg_dirty &= ~0x1;
- break;
- default: //Broken code?
- if (battle_config.error_log)
- ShowError("intif_saveregistry: Invalid type %d\n", type);
- return -1;
- }
- WFIFOHEAD(inter_fd, 288 * MAX_REG_NUM+13);
- WFIFOW(inter_fd,0)=0x3004;
- WFIFOL(inter_fd,4)=sd->status.account_id;
- WFIFOL(inter_fd,8)=sd->status.char_id;
- WFIFOB(inter_fd,12)=type;
- if(count ==0){
- WFIFOW(inter_fd,2)=13;
- }else{
- int i,p;
- for (p=13,i = 0; i < count; i++) {
- if (reg[i].str[0] && reg[i].value != 0) {
- p+= sprintf(WFIFOP(inter_fd,p), "%s", reg[i].str)+1; //We add 1 to consider the '\0' in place.
- p+= sprintf(WFIFOP(inter_fd,p), "%s", reg[i].value)+1;
- }
- }
- WFIFOW(inter_fd,2)=p;
- }
- WFIFOSET(inter_fd,WFIFOW(inter_fd,2));
- return 0;
-}
-
-//Request the registries for this player.
-int intif_request_registry(struct map_session_data *sd, int flag)
-{
- nullpo_retr(0, sd);
-
- sd->save_reg.account2_num = -1;
- sd->save_reg.account_num = -1;
- sd->save_reg.global_num = -1;
-
- if (CheckForCharServer())
- return 0;
-
- WFIFOHEAD(inter_fd,6);
- WFIFOW(inter_fd,0) = 0x3005;
- WFIFOL(inter_fd,2) = sd->status.account_id;
- WFIFOL(inter_fd,6) = sd->status.char_id;
- WFIFOB(inter_fd,10) = (flag&1?1:0); //Request Acc Reg 2
- WFIFOB(inter_fd,11) = (flag&2?1:0); //Request Acc Reg
- WFIFOB(inter_fd,12) = (flag&4?1:0); //Request Char Reg
- WFIFOSET(inter_fd,13);
-
- return 0;
-}
-
-// 倉庫データ要求
-int intif_request_storage(int account_id)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOHEAD(inter_fd,6);
- WFIFOW(inter_fd,0) = 0x3010;
- WFIFOL(inter_fd,2) = account_id;
- WFIFOSET(inter_fd,6);
- return 0;
-}
-// 倉庫データ送信
-int intif_send_storage(struct storage *stor)
-{
- if (CheckForCharServer())
- return 0;
- nullpo_retr(0, stor);
- WFIFOHEAD(inter_fd,sizeof(struct storage)+8);
- WFIFOW(inter_fd,0) = 0x3011;
- WFIFOW(inter_fd,2) = sizeof(struct storage)+8;
- WFIFOL(inter_fd,4) = stor->account_id;
- memcpy( WFIFOP(inter_fd,8),stor, sizeof(struct storage) );
- WFIFOSET(inter_fd,WFIFOW(inter_fd,2));
- return 0;
-}
-
-int intif_request_guild_storage(int account_id,int guild_id)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOHEAD(inter_fd,10);
- WFIFOW(inter_fd,0) = 0x3018;
- WFIFOL(inter_fd,2) = account_id;
- WFIFOL(inter_fd,6) = guild_id;
- WFIFOSET(inter_fd,10);
- return 0;
-}
-int intif_send_guild_storage(int account_id,struct guild_storage *gstor)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOHEAD(inter_fd,sizeof(struct guild_storage)+12);
- WFIFOW(inter_fd,0) = 0x3019;
- WFIFOW(inter_fd,2) = sizeof(struct guild_storage)+12;
- WFIFOL(inter_fd,4) = account_id;
- WFIFOL(inter_fd,8) = gstor->guild_id;
- memcpy( WFIFOP(inter_fd,12),gstor, sizeof(struct guild_storage) );
- WFIFOSET(inter_fd,WFIFOW(inter_fd,2));
- return 0;
-}
-
-// パーティ作成要求
-int intif_create_party(struct party_member *member,char *name,int item,int item2)
-{
- if (CheckForCharServer())
- return 0;
- nullpo_retr(0, member);
-
- WFIFOHEAD(inter_fd,64);
- WFIFOW(inter_fd,0) = 0x3020;
- WFIFOW(inter_fd,2) = 30+sizeof(struct party_member);
- memcpy(WFIFOP(inter_fd,4),name, NAME_LENGTH);
- WFIFOB(inter_fd,28)= item;
- WFIFOB(inter_fd,29)= item2;
- memcpy(WFIFOP(inter_fd,30), member, sizeof(struct party_member));
- WFIFOSET(inter_fd,WFIFOW(inter_fd, 2));
- return 0;
-}
-// パーティ情報要求
-int intif_request_partyinfo(int party_id)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOHEAD(inter_fd,6);
- WFIFOW(inter_fd,0) = 0x3021;
- WFIFOL(inter_fd,2) = party_id;
- WFIFOSET(inter_fd,6);
-// if(battle_config.etc_log)
-// printf("intif: request party info\n");
- return 0;
-}
-// パーティ追加要求
-int intif_party_addmember(int party_id,struct party_member *member)
-{
- if (CheckForCharServer())
- return 0;
-
- WFIFOHEAD(inter_fd,42);
- WFIFOW(inter_fd,0)=0x3022;
- WFIFOW(inter_fd,2)=8+sizeof(struct party_member);
- WFIFOL(inter_fd,4)=party_id;
- memcpy(WFIFOP(inter_fd,8),member,sizeof(struct party_member));
- WFIFOSET(inter_fd,WFIFOW(inter_fd, 2));
- return 1;
-}
-// パーティ設定変更
-int intif_party_changeoption(int party_id,int account_id,int exp,int item)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOHEAD(inter_fd,14);
- WFIFOW(inter_fd,0)=0x3023;
- WFIFOL(inter_fd,2)=party_id;
- WFIFOL(inter_fd,6)=account_id;
- WFIFOW(inter_fd,10)=exp;
- WFIFOW(inter_fd,12)=item;
- WFIFOSET(inter_fd,14);
- return 0;
-}
-// パーティ脱退要求
-int intif_party_leave(int party_id,int account_id, int char_id)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOHEAD(inter_fd,14);
- WFIFOW(inter_fd,0)=0x3024;
- WFIFOL(inter_fd,2)=party_id;
- WFIFOL(inter_fd,6)=account_id;
- WFIFOL(inter_fd,10)=char_id;
- WFIFOSET(inter_fd,14);
- return 0;
-}
-// パーティ移動要求
-int intif_party_changemap(struct map_session_data *sd,int online)
-{
- if (CheckForCharServer())
- return 0;
- if(!sd)
- return 0;
-
- WFIFOHEAD(inter_fd,19);
- WFIFOW(inter_fd,0)=0x3025;
- WFIFOL(inter_fd,2)=sd->status.party_id;
- WFIFOL(inter_fd,6)=sd->status.account_id;
- WFIFOL(inter_fd,10)=sd->status.char_id;
- WFIFOW(inter_fd,14)=sd->mapindex;
- WFIFOB(inter_fd,16)=online;
- WFIFOW(inter_fd,17)=sd->status.base_level;
- WFIFOSET(inter_fd,19);
- return 1;
-}
-// パーティー解散要求
-int intif_break_party(int party_id)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOHEAD(inter_fd,6);
- WFIFOW(inter_fd,0)=0x3026;
- WFIFOL(inter_fd,2)=party_id;
- WFIFOSET(inter_fd,6);
- return 0;
-}
-// パーティ会話送信
-int intif_party_message(int party_id,int account_id,char *mes,int len)
-{
- if (CheckForCharServer())
- return 0;
-
- if (other_mapserver_count < 1)
- return 0; //No need to send.
-
- WFIFOHEAD(inter_fd,len + 12);
- WFIFOW(inter_fd,0)=0x3027;
- WFIFOW(inter_fd,2)=len+12;
- WFIFOL(inter_fd,4)=party_id;
- WFIFOL(inter_fd,8)=account_id;
- memcpy(WFIFOP(inter_fd,12),mes,len);
- WFIFOSET(inter_fd,len+12);
- return 0;
-}
-// パーティ競合チェック要求
-int intif_party_checkconflict(int party_id,int account_id,int char_id)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOHEAD(inter_fd,10 + NAME_LENGTH);
- WFIFOW(inter_fd,0)=0x3028;
- WFIFOL(inter_fd,2)=party_id;
- WFIFOL(inter_fd,6)=account_id;
- WFIFOL(inter_fd,10)=char_id;
- WFIFOSET(inter_fd,14);
- return 0;
-}
-
-int intif_party_leaderchange(int party_id,int account_id,int char_id)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOHEAD(inter_fd,14);
- WFIFOW(inter_fd,0)=0x3029;
- WFIFOL(inter_fd,2)=party_id;
- WFIFOL(inter_fd,6)=account_id;
- WFIFOL(inter_fd,10)=char_id;
- WFIFOSET(inter_fd,14);
- return 0;
-}
-
-
-// ギルド作成要求
-int intif_guild_create(const char *name,const struct guild_member *master)
-{
- if (CheckForCharServer())
- return 0;
- nullpo_retr(0, master);
-
- WFIFOHEAD(inter_fd,sizeof(struct guild_member)+(8+NAME_LENGTH));
- WFIFOW(inter_fd,0)=0x3030;
- WFIFOW(inter_fd,2)=sizeof(struct guild_member)+(8+NAME_LENGTH);
- WFIFOL(inter_fd,4)=master->account_id;
- memcpy(WFIFOP(inter_fd,8),name,NAME_LENGTH);
- memcpy(WFIFOP(inter_fd,8+NAME_LENGTH),master,sizeof(struct guild_member));
- WFIFOSET(inter_fd,WFIFOW(inter_fd,2));
- return 0;
-}
-// ギルド情報要求
-int intif_guild_request_info(int guild_id)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOHEAD(inter_fd,6);
- WFIFOW(inter_fd,0) = 0x3031;
- WFIFOL(inter_fd,2) = guild_id;
- WFIFOSET(inter_fd,6);
- return 0;
-}
-// ギルドメンバ追加要求
-int intif_guild_addmember(int guild_id,struct guild_member *m)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOHEAD(inter_fd,sizeof(struct guild_member)+8);
- WFIFOW(inter_fd,0) = 0x3032;
- WFIFOW(inter_fd,2) = sizeof(struct guild_member)+8;
- WFIFOL(inter_fd,4) = guild_id;
- memcpy(WFIFOP(inter_fd,8),m,sizeof(struct guild_member));
- WFIFOSET(inter_fd,WFIFOW(inter_fd,2));
- return 0;
-}
-
-int intif_guild_change_gm(int guild_id, const char* name, int len)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOHEAD(inter_fd, len + 8);
- WFIFOW(inter_fd, 0)=0x3033;
- WFIFOW(inter_fd, 2)=len+8;
- WFIFOL(inter_fd, 4)=guild_id;
- memcpy(WFIFOP(inter_fd,8),name,len);
- WFIFOSET(inter_fd,len+8);
- return 0;
-}
-
-// ギルドメンバ脱退/追放要求
-int intif_guild_leave(int guild_id,int account_id,int char_id,int flag,const char *mes)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOHEAD(inter_fd, 55);
- WFIFOW(inter_fd, 0) = 0x3034;
- WFIFOL(inter_fd, 2) = guild_id;
- WFIFOL(inter_fd, 6) = account_id;
- WFIFOL(inter_fd,10) = char_id;
- WFIFOB(inter_fd,14) = flag;
- memcpy(WFIFOP(inter_fd,15),mes,40);
- WFIFOSET(inter_fd,55);
- return 0;
-}
-// ギルドメンバのオンライン状況/Lv更新要求
-int intif_guild_memberinfoshort(int guild_id,
- int account_id,int char_id,int online,int lv,int class_)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOHEAD(inter_fd, 19);
- WFIFOW(inter_fd, 0) = 0x3035;
- WFIFOL(inter_fd, 2) = guild_id;
- WFIFOL(inter_fd, 6) = account_id;
- WFIFOL(inter_fd,10) = char_id;
- WFIFOB(inter_fd,14) = online;
- WFIFOW(inter_fd,15) = lv;
- WFIFOW(inter_fd,17) = class_;
- WFIFOSET(inter_fd,19);
- return 0;
-}
-// ギルド解散通知
-int intif_guild_break(int guild_id)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOHEAD(inter_fd, 6);
- WFIFOW(inter_fd, 0) = 0x3036;
- WFIFOL(inter_fd, 2) = guild_id;
- WFIFOSET(inter_fd,6);
- return 0;
-}
-// ギルド会話送信
-int intif_guild_message(int guild_id,int account_id,char *mes,int len)
-{
- if (CheckForCharServer())
- return 0;
-
- if (other_mapserver_count < 1)
- return 0; //No need to send.
-
- WFIFOHEAD(inter_fd, len + 12);
- WFIFOW(inter_fd,0)=0x3037;
- WFIFOW(inter_fd,2)=len+12;
- WFIFOL(inter_fd,4)=guild_id;
- WFIFOL(inter_fd,8)=account_id;
- memcpy(WFIFOP(inter_fd,12),mes,len);
- WFIFOSET(inter_fd,len+12);
-
- return 0;
-}
-// ギルド競合チェック要求
-int intif_guild_checkconflict(int guild_id,int account_id,int char_id)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOHEAD(inter_fd, 14);
- WFIFOW(inter_fd, 0)=0x3038;
- WFIFOL(inter_fd, 2)=guild_id;
- WFIFOL(inter_fd, 6)=account_id;
- WFIFOL(inter_fd,10)=char_id;
- WFIFOSET(inter_fd,14);
- return 0;
-}
-// ギルド基本情報変更要求
-int intif_guild_change_basicinfo(int guild_id,int type,const void *data,int len)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOHEAD(inter_fd, len + 10);
- WFIFOW(inter_fd,0)=0x3039;
- WFIFOW(inter_fd,2)=len+10;
- WFIFOL(inter_fd,4)=guild_id;
- WFIFOW(inter_fd,8)=type;
- memcpy(WFIFOP(inter_fd,10),data,len);
- WFIFOSET(inter_fd,len+10);
- return 0;
-}
-// ギルドメンバ情報変更要求
-int intif_guild_change_memberinfo(int guild_id,int account_id,int char_id,
- int type,const void *data,int len)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOHEAD(inter_fd, len + 18);
- WFIFOW(inter_fd, 0)=0x303a;
- WFIFOW(inter_fd, 2)=len+18;
- WFIFOL(inter_fd, 4)=guild_id;
- WFIFOL(inter_fd, 8)=account_id;
- WFIFOL(inter_fd,12)=char_id;
- WFIFOW(inter_fd,16)=type;
- memcpy(WFIFOP(inter_fd,18),data,len);
- WFIFOSET(inter_fd,len+18);
- return 0;
-}
-// ギルド役職変更要求
-int intif_guild_position(int guild_id,int idx,struct guild_position *p)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOHEAD(inter_fd, sizeof(struct guild_position)+12);
- WFIFOW(inter_fd,0)=0x303b;
- WFIFOW(inter_fd,2)=sizeof(struct guild_position)+12;
- WFIFOL(inter_fd,4)=guild_id;
- WFIFOL(inter_fd,8)=idx;
- memcpy(WFIFOP(inter_fd,12),p,sizeof(struct guild_position));
- WFIFOSET(inter_fd,WFIFOW(inter_fd,2));
- return 0;
-}
-// ギルドスキルアップ要求
-int intif_guild_skillup(int guild_id,int skill_num,int account_id,int flag)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOHEAD(inter_fd,14);
- WFIFOW(inter_fd, 0)=0x303c;
- WFIFOL(inter_fd, 2)=guild_id;
- WFIFOL(inter_fd, 6)=skill_num;
- WFIFOL(inter_fd,10)=account_id;
- //WFIFOL(inter_fd,14)=flag;
- WFIFOSET(inter_fd,14);
- return 0;
-}
-// ギルド同盟/敵対要求
-int intif_guild_alliance(int guild_id1,int guild_id2,int account_id1,int account_id2,int flag)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOHEAD(inter_fd,19);
- WFIFOW(inter_fd, 0)=0x303d;
- WFIFOL(inter_fd, 2)=guild_id1;
- WFIFOL(inter_fd, 6)=guild_id2;
- WFIFOL(inter_fd,10)=account_id1;
- WFIFOL(inter_fd,14)=account_id2;
- WFIFOB(inter_fd,18)=flag;
- WFIFOSET(inter_fd,19);
- return 0;
-}
-// ギルド告知変更要求
-int intif_guild_notice(int guild_id,const char *mes1,const char *mes2)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOHEAD(inter_fd,186);
- WFIFOW(inter_fd,0)=0x303e;
- WFIFOL(inter_fd,2)=guild_id;
- memcpy(WFIFOP(inter_fd,6),mes1,60);
- memcpy(WFIFOP(inter_fd,66),mes2,120);
- WFIFOSET(inter_fd,186);
- return 0;
-}
-// ギルドエンブレム変更要求
-int intif_guild_emblem(int guild_id,int len,const char *data)
-{
- if (CheckForCharServer())
- return 0;
- if(guild_id<=0 || len<0 || len>2000)
- return 0;
- WFIFOHEAD(inter_fd,len + 12);
- WFIFOW(inter_fd,0)=0x303f;
- WFIFOW(inter_fd,2)=len+12;
- WFIFOL(inter_fd,4)=guild_id;
- WFIFOL(inter_fd,8)=0;
- memcpy(WFIFOP(inter_fd,12),data,len);
- WFIFOSET(inter_fd,len+12);
- return 0;
-}
-//現在のギルド城占領ギルドを調べる
-int intif_guild_castle_dataload(int castle_id,int index)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOHEAD(inter_fd,5);
- WFIFOW(inter_fd,0)=0x3040;
- WFIFOW(inter_fd,2)=castle_id;
- WFIFOB(inter_fd,4)=index;
- WFIFOSET(inter_fd,5);
- return 0;
-}
-
-//ギルド城占領ギルド変更要求
-int intif_guild_castle_datasave(int castle_id,int index, int value)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOHEAD(inter_fd,9);
- WFIFOW(inter_fd,0)=0x3041;
- WFIFOW(inter_fd,2)=castle_id;
- WFIFOB(inter_fd,4)=index;
- WFIFOL(inter_fd,5)=value;
- WFIFOSET(inter_fd,9);
- return 0;
-}
-
-//-----------------------------------------------------------------
-// Homunculus Packets send to Inter server [albator]
-//-----------------------------------------------------------------
-
-int intif_homunculus_create(int account_id, struct s_homunculus *sh)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOHEAD(inter_fd, sizeof(struct s_homunculus)+8);
- WFIFOW(inter_fd,0) = 0x3090;
- WFIFOW(inter_fd,2) = sizeof(struct s_homunculus)+8;
- WFIFOL(inter_fd,4) = account_id;
- memcpy(WFIFOP(inter_fd,8),sh,sizeof(struct s_homunculus));
- WFIFOSET(inter_fd, WFIFOW(inter_fd,2));
- return 0;
-}
-
-int intif_homunculus_requestload(int account_id, int homun_id)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOHEAD(inter_fd, 10);
- WFIFOW(inter_fd,0) = 0x3091;
- WFIFOL(inter_fd,2) = account_id;
- WFIFOL(inter_fd,6) = homun_id;
- WFIFOSET(inter_fd, 10);
- return 1;
-}
-
-int intif_homunculus_requestsave(int account_id, struct s_homunculus* sh)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOHEAD(inter_fd, sizeof(struct s_homunculus)+8);
- WFIFOW(inter_fd,0) = 0x3092;
- WFIFOW(inter_fd,2) = sizeof(struct s_homunculus)+8;
- WFIFOL(inter_fd,4) = account_id;
- memcpy(WFIFOP(inter_fd,8),sh,sizeof(struct s_homunculus));
- WFIFOSET(inter_fd, WFIFOW(inter_fd,2));
- return 0;
-
-}
-
-int intif_homunculus_requestdelete(int homun_id)
-{
- if (CheckForCharServer())
- return 0;
- WFIFOHEAD(inter_fd, 6);
- WFIFOW(inter_fd, 0) = 0x3093;
- WFIFOL(inter_fd,2) = homun_id;
- WFIFOSET(inter_fd,6);
- return 0;
-
-}
-
-
-//-----------------------------------------------------------------
-// Packets receive from inter server
-
-// Wisp/Page reception
-int intif_parse_WisMessage(int fd) { // rewritten by [Yor]
- struct map_session_data* sd;
- char *wisp_source;
- char name[NAME_LENGTH];
- int id, i;
- RFIFOHEAD(fd);
- id=RFIFOL(fd,4);
-
- memcpy(name, RFIFOP(fd,32), NAME_LENGTH);
- name[NAME_LENGTH-1] = '\0'; //In case name arrived without it's terminator. [Skotlex]
- sd = map_nick2sd(name);
- if(sd == NULL || strcmp(sd->status.name, name) != 0)
- { //Not found
- intif_wis_replay(id,1);
- return 0;
- }
- if(sd->state.ignoreAll) {
- intif_wis_replay(id, 2);
- return 0;
- }
- wisp_source = (char *) RFIFOP(fd,8); // speed up [Yor]
- for(i=0; i < MAX_IGNORE_LIST &&
- sd->ignore[i].name[0] != '\0' &&
- strcmp(sd->ignore[i].name, wisp_source) != 0
- ; i++);
-
- if (i < MAX_IGNORE_LIST && sd->ignore[i].name[0] != '\0')
- { //Ignored
- intif_wis_replay(id, 2);
- return 0;
- }
- //Success to send whisper.
- clif_wis_message(sd->fd, wisp_source, (char*)RFIFOP(fd,56),RFIFOW(fd,2)-56);
- intif_wis_replay(id,0); // 送信成功
- return 0;
-}
-
-// Wisp/page transmission result reception
-int intif_parse_WisEnd(int fd) {
- struct map_session_data* sd;
- RFIFOHEAD(fd);
-
- if (battle_config.etc_log)
- ShowInfo("intif_parse_wisend: player: %s, flag: %d\n", RFIFOP(fd,2), RFIFOB(fd,26)); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
- sd = (struct map_session_data *)map_nick2sd((char *) RFIFOP(fd,2));
- if (sd != NULL)
- clif_wis_end(sd->fd, RFIFOB(fd,26));
-
- return 0;
-}
-
-static int mapif_parse_WisToGM_sub(struct map_session_data* sd,va_list va) {
- int min_gm_level = va_arg(va, int);
- char *wisp_name;
- char *message;
- int len;
- if (pc_isGM(sd) < min_gm_level) return 0;
- wisp_name = va_arg(va, char*);
- message = va_arg(va, char*);
- len = va_arg(va, int);
- clif_wis_message(sd->fd, wisp_name, message, len);
- return 1;
-}
-
-// Received wisp message from map-server via char-server for ALL gm
-int mapif_parse_WisToGM(int fd) { // 0x3003/0x3803 <packet_len>.w <wispname>.24B <min_gm_level>.w <message>.?B
- int min_gm_level, mes_len;
- char Wisp_name[NAME_LENGTH];
- char mbuf[255];
- char *message;
- RFIFOHEAD(fd);
-
- mes_len = RFIFOW(fd,2) - 30;
- message = (char *) (mes_len >= 255 ? (char *) aMallocA(mes_len) : mbuf);
-
- min_gm_level = (int)RFIFOW(fd,28);
- memcpy(Wisp_name, RFIFOP(fd,4), NAME_LENGTH);
- Wisp_name[NAME_LENGTH-1] = '\0';
- memcpy(message, RFIFOP(fd,30), mes_len);
- message[mes_len-1] = '\0';
- // information is sended to all online GM
- clif_foreachclient(mapif_parse_WisToGM_sub, min_gm_level, Wisp_name, message, mes_len);
-
- if (message != mbuf)
- aFree(message);
- return 0;
-}
-
-// アカウント変数通知
-int intif_parse_Registers(int fd) {
- int j,p,len,max, flag;
- struct map_session_data *sd;
- struct global_reg *reg;
- int *qty;
- RFIFOHEAD(fd);
-
- if( (sd=map_id2sd(RFIFOL(fd,4)))==NULL)
- return 1;
-
- if (RFIFOB(fd,12) == 3 && sd->status.char_id != RFIFOL(fd,8))
- return 1; //Character registry from another character.
-
- flag = (sd->save_reg.global_num == -1 || sd->save_reg.account_num == -1 || sd->save_reg.account2_num == -1);
-
- switch (RFIFOB(fd,12)) {
- case 3: //Character Registry
- reg = sd->save_reg.global;
- qty = &sd->save_reg.global_num;
- max = GLOBAL_REG_NUM;
- break;
- case 2: //Account Registry
- reg = sd->save_reg.account;
- qty = &sd->save_reg.account_num;
- max = ACCOUNT_REG_NUM;
- break;
- case 1: //Account2 Registry
- reg = sd->save_reg.account2;
- qty = &sd->save_reg.account2_num;
- max = ACCOUNT_REG2_NUM;
- break;
- default:
- if (battle_config.error_log)
- ShowError("intif_parse_Registers: Unrecognized type %d\n",RFIFOB(fd,12));
- return 0;
- }
- for(j=0,p=13;j<max && p<RFIFOW(fd,2);j++){
- sscanf(RFIFOP(fd,p), "%31c%n", reg[j].str,&len);
- reg[j].str[len]='\0';
- p += len+1; //+1 to skip the '\0' between strings.
- sscanf(RFIFOP(fd,p), "%255c%n", reg[j].value,&len);
- reg[j].value[len]='\0';
- p += len+1;
- }
- *qty = j;
-
- if (flag && sd->save_reg.global_num > -1 && sd->save_reg.account_num > -1 && sd->save_reg.account2_num > -1)
- pc_reg_received(sd); //Received all registry values, execute init scripts and what-not. [Skotlex]
- return 1;
-}
-
-// 倉庫データ受信
-int intif_parse_LoadStorage(int fd) {
- struct storage *stor;
- struct map_session_data *sd;
- RFIFOHEAD(fd);
-
- sd=map_id2sd( RFIFOL(fd,4) );
- if(sd==NULL){
- if(battle_config.error_log)
- ShowError("intif_parse_LoadStorage: user not found %d\n",RFIFOL(fd,4));
- return 1;
- }
-
- if (sd->state.finalsave)
- return 1; //Player is already scheduled to leave the server.
-
- stor = account2storage( RFIFOL(fd,4));
-
- if (stor->storage_status == 1) { // Already open.. lets ignore this update
- if (battle_config.error_log)
- ShowWarning("intif_parse_LoadStorage: storage received for a client already open (User %d:%d)\n", sd->status.account_id, sd->status.char_id);
- return 1;
- }
- if (stor->dirty) { // Already have storage, and it has been modified and not saved yet! Exploit! [Skotlex]
- if (battle_config.error_log)
- ShowWarning("intif_parse_LoadStorage: received storage for an already modified non-saved storage! (User %d:%d)\n", sd->status.account_id, sd->status.char_id);
- return 1;
- }
- if (RFIFOW(fd,2)-8 != sizeof(struct storage)) {
- if (battle_config.error_log)
- ShowError("intif_parse_LoadStorage: data size error %d %d\n", RFIFOW(fd,2)-8, sizeof(struct storage));
- return 1;
- }
- if(battle_config.save_log)
- ShowInfo("intif_openstorage: %d\n",RFIFOL(fd,4) );
- memcpy(stor,RFIFOP(fd,8),sizeof(struct storage));
- stor->dirty=0;
- stor->storage_status=1;
- sd->state.storage_flag = 1;
- clif_storagelist(sd,stor);
- clif_updatestorageamount(sd,stor);
-
- return 0;
-}
-
-// 倉庫データ送信成功
-int intif_parse_SaveStorage(int fd)
-{
- RFIFOHEAD(fd);
- if(battle_config.save_log)
- ShowInfo("intif_savestorage: done %d %d\n",RFIFOL(fd,2),RFIFOB(fd,6) );
- storage_storage_saved(RFIFOL(fd,2));
- return 0;
-}
-
-int intif_parse_LoadGuildStorage(int fd)
-{
- struct guild_storage *gstor;
- struct map_session_data *sd;
- int guild_id;
- RFIFOHEAD(fd);
- guild_id = RFIFOL(fd,8);
- if(guild_id <= 0)
- return 1;
- sd=map_id2sd( RFIFOL(fd,4) );
- if(sd==NULL){
- if(battle_config.error_log)
- ShowError("intif_parse_LoadGuildStorage: user not found %d\n",RFIFOL(fd,4));
- return 1;
- }
- gstor=guild2storage(guild_id);
- if(!gstor) {
- if(battle_config.error_log)
- ShowWarning("intif_parse_LoadGuildStorage: error guild_id %d not exist\n",guild_id);
- return 1;
- }
- if (gstor->storage_status == 1) { // Already open.. lets ignore this update
- if (battle_config.error_log)
- ShowWarning("intif_parse_LoadGuildStorage: storage received for a client already open (User %d:%d)\n", sd->status.account_id, sd->status.char_id);
- return 1;
- }
- if (gstor->dirty) { // Already have storage, and it has been modified and not saved yet! Exploit! [Skotlex]
- if (battle_config.error_log)
- ShowWarning("intif_parse_LoadGuildStorage: received storage for an already modified non-saved storage! (User %d:%d)\n", sd->status.account_id, sd->status.char_id);
- return 1;
- }
- if( RFIFOW(fd,2)-12 != sizeof(struct guild_storage) ){
- gstor->storage_status = 0;
- if(battle_config.error_log)
- ShowError("intif_parse_LoadGuildStorage: data size error %d %d\n",RFIFOW(fd,2)-12 , sizeof(struct guild_storage));
- return 1;
- }
- if(battle_config.save_log)
- ShowInfo("intif_open_guild_storage: %d\n",RFIFOL(fd,4) );
- memcpy(gstor,RFIFOP(fd,12),sizeof(struct guild_storage));
- gstor->storage_status = 1;
- sd->state.storage_flag = 2;
- clif_guildstoragelist(sd,gstor);
- clif_updateguildstorageamount(sd,gstor);
- return 0;
-}
-int intif_parse_SaveGuildStorage(int fd)
-{
- RFIFOHEAD(fd);
- if(battle_config.save_log) {
- ShowInfo("intif_save_guild_storage: done %d %d %d\n",RFIFOL(fd,2),RFIFOL(fd,6),RFIFOB(fd,10) );
- }
- storage_guild_storagesaved(/*RFIFOL(fd,2), */RFIFOL(fd,6));
- return 0;
-}
-
-// パーティ作成可否
-int intif_parse_PartyCreated(int fd)
-{
- RFIFOHEAD(fd);
- if(battle_config.etc_log)
- ShowInfo("intif: party created by account %d\n\n", RFIFOL(fd,2));
- party_created(RFIFOL(fd,2), RFIFOL(fd,6),RFIFOB(fd,10),RFIFOL(fd,11), (char *)RFIFOP(fd,15));
- return 0;
-}
-// パーティ情報
-int intif_parse_PartyInfo(int fd)
-{
- RFIFOHEAD(fd);
- if( RFIFOW(fd,2)==8){
- if(battle_config.error_log)
- ShowWarning("intif: party noinfo %d\n",RFIFOL(fd,4));
- party_recv_noinfo(RFIFOL(fd,4));
- return 0;
- }
-
-// printf("intif: party info %d\n",RFIFOL(fd,4));
- if( RFIFOW(fd,2)!=sizeof(struct party)+4 ){
- if(battle_config.error_log)
- ShowError("intif: party info : data size error %d %d %d\n",RFIFOL(fd,4),RFIFOW(fd,2),sizeof(struct party)+4);
- }
- party_recv_info((struct party *)RFIFOP(fd,4));
- return 0;
-}
-// パーティ追加通知
-int intif_parse_PartyMemberAdded(int fd)
-{
- RFIFOHEAD(fd);
- if(battle_config.etc_log)
- ShowInfo("intif: party member added Party (%d), Account(%d), Char(%d)\n",RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10));
- party_member_added(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10), RFIFOB(fd, 14));
- return 0;
-}
-// パーティ設定変更通知
-int intif_parse_PartyOptionChanged(int fd)
-{
- RFIFOHEAD(fd);
- party_optionchanged(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOW(fd,10),RFIFOW(fd,12),RFIFOB(fd,14));
- return 0;
-}
-// パーティ脱退通知
-int intif_parse_PartyMemberLeaved(int fd)
-{
- RFIFOHEAD(fd);
- if(battle_config.etc_log)
- ShowInfo("intif: party member leaved: Party(%d), Account(%d), Char(%d)\n",RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10));
- party_member_leaved(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10));
- return 0;
-}
-// パーティ解散通知
-int intif_parse_PartyBroken(int fd)
-{
- RFIFOHEAD(fd);
- party_broken(RFIFOL(fd,2));
- return 0;
-}
-// パーティ移動通知
-int intif_parse_PartyMove(int fd)
-{
- RFIFOHEAD(fd);
- party_recv_movemap(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOW(fd,14),RFIFOB(fd,16),RFIFOW(fd,17));
- return 0;
-}
-// パーティメッセージ
-int intif_parse_PartyMessage(int fd)
-{
- RFIFOHEAD(fd);
-// if(battle_config.etc_log)
-// printf("intif_parse_PartyMessage: %s\n",RFIFOP(fd,12));
- party_recv_message(RFIFOL(fd,4),RFIFOL(fd,8),(char *) RFIFOP(fd,12),RFIFOW(fd,2)-12);
- return 0;
-}
-
-// ギルド作成可否
-int intif_parse_GuildCreated(int fd)
-{
- RFIFOHEAD(fd);
- guild_created(RFIFOL(fd,2),RFIFOL(fd,6));
- return 0;
-}
-// ギルド情報
-int intif_parse_GuildInfo(int fd)
-{
- RFIFOHEAD(fd);
- if( RFIFOW(fd,2)==8){
- if(battle_config.error_log)
- ShowWarning("intif: guild noinfo %d\n",RFIFOL(fd,4));
- guild_recv_noinfo(RFIFOL(fd,4));
- return 0;
- }
-
-// if(battle_config.etc_log)
-// printf("intif: guild info %d\n",RFIFOL(fd,4));
- if( RFIFOW(fd,2)!=sizeof(struct guild)+4 ){
- if(battle_config.error_log)
- ShowError("intif: guild info : data size error Gid: %d recv size: %d Expected size: %d\n",RFIFOL(fd,4),RFIFOW(fd,2),sizeof(struct guild)+4);
- }
- guild_recv_info((struct guild *)RFIFOP(fd,4));
- return 0;
-}
-// ギルドメンバ追加通知
-int intif_parse_GuildMemberAdded(int fd)
-{
- RFIFOHEAD(fd);
- if(battle_config.etc_log)
- ShowInfo("intif: guild member added %d %d %d %d\n",RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14));
- guild_member_added(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14));
- return 0;
-}
-// ギルドメンバ脱退/追放通知
-int intif_parse_GuildMemberLeaved(int fd)
-{
- RFIFOHEAD(fd);
- guild_member_leaved(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14),
- (char *) RFIFOP(fd,55), (char *) RFIFOP(fd,15));
- return 0;
-}
-
-// ギルドメンバオンライン状態/Lv変更通知
-int intif_parse_GuildMemberInfoShort(int fd)
-{
- RFIFOHEAD(fd);
- guild_recv_memberinfoshort(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14),RFIFOW(fd,15),RFIFOW(fd,17));
- return 0;
-}
-// ギルド解散通知
-int intif_parse_GuildBroken(int fd)
-{
- RFIFOHEAD(fd);
- guild_broken(RFIFOL(fd,2),RFIFOB(fd,6));
- return 0;
-}
-
-// ギルド基本情報変更通知
-int intif_parse_GuildBasicInfoChanged(int fd)
-{
- int type, guild_id;
- unsigned int dd;
- void *data;
- struct guild *g;
- short dw;
- RFIFOHEAD(fd);
- type=RFIFOW(fd,8);
- guild_id=RFIFOL(fd,4);
- data=RFIFOP(fd,10);
- g=guild_search(guild_id);
- dw=*((short *)data);
- dd=*((unsigned int *)data);
- if( g==NULL )
- return 0;
- switch(type){
- case GBI_EXP: g->exp=dd; break;
- case GBI_GUILDLV: g->guild_lv=dw; break;
- case GBI_SKILLPOINT: g->skill_point=dd; break;
- }
- return 0;
-}
-// ギルドメンバ情報変更通知
-int intif_parse_GuildMemberInfoChanged(int fd)
-{
- int type, guild_id, account_id, char_id, idx, dd;
- void* data;
- struct guild *g;
- RFIFOHEAD(fd);
- type=RFIFOW(fd,16);
- guild_id=RFIFOL(fd,4);
- account_id=RFIFOL(fd,8);
- char_id=RFIFOL(fd,12);
- data=RFIFOP(fd,18);
- g=guild_search(guild_id);
- dd=*((int *)data);
- if( g==NULL )
- return 0;
- idx=guild_getindex(g,account_id,char_id);
- switch(type){
- case GMI_POSITION:
- g->member[idx].position=dd;
- guild_memberposition_changed(g,idx,dd);
- break;
- case GMI_EXP:
- g->member[idx].exp=dd;
- break;
- case GMI_HAIR:
- g->member[idx].hair=dd;
- break;
- case GMI_HAIR_COLOR:
- g->member[idx].hair_color=dd;
- break;
- case GMI_GENDER:
- g->member[idx].gender=dd;
- break;
- case GMI_CLASS:
- g->member[idx].class_=dd;
- break;
- case GMI_LEVEL:
- g->member[idx].lv=dd;
- break;
- }
- return 0;
-}
-
-// ギルド役職変更通知
-int intif_parse_GuildPosition(int fd)
-{
- RFIFOHEAD(fd);
- if( RFIFOW(fd,2)!=sizeof(struct guild_position)+12 ){
- if(battle_config.error_log)
- ShowError("intif: guild info : data size error\n %d %d %d",RFIFOL(fd,4),RFIFOW(fd,2),sizeof(struct guild_position)+12);
- }
- guild_position_changed(RFIFOL(fd,4),RFIFOL(fd,8),(struct guild_position *)RFIFOP(fd,12));
- return 0;
-}
-// ギルドスキル割り振り通知
-int intif_parse_GuildSkillUp(int fd)
-{
- RFIFOHEAD(fd);
- guild_skillupack(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10));
- return 0;
-}
-// ギルド同盟/敵対通知
-int intif_parse_GuildAlliance(int fd)
-{
- RFIFOHEAD(fd);
- guild_allianceack(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOL(fd,14),
- RFIFOB(fd,18),(char *) RFIFOP(fd,19),(char *) RFIFOP(fd,43));
- return 0;
-}
-// ギルド告知変更通知
-int intif_parse_GuildNotice(int fd)
-{
- RFIFOHEAD(fd);
- guild_notice_changed(RFIFOL(fd,2),(char *) RFIFOP(fd,6),(char *) RFIFOP(fd,66));
- return 0;
-}
-// ギルドエンブレム変更通知
-int intif_parse_GuildEmblem(int fd)
-{
- RFIFOHEAD(fd);
- guild_emblem_changed(RFIFOW(fd,2)-12,RFIFOL(fd,4),RFIFOL(fd,8), (char *)RFIFOP(fd,12));
- return 0;
-}
-// ギルド会話受信
-int intif_parse_GuildMessage(int fd)
-{
- RFIFOHEAD(fd);
- guild_recv_message(RFIFOL(fd,4),RFIFOL(fd,8),(char *) RFIFOP(fd,12),RFIFOW(fd,2)-12);
- return 0;
-}
-// ギルド城データ要求返信
-int intif_parse_GuildCastleDataLoad(int fd)
-{
- RFIFOHEAD(fd);
- return guild_castledataloadack(RFIFOW(fd,2),RFIFOB(fd,4),RFIFOL(fd,5));
-}
-// ギルド城データ変更通知
-int intif_parse_GuildCastleDataSave(int fd)
-{
- RFIFOHEAD(fd);
- return guild_castledatasaveack(RFIFOW(fd,2),RFIFOB(fd,4),RFIFOL(fd,5));
-}
-
-// ギルド城データ一括受信(初期化時)
-int intif_parse_GuildCastleAllDataLoad(int fd)
-{
- RFIFOHEAD(fd);
- return guild_castlealldataload(RFIFOW(fd,2),(struct guild_castle *)RFIFOP(fd,4));
-}
-
-int intif_parse_GuildMasterChanged(int fd)
-{
- RFIFOHEAD(fd);
- return guild_gm_changed(RFIFOL(fd,2),RFIFOL(fd,6));
-}
-
-// pet
-int intif_parse_CreatePet(int fd)
-{
- RFIFOHEAD(fd);
- pet_get_egg(RFIFOL(fd,2),RFIFOL(fd,7),RFIFOB(fd,6));
-
- return 0;
-}
-
-int intif_parse_RecvPetData(int fd)
-{
- struct s_pet p;
- int len;
- RFIFOHEAD(fd);
- len=RFIFOW(fd,2);
- if(sizeof(struct s_pet)!=len-9) {
- if(battle_config.etc_log)
- ShowError("intif: pet data: data size error %d %d\n",sizeof(struct s_pet),len-9);
- }
- else{
- memcpy(&p,RFIFOP(fd,9),sizeof(struct s_pet));
- pet_recv_petdata(RFIFOL(fd,4),&p,RFIFOB(fd,8));
- }
-
- return 0;
-}
-int intif_parse_SavePetOk(int fd)
-{
- RFIFOHEAD(fd);
- if(RFIFOB(fd,6) == 1) {
- if(battle_config.error_log)
- ShowError("pet data save failure\n");
- }
-
- return 0;
-}
-
-int intif_parse_DeletePetOk(int fd)
-{
- RFIFOHEAD(fd);
- if(RFIFOB(fd,2) == 1) {
- if(battle_config.error_log)
- ShowError("pet data delete failure\n");
- }
-
- return 0;
-}
-
-int intif_parse_RenamePetOk(int fd)
-{
- struct map_session_data *sd = NULL;
- RFIFOHEAD(fd);
- if((sd=map_id2sd(RFIFOL(fd,2)))==NULL ||
- sd->status.char_id != RFIFOL(fd,6))
- return 0;
- if (RFIFOB(fd,10) == 0) {
- clif_displaymessage(sd->fd, msg_txt(280)); // You cannot use this name for your pet.
- clif_send_petstatus(sd); //Send status so client knows oet name change got rejected.
- return 0;
- }
- pet_change_name(sd, RFIFOP(fd,11),1);
- return 0;
-}
-
-//----------------------------------------------------------------
-// Homunculus recv packets [albator]
-
-int intif_parse_CreateHomunculus(int fd)
-{
- int len;
- RFIFOHEAD(fd);
- len=RFIFOW(fd,2)-9;
- if(sizeof(struct s_homunculus)!=len) {
- if(battle_config.etc_log)
- ShowError("intif: create homun data: data size error %d != %d\n",sizeof(struct s_homunculus),len);
- return 0;
- }
- merc_hom_recv_data(RFIFOL(fd,4), (struct s_homunculus*)RFIFOP(fd,9), RFIFOB(fd,8)) ;
- return 0;
-}
-
-int intif_parse_RecvHomunculusData(int fd)
-{
- int len;
-
- RFIFOHEAD(fd);
- len=RFIFOW(fd,2)-9;
-
- if(sizeof(struct s_homunculus)!=len) {
- if(battle_config.etc_log)
- ShowError("intif: homun data: data size error %d %d\n",sizeof(struct s_homunculus),len);
- return 0;
- }
- merc_hom_recv_data(RFIFOL(fd,4), (struct s_homunculus*)RFIFOP(fd,9), RFIFOB(fd,8));
- return 0;
-}
-
-int intif_parse_SaveHomunculusOk(int fd)
-{
- RFIFOHEAD(fd);
- if(RFIFOB(fd,6) != 1) {
- if(battle_config.error_log)
- ShowError("homunculus data save failure for account %d\n", RFIFOL(fd,2));
- }
- return 0;
-}
-
-int intif_parse_DeleteHomunculusOk(int fd)
-{
- RFIFOHEAD(fd);
- if(RFIFOB(fd,2) != 1) {
- if(battle_config.error_log)
- ShowError("Homunculus data delete failure\n");
- }
-
- return 0;
-}
-//-----------------------------------------------------------------
-// inter serverからの通信
-// エラーがあれば0(false)を返すこと
-// パケットが処理できれば1,パケット長が足りなければ2を返すこと
-int intif_parse(int fd)
-{
- int packet_len, cmd;
- RFIFOHEAD(fd);
- cmd = RFIFOW(fd,0);
- // パケットのID確認
- if(cmd<0x3800 || cmd>=0x3800+(sizeof(packet_len_table)/sizeof(packet_len_table[0])) ||
- packet_len_table[cmd-0x3800]==0){
- return 0;
- }
- // パケットの長さ確認
- packet_len = packet_len_table[cmd-0x3800];
- if(packet_len==-1){
- if(RFIFOREST(fd)<4)
- return 2;
- packet_len = RFIFOW(fd,2);
- }
-// if(battle_config.etc_log)
-// printf("intif_parse %d %x %d %d\n",fd,cmd,packet_len,RFIFOREST(fd));
- if((int)RFIFOREST(fd)<packet_len){
- return 2;
- }
- // 処理分岐
- switch(cmd){
- case 0x3800:
- if (RFIFOL(fd,4) == 0xFF000000) //Normal announce.
- clif_GMmessage(NULL,(char *) RFIFOP(fd,8),packet_len-8,0);
- else if (RFIFOL(fd,4) == 0xFE000000) //Main chat message [LuzZza]
- clif_MainChatMessage((char *)RFIFOP(fd,8));
- else //Color announce.
- clif_announce(NULL,(char *) RFIFOP(fd,8),packet_len-8,RFIFOL(fd,4),0);
- break;
- case 0x3801: intif_parse_WisMessage(fd); break;
- case 0x3802: intif_parse_WisEnd(fd); break;
- case 0x3803: mapif_parse_WisToGM(fd); break;
- case 0x3804: intif_parse_Registers(fd); break;
- case 0x3810: intif_parse_LoadStorage(fd); break;
- case 0x3811: intif_parse_SaveStorage(fd); break;
- case 0x3818: intif_parse_LoadGuildStorage(fd); break;
- case 0x3819: intif_parse_SaveGuildStorage(fd); break;
- case 0x3820: intif_parse_PartyCreated(fd); break;
- case 0x3821: intif_parse_PartyInfo(fd); break;
- case 0x3822: intif_parse_PartyMemberAdded(fd); break;
- case 0x3823: intif_parse_PartyOptionChanged(fd); break;
- case 0x3824: intif_parse_PartyMemberLeaved(fd); break;
- case 0x3825: intif_parse_PartyMove(fd); break;
- case 0x3826: intif_parse_PartyBroken(fd); break;
- case 0x3827: intif_parse_PartyMessage(fd); break;
- case 0x3830: intif_parse_GuildCreated(fd); break;
- case 0x3831: intif_parse_GuildInfo(fd); break;
- case 0x3832: intif_parse_GuildMemberAdded(fd); break;
- case 0x3834: intif_parse_GuildMemberLeaved(fd); break;
- case 0x3835: intif_parse_GuildMemberInfoShort(fd); break;
- case 0x3836: intif_parse_GuildBroken(fd); break;
- case 0x3837: intif_parse_GuildMessage(fd); break;
- case 0x3839: intif_parse_GuildBasicInfoChanged(fd); break;
- case 0x383a: intif_parse_GuildMemberInfoChanged(fd); break;
- case 0x383b: intif_parse_GuildPosition(fd); break;
- case 0x383c: intif_parse_GuildSkillUp(fd); break;
- case 0x383d: intif_parse_GuildAlliance(fd); break;
- case 0x383e: intif_parse_GuildNotice(fd); break;
- case 0x383f: intif_parse_GuildEmblem(fd); break;
- case 0x3840: intif_parse_GuildCastleDataLoad(fd); break;
- case 0x3841: intif_parse_GuildCastleDataSave(fd); break;
- case 0x3842: intif_parse_GuildCastleAllDataLoad(fd); break;
- case 0x3843: intif_parse_GuildMasterChanged(fd); break;
- case 0x3880: intif_parse_CreatePet(fd); break;
- case 0x3881: intif_parse_RecvPetData(fd); break;
- case 0x3882: intif_parse_SavePetOk(fd); break;
- case 0x3883: intif_parse_DeletePetOk(fd); break;
- case 0x3884: intif_parse_RenamePetOk(fd); break;
- case 0x3890: intif_parse_CreateHomunculus(fd); break;
- case 0x3891: intif_parse_RecvHomunculusData(fd); break;
- case 0x3892: intif_parse_SaveHomunculusOk(fd); break;
- case 0x3893: intif_parse_DeleteHomunculusOk(fd); break;
- default:
- if(battle_config.error_log)
- ShowError("intif_parse : unknown packet %d %x\n",fd,RFIFOW(fd,0));
- return 0;
- }
- // パケット読み飛ばし
- RFIFOSKIP(fd,packet_len);
- return 1;
-}
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <fcntl.h>
+#include <string.h>
+
+#include "../common/showmsg.h"
+#include "../common/socket.h"
+#include "../common/timer.h"
+#include "../common/nullpo.h"
+#include "../common/malloc.h"
+#include "map.h"
+#include "battle.h"
+#include "chrif.h"
+#include "clif.h"
+#include "pc.h"
+#include "intif.h"
+#include "storage.h"
+#include "party.h"
+#include "guild.h"
+#include "pet.h"
+#include "atcommand.h"
+#include "mercenary.h" //albator
+
+static const int packet_len_table[]={
+ -1,-1,27,-1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3800-0x380f
+ -1, 7, 0, 0, 0, 0, 0, 0, -1,11, 0, 0, 0, 0, 0, 0, //0x3810
+ 39,-1,15,15, 14,19, 7,-1, 0, 0, 0, 0, 0, 0, 0, 0, //0x3820
+ 10,-1,15, 0, 79,19, 7,-1, 0,-1,-1,-1, 14,67,186,-1, //0x3830
+ 9, 9,-1,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3840
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 11,-1, 7, 3, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3880
+ -1,-1, 7, 3, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3890 Homunculus [albator]
+};
+
+extern int char_fd; // inter serverのfdはchar_fdを使う
+#define inter_fd (char_fd) // エイリアス
+
+//-----------------------------------------------------------------
+// inter serverへの送信
+
+int CheckForCharServer(void) {
+ return ((char_fd <= 0) || session[char_fd] == NULL || session[char_fd]->wdata == NULL);
+}
+
+// pet
+int intif_create_pet(int account_id,int char_id,short pet_class,short pet_lv,short pet_egg_id,
+ short pet_equip,short intimate,short hungry,char rename_flag,char incuvate,char *pet_name)
+{
+ if (CheckForCharServer())
+ return 0;
+ WFIFOHEAD(inter_fd, 24 + NAME_LENGTH);
+ WFIFOW(inter_fd,0) = 0x3080;
+ WFIFOL(inter_fd,2) = account_id;
+ WFIFOL(inter_fd,6) = char_id;
+ WFIFOW(inter_fd,10) = pet_class;
+ WFIFOW(inter_fd,12) = pet_lv;
+ WFIFOW(inter_fd,14) = pet_egg_id;
+ WFIFOW(inter_fd,16) = pet_equip;
+ WFIFOW(inter_fd,18) = intimate;
+ WFIFOW(inter_fd,20) = hungry;
+ WFIFOB(inter_fd,22) = rename_flag;
+ WFIFOB(inter_fd,23) = incuvate;
+ memcpy(WFIFOP(inter_fd,24),pet_name,NAME_LENGTH);
+ WFIFOSET(inter_fd,24+NAME_LENGTH);
+
+ return 0;
+}
+
+int intif_request_petdata(int account_id,int char_id,int pet_id)
+{
+ if (CheckForCharServer())
+ return 0;
+ WFIFOHEAD(inter_fd, 14);
+ WFIFOW(inter_fd,0) = 0x3081;
+ WFIFOL(inter_fd,2) = account_id;
+ WFIFOL(inter_fd,6) = char_id;
+ WFIFOL(inter_fd,10) = pet_id;
+ WFIFOSET(inter_fd,14);
+
+ return 0;
+}
+
+int intif_save_petdata(int account_id,struct s_pet *p)
+{
+ if (CheckForCharServer())
+ return 0;
+ WFIFOHEAD(inter_fd, sizeof(struct s_pet) + 8);
+ WFIFOW(inter_fd,0) = 0x3082;
+ WFIFOW(inter_fd,2) = sizeof(struct s_pet) + 8;
+ WFIFOL(inter_fd,4) = account_id;
+ memcpy(WFIFOP(inter_fd,8),p,sizeof(struct s_pet));
+ WFIFOSET(inter_fd,WFIFOW(inter_fd,2));
+
+ return 0;
+}
+
+int intif_delete_petdata(int pet_id)
+{
+ if (CheckForCharServer())
+ return 0;
+ WFIFOHEAD(inter_fd,6);
+ WFIFOW(inter_fd,0) = 0x3083;
+ WFIFOL(inter_fd,2) = pet_id;
+ WFIFOSET(inter_fd,6);
+
+ return 1;
+}
+int intif_rename_pet(struct map_session_data *sd,char *name)
+{
+ if (CheckForCharServer())
+ return 1;
+
+ WFIFOHEAD(inter_fd,NAME_LENGTH+11);
+ WFIFOW(inter_fd,0) = 0x3084;
+ WFIFOL(inter_fd,2) = sd->status.account_id;
+ WFIFOL(inter_fd,6) = sd->status.char_id;
+ memcpy(WFIFOP(inter_fd,10),name, NAME_LENGTH);
+ WFIFOSET(inter_fd,NAME_LENGTH+11);
+ return 0;
+}
+
+
+// GMメッセージを送信
+int intif_GMmessage(char* mes,int len,int flag)
+{
+ int lp = (flag&0x10) ? 8 : 4;
+
+ // Send to the local players
+ clif_GMmessage(NULL, mes, len, flag);
+
+ if (CheckForCharServer())
+ return 0;
+
+ if (other_mapserver_count < 1)
+ return 0; //No need to send.
+
+ WFIFOHEAD(inter_fd,lp + len + 4);
+ WFIFOW(inter_fd,0) = 0x3000;
+ WFIFOW(inter_fd,2) = lp + len + 4;
+ WFIFOL(inter_fd,4) = 0xFF000000; //"invalid" color signals standard broadcast.
+ WFIFOL(inter_fd,8) = 0x65756c62;
+ memcpy(WFIFOP(inter_fd,4+lp), mes, len);
+ WFIFOSET(inter_fd, WFIFOW(inter_fd,2));
+ return 0;
+}
+
+int intif_announce(char* mes,int len, unsigned long color, int flag)
+{
+ // Send to the local players
+ if(color == 0xFE000000) // This is main chat message [LuzZza]
+ clif_MainChatMessage(mes);
+ else
+ clif_announce(NULL, mes, len, color, flag);
+
+ if (CheckForCharServer())
+ return 0;
+
+ if (other_mapserver_count < 1)
+ return 0; //No need to send.
+
+ WFIFOHEAD(inter_fd, 8 + len);
+ WFIFOW(inter_fd,0) = 0x3000;
+ WFIFOW(inter_fd,2) = 8 + len;
+ WFIFOL(inter_fd,4) = color;
+ memcpy(WFIFOP(inter_fd,8), mes, len);
+ WFIFOSET(inter_fd, WFIFOW(inter_fd,2));
+ return 0;
+}
+
+// The transmission of Wisp/Page to inter-server (player not found on this server)
+int intif_wis_message(struct map_session_data *sd, char *nick, char *mes, int mes_len) {
+ nullpo_retr(0, sd);
+ if (CheckForCharServer())
+ return 0;
+
+ if (other_mapserver_count < 1)
+ { //Character not found.
+ clif_wis_end(sd->fd, 1);
+ return 0;
+ }
+
+ WFIFOHEAD(inter_fd,mes_len + 52);
+ WFIFOW(inter_fd,0) = 0x3001;
+ WFIFOW(inter_fd,2) = mes_len + 52;
+ memcpy(WFIFOP(inter_fd,4), sd->status.name, NAME_LENGTH);
+ memcpy(WFIFOP(inter_fd,4+NAME_LENGTH), nick, NAME_LENGTH);
+ memcpy(WFIFOP(inter_fd,4+2*NAME_LENGTH), mes, mes_len);
+ WFIFOSET(inter_fd, WFIFOW(inter_fd,2));
+
+ if (battle_config.etc_log)
+ ShowInfo("intif_wis_message from %s to %s (message: '%s')\n", sd->status.name, nick, mes);
+
+ return 0;
+}
+
+// The reply of Wisp/page
+int intif_wis_replay(int id, int flag) {
+ if (CheckForCharServer())
+ return 0;
+ WFIFOHEAD(inter_fd,7);
+ WFIFOW(inter_fd,0) = 0x3002;
+ WFIFOL(inter_fd,2) = id;
+ WFIFOB(inter_fd,6) = flag; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
+ WFIFOSET(inter_fd,7);
+
+ if (battle_config.etc_log)
+ ShowInfo("intif_wis_replay: id: %d, flag:%d\n", id, flag);
+
+ return 0;
+}
+
+// The transmission of GM only Wisp/Page from server to inter-server
+int intif_wis_message_to_gm(char *Wisp_name, int min_gm_level, char *mes) {
+ int mes_len;
+ if (CheckForCharServer())
+ return 0;
+ mes_len = strlen(mes) + 1; // + null
+ WFIFOHEAD(inter_fd, mes_len + 30);
+ WFIFOW(inter_fd,0) = 0x3003;
+ WFIFOW(inter_fd,2) = mes_len + 30;
+ memcpy(WFIFOP(inter_fd,4), Wisp_name, NAME_LENGTH);
+ WFIFOW(inter_fd,4+NAME_LENGTH) = (short)min_gm_level;
+ memcpy(WFIFOP(inter_fd,6+NAME_LENGTH), mes, mes_len);
+ WFIFOSET(inter_fd, WFIFOW(inter_fd,2));
+
+ if (battle_config.etc_log)
+ ShowNotice("intif_wis_message_to_gm: from: '%s', min level: %d, message: '%s'.\n", Wisp_name, min_gm_level, mes);
+
+ return 0;
+}
+
+int intif_regtostr(char* str, struct global_reg *reg, int qty) {
+ int len =0, i;
+
+ for (i = 0; i < qty; i++) {
+ len+= sprintf(str+len, "%s", reg[i].str)+1; //We add 1 to consider the '\0' in place.
+ len+= sprintf(str+len, "%s", reg[i].value)+1;
+ }
+ return len;
+}
+
+//Request for saving registry values.
+int intif_saveregistry(struct map_session_data *sd, int type)
+{
+ struct global_reg *reg;
+ int count;
+
+ if (CheckForCharServer())
+ return -1;
+
+ switch (type) {
+ case 3: //Character reg
+ reg = sd->save_reg.global;
+ count = sd->save_reg.global_num;
+ sd->state.reg_dirty &= ~0x4;
+ break;
+ case 2: //Account reg
+ reg = sd->save_reg.account;
+ count = sd->save_reg.account_num;
+ sd->state.reg_dirty &= ~0x2;
+ break;
+ case 1: //Account2 reg
+ reg = sd->save_reg.account2;
+ count = sd->save_reg.account2_num;
+ sd->state.reg_dirty &= ~0x1;
+ break;
+ default: //Broken code?
+ if (battle_config.error_log)
+ ShowError("intif_saveregistry: Invalid type %d\n", type);
+ return -1;
+ }
+ WFIFOHEAD(inter_fd, 288 * MAX_REG_NUM+13);
+ WFIFOW(inter_fd,0)=0x3004;
+ WFIFOL(inter_fd,4)=sd->status.account_id;
+ WFIFOL(inter_fd,8)=sd->status.char_id;
+ WFIFOB(inter_fd,12)=type;
+ if(count ==0){
+ WFIFOW(inter_fd,2)=13;
+ }else{
+ int i,p;
+ for (p=13,i = 0; i < count; i++) {
+ if (reg[i].str[0] && reg[i].value != 0) {
+ p+= sprintf(WFIFOP(inter_fd,p), "%s", reg[i].str)+1; //We add 1 to consider the '\0' in place.
+ p+= sprintf(WFIFOP(inter_fd,p), "%s", reg[i].value)+1;
+ }
+ }
+ WFIFOW(inter_fd,2)=p;
+ }
+ WFIFOSET(inter_fd,WFIFOW(inter_fd,2));
+ return 0;
+}
+
+//Request the registries for this player.
+int intif_request_registry(struct map_session_data *sd, int flag)
+{
+ nullpo_retr(0, sd);
+
+ sd->save_reg.account2_num = -1;
+ sd->save_reg.account_num = -1;
+ sd->save_reg.global_num = -1;
+
+ if (CheckForCharServer())
+ return 0;
+
+ WFIFOHEAD(inter_fd,6);
+ WFIFOW(inter_fd,0) = 0x3005;
+ WFIFOL(inter_fd,2) = sd->status.account_id;
+ WFIFOL(inter_fd,6) = sd->status.char_id;
+ WFIFOB(inter_fd,10) = (flag&1?1:0); //Request Acc Reg 2
+ WFIFOB(inter_fd,11) = (flag&2?1:0); //Request Acc Reg
+ WFIFOB(inter_fd,12) = (flag&4?1:0); //Request Char Reg
+ WFIFOSET(inter_fd,13);
+
+ return 0;
+}
+
+// 倉庫データ要求
+int intif_request_storage(int account_id)
+{
+ if (CheckForCharServer())
+ return 0;
+ WFIFOHEAD(inter_fd,6);
+ WFIFOW(inter_fd,0) = 0x3010;
+ WFIFOL(inter_fd,2) = account_id;
+ WFIFOSET(inter_fd,6);
+ return 0;
+}
+// 倉庫データ送信
+int intif_send_storage(struct storage *stor)
+{
+ if (CheckForCharServer())
+ return 0;
+ nullpo_retr(0, stor);
+ WFIFOHEAD(inter_fd,sizeof(struct storage)+8);
+ WFIFOW(inter_fd,0) = 0x3011;
+ WFIFOW(inter_fd,2) = sizeof(struct storage)+8;
+ WFIFOL(inter_fd,4) = stor->account_id;
+ memcpy( WFIFOP(inter_fd,8),stor, sizeof(struct storage) );
+ WFIFOSET(inter_fd,WFIFOW(inter_fd,2));
+ return 0;
+}
+
+int intif_request_guild_storage(int account_id,int guild_id)
+{
+ if (CheckForCharServer())
+ return 0;
+ WFIFOHEAD(inter_fd,10);
+ WFIFOW(inter_fd,0) = 0x3018;
+ WFIFOL(inter_fd,2) = account_id;
+ WFIFOL(inter_fd,6) = guild_id;
+ WFIFOSET(inter_fd,10);
+ return 0;
+}
+int intif_send_guild_storage(int account_id,struct guild_storage *gstor)
+{
+ if (CheckForCharServer())
+ return 0;
+ WFIFOHEAD(inter_fd,sizeof(struct guild_storage)+12);
+ WFIFOW(inter_fd,0) = 0x3019;
+ WFIFOW(inter_fd,2) = sizeof(struct guild_storage)+12;
+ WFIFOL(inter_fd,4) = account_id;
+ WFIFOL(inter_fd,8) = gstor->guild_id;
+ memcpy( WFIFOP(inter_fd,12),gstor, sizeof(struct guild_storage) );
+ WFIFOSET(inter_fd,WFIFOW(inter_fd,2));
+ return 0;
+}
+
+// パーティ作成要求
+int intif_create_party(struct party_member *member,char *name,int item,int item2)
+{
+ if (CheckForCharServer())
+ return 0;
+ nullpo_retr(0, member);
+
+ WFIFOHEAD(inter_fd,64);
+ WFIFOW(inter_fd,0) = 0x3020;
+ WFIFOW(inter_fd,2) = 30+sizeof(struct party_member);
+ memcpy(WFIFOP(inter_fd,4),name, NAME_LENGTH);
+ WFIFOB(inter_fd,28)= item;
+ WFIFOB(inter_fd,29)= item2;
+ memcpy(WFIFOP(inter_fd,30), member, sizeof(struct party_member));
+ WFIFOSET(inter_fd,WFIFOW(inter_fd, 2));
+ return 0;
+}
+// パーティ情報要求
+int intif_request_partyinfo(int party_id)
+{
+ if (CheckForCharServer())
+ return 0;
+ WFIFOHEAD(inter_fd,6);
+ WFIFOW(inter_fd,0) = 0x3021;
+ WFIFOL(inter_fd,2) = party_id;
+ WFIFOSET(inter_fd,6);
+// if(battle_config.etc_log)
+// printf("intif: request party info\n");
+ return 0;
+}
+// パーティ追加要求
+int intif_party_addmember(int party_id,struct party_member *member)
+{
+ if (CheckForCharServer())
+ return 0;
+
+ WFIFOHEAD(inter_fd,42);
+ WFIFOW(inter_fd,0)=0x3022;
+ WFIFOW(inter_fd,2)=8+sizeof(struct party_member);
+ WFIFOL(inter_fd,4)=party_id;
+ memcpy(WFIFOP(inter_fd,8),member,sizeof(struct party_member));
+ WFIFOSET(inter_fd,WFIFOW(inter_fd, 2));
+ return 1;
+}
+// パーティ設定変更
+int intif_party_changeoption(int party_id,int account_id,int exp,int item)
+{
+ if (CheckForCharServer())
+ return 0;
+ WFIFOHEAD(inter_fd,14);
+ WFIFOW(inter_fd,0)=0x3023;
+ WFIFOL(inter_fd,2)=party_id;
+ WFIFOL(inter_fd,6)=account_id;
+ WFIFOW(inter_fd,10)=exp;
+ WFIFOW(inter_fd,12)=item;
+ WFIFOSET(inter_fd,14);
+ return 0;
+}
+// パーティ脱退要求
+int intif_party_leave(int party_id,int account_id, int char_id)
+{
+ if (CheckForCharServer())
+ return 0;
+ WFIFOHEAD(inter_fd,14);
+ WFIFOW(inter_fd,0)=0x3024;
+ WFIFOL(inter_fd,2)=party_id;
+ WFIFOL(inter_fd,6)=account_id;
+ WFIFOL(inter_fd,10)=char_id;
+ WFIFOSET(inter_fd,14);
+ return 0;
+}
+// パーティ移動要求
+int intif_party_changemap(struct map_session_data *sd,int online)
+{
+ if (CheckForCharServer())
+ return 0;
+ if(!sd)
+ return 0;
+
+ WFIFOHEAD(inter_fd,19);
+ WFIFOW(inter_fd,0)=0x3025;
+ WFIFOL(inter_fd,2)=sd->status.party_id;
+ WFIFOL(inter_fd,6)=sd->status.account_id;
+ WFIFOL(inter_fd,10)=sd->status.char_id;
+ WFIFOW(inter_fd,14)=sd->mapindex;
+ WFIFOB(inter_fd,16)=online;
+ WFIFOW(inter_fd,17)=sd->status.base_level;
+ WFIFOSET(inter_fd,19);
+ return 1;
+}
+// パーティー解散要求
+int intif_break_party(int party_id)
+{
+ if (CheckForCharServer())
+ return 0;
+ WFIFOHEAD(inter_fd,6);
+ WFIFOW(inter_fd,0)=0x3026;
+ WFIFOL(inter_fd,2)=party_id;
+ WFIFOSET(inter_fd,6);
+ return 0;
+}
+// パーティ会話送信
+int intif_party_message(int party_id,int account_id,char *mes,int len)
+{
+ if (CheckForCharServer())
+ return 0;
+
+ if (other_mapserver_count < 1)
+ return 0; //No need to send.
+
+ WFIFOHEAD(inter_fd,len + 12);
+ WFIFOW(inter_fd,0)=0x3027;
+ WFIFOW(inter_fd,2)=len+12;
+ WFIFOL(inter_fd,4)=party_id;
+ WFIFOL(inter_fd,8)=account_id;
+ memcpy(WFIFOP(inter_fd,12),mes,len);
+ WFIFOSET(inter_fd,len+12);
+ return 0;
+}
+// パーティ競合チェック要求
+int intif_party_checkconflict(int party_id,int account_id,int char_id)
+{
+ if (CheckForCharServer())
+ return 0;
+ WFIFOHEAD(inter_fd,10 + NAME_LENGTH);
+ WFIFOW(inter_fd,0)=0x3028;
+ WFIFOL(inter_fd,2)=party_id;
+ WFIFOL(inter_fd,6)=account_id;
+ WFIFOL(inter_fd,10)=char_id;
+ WFIFOSET(inter_fd,14);
+ return 0;
+}
+
+int intif_party_leaderchange(int party_id,int account_id,int char_id)
+{
+ if (CheckForCharServer())
+ return 0;
+ WFIFOHEAD(inter_fd,14);
+ WFIFOW(inter_fd,0)=0x3029;
+ WFIFOL(inter_fd,2)=party_id;
+ WFIFOL(inter_fd,6)=account_id;
+ WFIFOL(inter_fd,10)=char_id;
+ WFIFOSET(inter_fd,14);
+ return 0;
+}
+
+
+// ギルド作成要求
+int intif_guild_create(const char *name,const struct guild_member *master)
+{
+ if (CheckForCharServer())
+ return 0;
+ nullpo_retr(0, master);
+
+ WFIFOHEAD(inter_fd,sizeof(struct guild_member)+(8+NAME_LENGTH));
+ WFIFOW(inter_fd,0)=0x3030;
+ WFIFOW(inter_fd,2)=sizeof(struct guild_member)+(8+NAME_LENGTH);
+ WFIFOL(inter_fd,4)=master->account_id;
+ memcpy(WFIFOP(inter_fd,8),name,NAME_LENGTH);
+ memcpy(WFIFOP(inter_fd,8+NAME_LENGTH),master,sizeof(struct guild_member));
+ WFIFOSET(inter_fd,WFIFOW(inter_fd,2));
+ return 0;
+}
+// ギルド情報要求
+int intif_guild_request_info(int guild_id)
+{
+ if (CheckForCharServer())
+ return 0;
+ WFIFOHEAD(inter_fd,6);
+ WFIFOW(inter_fd,0) = 0x3031;
+ WFIFOL(inter_fd,2) = guild_id;
+ WFIFOSET(inter_fd,6);
+ return 0;
+}
+// ギルドメンバ追加要求
+int intif_guild_addmember(int guild_id,struct guild_member *m)
+{
+ if (CheckForCharServer())
+ return 0;
+ WFIFOHEAD(inter_fd,sizeof(struct guild_member)+8);
+ WFIFOW(inter_fd,0) = 0x3032;
+ WFIFOW(inter_fd,2) = sizeof(struct guild_member)+8;
+ WFIFOL(inter_fd,4) = guild_id;
+ memcpy(WFIFOP(inter_fd,8),m,sizeof(struct guild_member));
+ WFIFOSET(inter_fd,WFIFOW(inter_fd,2));
+ return 0;
+}
+
+int intif_guild_change_gm(int guild_id, const char* name, int len)
+{
+ if (CheckForCharServer())
+ return 0;
+ WFIFOHEAD(inter_fd, len + 8);
+ WFIFOW(inter_fd, 0)=0x3033;
+ WFIFOW(inter_fd, 2)=len+8;
+ WFIFOL(inter_fd, 4)=guild_id;
+ memcpy(WFIFOP(inter_fd,8),name,len);
+ WFIFOSET(inter_fd,len+8);
+ return 0;
+}
+
+// ギルドメンバ脱退/追放要求
+int intif_guild_leave(int guild_id,int account_id,int char_id,int flag,const char *mes)
+{
+ if (CheckForCharServer())
+ return 0;
+ WFIFOHEAD(inter_fd, 55);
+ WFIFOW(inter_fd, 0) = 0x3034;
+ WFIFOL(inter_fd, 2) = guild_id;
+ WFIFOL(inter_fd, 6) = account_id;
+ WFIFOL(inter_fd,10) = char_id;
+ WFIFOB(inter_fd,14) = flag;
+ memcpy(WFIFOP(inter_fd,15),mes,40);
+ WFIFOSET(inter_fd,55);
+ return 0;
+}
+// ギルドメンバのオンライン状況/Lv更新要求
+int intif_guild_memberinfoshort(int guild_id,
+ int account_id,int char_id,int online,int lv,int class_)
+{
+ if (CheckForCharServer())
+ return 0;
+ WFIFOHEAD(inter_fd, 19);
+ WFIFOW(inter_fd, 0) = 0x3035;
+ WFIFOL(inter_fd, 2) = guild_id;
+ WFIFOL(inter_fd, 6) = account_id;
+ WFIFOL(inter_fd,10) = char_id;
+ WFIFOB(inter_fd,14) = online;
+ WFIFOW(inter_fd,15) = lv;
+ WFIFOW(inter_fd,17) = class_;
+ WFIFOSET(inter_fd,19);
+ return 0;
+}
+// ギルド解散通知
+int intif_guild_break(int guild_id)
+{
+ if (CheckForCharServer())
+ return 0;
+ WFIFOHEAD(inter_fd, 6);
+ WFIFOW(inter_fd, 0) = 0x3036;
+ WFIFOL(inter_fd, 2) = guild_id;
+ WFIFOSET(inter_fd,6);
+ return 0;
+}
+// ギルド会話送信
+int intif_guild_message(int guild_id,int account_id,char *mes,int len)
+{
+ if (CheckForCharServer())
+ return 0;
+
+ if (other_mapserver_count < 1)
+ return 0; //No need to send.
+
+ WFIFOHEAD(inter_fd, len + 12);
+ WFIFOW(inter_fd,0)=0x3037;
+ WFIFOW(inter_fd,2)=len+12;
+ WFIFOL(inter_fd,4)=guild_id;
+ WFIFOL(inter_fd,8)=account_id;
+ memcpy(WFIFOP(inter_fd,12),mes,len);
+ WFIFOSET(inter_fd,len+12);
+
+ return 0;
+}
+// ギルド競合チェック要求
+int intif_guild_checkconflict(int guild_id,int account_id,int char_id)
+{
+ if (CheckForCharServer())
+ return 0;
+ WFIFOHEAD(inter_fd, 14);
+ WFIFOW(inter_fd, 0)=0x3038;
+ WFIFOL(inter_fd, 2)=guild_id;
+ WFIFOL(inter_fd, 6)=account_id;
+ WFIFOL(inter_fd,10)=char_id;
+ WFIFOSET(inter_fd,14);
+ return 0;
+}
+// ギルド基本情報変更要求
+int intif_guild_change_basicinfo(int guild_id,int type,const void *data,int len)
+{
+ if (CheckForCharServer())
+ return 0;
+ WFIFOHEAD(inter_fd, len + 10);
+ WFIFOW(inter_fd,0)=0x3039;
+ WFIFOW(inter_fd,2)=len+10;
+ WFIFOL(inter_fd,4)=guild_id;
+ WFIFOW(inter_fd,8)=type;
+ memcpy(WFIFOP(inter_fd,10),data,len);
+ WFIFOSET(inter_fd,len+10);
+ return 0;
+}
+// ギルドメンバ情報変更要求
+int intif_guild_change_memberinfo(int guild_id,int account_id,int char_id,
+ int type,const void *data,int len)
+{
+ if (CheckForCharServer())
+ return 0;
+ WFIFOHEAD(inter_fd, len + 18);
+ WFIFOW(inter_fd, 0)=0x303a;
+ WFIFOW(inter_fd, 2)=len+18;
+ WFIFOL(inter_fd, 4)=guild_id;
+ WFIFOL(inter_fd, 8)=account_id;
+ WFIFOL(inter_fd,12)=char_id;
+ WFIFOW(inter_fd,16)=type;
+ memcpy(WFIFOP(inter_fd,18),data,len);
+ WFIFOSET(inter_fd,len+18);
+ return 0;
+}
+// ギルド役職変更要求
+int intif_guild_position(int guild_id,int idx,struct guild_position *p)
+{
+ if (CheckForCharServer())
+ return 0;
+ WFIFOHEAD(inter_fd, sizeof(struct guild_position)+12);
+ WFIFOW(inter_fd,0)=0x303b;
+ WFIFOW(inter_fd,2)=sizeof(struct guild_position)+12;
+ WFIFOL(inter_fd,4)=guild_id;
+ WFIFOL(inter_fd,8)=idx;
+ memcpy(WFIFOP(inter_fd,12),p,sizeof(struct guild_position));
+ WFIFOSET(inter_fd,WFIFOW(inter_fd,2));
+ return 0;
+}
+// ギルドスキルアップ要求
+int intif_guild_skillup(int guild_id,int skill_num,int account_id,int flag)
+{
+ if (CheckForCharServer())
+ return 0;
+ WFIFOHEAD(inter_fd,14);
+ WFIFOW(inter_fd, 0)=0x303c;
+ WFIFOL(inter_fd, 2)=guild_id;
+ WFIFOL(inter_fd, 6)=skill_num;
+ WFIFOL(inter_fd,10)=account_id;
+ //WFIFOL(inter_fd,14)=flag;
+ WFIFOSET(inter_fd,14);
+ return 0;
+}
+// ギルド同盟/敵対要求
+int intif_guild_alliance(int guild_id1,int guild_id2,int account_id1,int account_id2,int flag)
+{
+ if (CheckForCharServer())
+ return 0;
+ WFIFOHEAD(inter_fd,19);
+ WFIFOW(inter_fd, 0)=0x303d;
+ WFIFOL(inter_fd, 2)=guild_id1;
+ WFIFOL(inter_fd, 6)=guild_id2;
+ WFIFOL(inter_fd,10)=account_id1;
+ WFIFOL(inter_fd,14)=account_id2;
+ WFIFOB(inter_fd,18)=flag;
+ WFIFOSET(inter_fd,19);
+ return 0;
+}
+// ギルド告知変更要求
+int intif_guild_notice(int guild_id,const char *mes1,const char *mes2)
+{
+ if (CheckForCharServer())
+ return 0;
+ WFIFOHEAD(inter_fd,186);
+ WFIFOW(inter_fd,0)=0x303e;
+ WFIFOL(inter_fd,2)=guild_id;
+ memcpy(WFIFOP(inter_fd,6),mes1,60);
+ memcpy(WFIFOP(inter_fd,66),mes2,120);
+ WFIFOSET(inter_fd,186);
+ return 0;
+}
+// ギルドエンブレム変更要求
+int intif_guild_emblem(int guild_id,int len,const char *data)
+{
+ if (CheckForCharServer())
+ return 0;
+ if(guild_id<=0 || len<0 || len>2000)
+ return 0;
+ WFIFOHEAD(inter_fd,len + 12);
+ WFIFOW(inter_fd,0)=0x303f;
+ WFIFOW(inter_fd,2)=len+12;
+ WFIFOL(inter_fd,4)=guild_id;
+ WFIFOL(inter_fd,8)=0;
+ memcpy(WFIFOP(inter_fd,12),data,len);
+ WFIFOSET(inter_fd,len+12);
+ return 0;
+}
+//現在のギルド城占領ギルドを調べる
+int intif_guild_castle_dataload(int castle_id,int index)
+{
+ if (CheckForCharServer())
+ return 0;
+ WFIFOHEAD(inter_fd,5);
+ WFIFOW(inter_fd,0)=0x3040;
+ WFIFOW(inter_fd,2)=castle_id;
+ WFIFOB(inter_fd,4)=index;
+ WFIFOSET(inter_fd,5);
+ return 0;
+}
+
+//ギルド城占領ギルド変更要求
+int intif_guild_castle_datasave(int castle_id,int index, int value)
+{
+ if (CheckForCharServer())
+ return 0;
+ WFIFOHEAD(inter_fd,9);
+ WFIFOW(inter_fd,0)=0x3041;
+ WFIFOW(inter_fd,2)=castle_id;
+ WFIFOB(inter_fd,4)=index;
+ WFIFOL(inter_fd,5)=value;
+ WFIFOSET(inter_fd,9);
+ return 0;
+}
+
+//-----------------------------------------------------------------
+// Homunculus Packets send to Inter server [albator]
+//-----------------------------------------------------------------
+
+int intif_homunculus_create(int account_id, struct s_homunculus *sh)
+{
+ if (CheckForCharServer())
+ return 0;
+ WFIFOHEAD(inter_fd, sizeof(struct s_homunculus)+8);
+ WFIFOW(inter_fd,0) = 0x3090;
+ WFIFOW(inter_fd,2) = sizeof(struct s_homunculus)+8;
+ WFIFOL(inter_fd,4) = account_id;
+ memcpy(WFIFOP(inter_fd,8),sh,sizeof(struct s_homunculus));
+ WFIFOSET(inter_fd, WFIFOW(inter_fd,2));
+ return 0;
+}
+
+int intif_homunculus_requestload(int account_id, int homun_id)
+{
+ if (CheckForCharServer())
+ return 0;
+ WFIFOHEAD(inter_fd, 10);
+ WFIFOW(inter_fd,0) = 0x3091;
+ WFIFOL(inter_fd,2) = account_id;
+ WFIFOL(inter_fd,6) = homun_id;
+ WFIFOSET(inter_fd, 10);
+ return 1;
+}
+
+int intif_homunculus_requestsave(int account_id, struct s_homunculus* sh)
+{
+ if (CheckForCharServer())
+ return 0;
+ WFIFOHEAD(inter_fd, sizeof(struct s_homunculus)+8);
+ WFIFOW(inter_fd,0) = 0x3092;
+ WFIFOW(inter_fd,2) = sizeof(struct s_homunculus)+8;
+ WFIFOL(inter_fd,4) = account_id;
+ memcpy(WFIFOP(inter_fd,8),sh,sizeof(struct s_homunculus));
+ WFIFOSET(inter_fd, WFIFOW(inter_fd,2));
+ return 0;
+
+}
+
+int intif_homunculus_requestdelete(int homun_id)
+{
+ if (CheckForCharServer())
+ return 0;
+ WFIFOHEAD(inter_fd, 6);
+ WFIFOW(inter_fd, 0) = 0x3093;
+ WFIFOL(inter_fd,2) = homun_id;
+ WFIFOSET(inter_fd,6);
+ return 0;
+
+}
+
+
+//-----------------------------------------------------------------
+// Packets receive from inter server
+
+// Wisp/Page reception
+int intif_parse_WisMessage(int fd) { // rewritten by [Yor]
+ struct map_session_data* sd;
+ char *wisp_source;
+ char name[NAME_LENGTH];
+ int id, i;
+ RFIFOHEAD(fd);
+ id=RFIFOL(fd,4);
+
+ memcpy(name, RFIFOP(fd,32), NAME_LENGTH);
+ name[NAME_LENGTH-1] = '\0'; //In case name arrived without it's terminator. [Skotlex]
+ sd = map_nick2sd(name);
+ if(sd == NULL || strcmp(sd->status.name, name) != 0)
+ { //Not found
+ intif_wis_replay(id,1);
+ return 0;
+ }
+ if(sd->state.ignoreAll) {
+ intif_wis_replay(id, 2);
+ return 0;
+ }
+ wisp_source = (char *) RFIFOP(fd,8); // speed up [Yor]
+ for(i=0; i < MAX_IGNORE_LIST &&
+ sd->ignore[i].name[0] != '\0' &&
+ strcmp(sd->ignore[i].name, wisp_source) != 0
+ ; i++);
+
+ if (i < MAX_IGNORE_LIST && sd->ignore[i].name[0] != '\0')
+ { //Ignored
+ intif_wis_replay(id, 2);
+ return 0;
+ }
+ //Success to send whisper.
+ clif_wis_message(sd->fd, wisp_source, (char*)RFIFOP(fd,56),RFIFOW(fd,2)-56);
+ intif_wis_replay(id,0); // 送信成功
+ return 0;
+}
+
+// Wisp/page transmission result reception
+int intif_parse_WisEnd(int fd) {
+ struct map_session_data* sd;
+ RFIFOHEAD(fd);
+
+ if (battle_config.etc_log)
+ ShowInfo("intif_parse_wisend: player: %s, flag: %d\n", RFIFOP(fd,2), RFIFOB(fd,26)); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
+ sd = (struct map_session_data *)map_nick2sd((char *) RFIFOP(fd,2));
+ if (sd != NULL)
+ clif_wis_end(sd->fd, RFIFOB(fd,26));
+
+ return 0;
+}
+
+static int mapif_parse_WisToGM_sub(struct map_session_data* sd,va_list va) {
+ int min_gm_level = va_arg(va, int);
+ char *wisp_name;
+ char *message;
+ int len;
+ if (pc_isGM(sd) < min_gm_level) return 0;
+ wisp_name = va_arg(va, char*);
+ message = va_arg(va, char*);
+ len = va_arg(va, int);
+ clif_wis_message(sd->fd, wisp_name, message, len);
+ return 1;
+}
+
+// Received wisp message from map-server via char-server for ALL gm
+int mapif_parse_WisToGM(int fd) { // 0x3003/0x3803 <packet_len>.w <wispname>.24B <min_gm_level>.w <message>.?B
+ int min_gm_level, mes_len;
+ char Wisp_name[NAME_LENGTH];
+ char mbuf[255];
+ char *message;
+ RFIFOHEAD(fd);
+
+ mes_len = RFIFOW(fd,2) - 30;
+ message = (char *) (mes_len >= 255 ? (char *) aMallocA(mes_len) : mbuf);
+
+ min_gm_level = (int)RFIFOW(fd,28);
+ memcpy(Wisp_name, RFIFOP(fd,4), NAME_LENGTH);
+ Wisp_name[NAME_LENGTH-1] = '\0';
+ memcpy(message, RFIFOP(fd,30), mes_len);
+ message[mes_len-1] = '\0';
+ // information is sended to all online GM
+ clif_foreachclient(mapif_parse_WisToGM_sub, min_gm_level, Wisp_name, message, mes_len);
+
+ if (message != mbuf)
+ aFree(message);
+ return 0;
+}
+
+// アカウント変数通知
+int intif_parse_Registers(int fd) {
+ int j,p,len,max, flag;
+ struct map_session_data *sd;
+ struct global_reg *reg;
+ int *qty;
+ RFIFOHEAD(fd);
+
+ if( (sd=map_id2sd(RFIFOL(fd,4)))==NULL ||
+ !session_isValid(sd->fd)) // Invalid session
+ return 1;
+
+ if (RFIFOB(fd,12) == 3 && sd->status.char_id != RFIFOL(fd,8))
+ return 1; //Character registry from another character.
+
+ flag = (sd->save_reg.global_num == -1 || sd->save_reg.account_num == -1 || sd->save_reg.account2_num == -1);
+
+ switch (RFIFOB(fd,12)) {
+ case 3: //Character Registry
+ reg = sd->save_reg.global;
+ qty = &sd->save_reg.global_num;
+ max = GLOBAL_REG_NUM;
+ break;
+ case 2: //Account Registry
+ reg = sd->save_reg.account;
+ qty = &sd->save_reg.account_num;
+ max = ACCOUNT_REG_NUM;
+ break;
+ case 1: //Account2 Registry
+ reg = sd->save_reg.account2;
+ qty = &sd->save_reg.account2_num;
+ max = ACCOUNT_REG2_NUM;
+ break;
+ default:
+ if (battle_config.error_log)
+ ShowError("intif_parse_Registers: Unrecognized type %d\n",RFIFOB(fd,12));
+ return 0;
+ }
+ for(j=0,p=13;j<max && p<RFIFOW(fd,2);j++){
+ sscanf(RFIFOP(fd,p), "%31c%n", reg[j].str,&len);
+ reg[j].str[len]='\0';
+ p += len+1; //+1 to skip the '\0' between strings.
+ sscanf(RFIFOP(fd,p), "%255c%n", reg[j].value,&len);
+ reg[j].value[len]='\0';
+ p += len+1;
+ }
+ *qty = j;
+
+ if (flag && sd->save_reg.global_num > -1 && sd->save_reg.account_num > -1 && sd->save_reg.account2_num > -1)
+ pc_reg_received(sd); //Received all registry values, execute init scripts and what-not. [Skotlex]
+ return 1;
+}
+
+// 倉庫データ受信
+int intif_parse_LoadStorage(int fd) {
+ struct storage *stor;
+ struct map_session_data *sd;
+ RFIFOHEAD(fd);
+
+ sd=map_id2sd( RFIFOL(fd,4) );
+ if(sd==NULL){
+ if(battle_config.error_log)
+ ShowError("intif_parse_LoadStorage: user not found %d\n",RFIFOL(fd,4));
+ return 1;
+ }
+
+ if (sd->state.finalsave || //Player is already scheduled to leave the server.
+ !session_isValid(sd->fd)) // Invalid session
+ return 1;
+
+ stor = account2storage( RFIFOL(fd,4));
+
+ if (stor->storage_status == 1) { // Already open.. lets ignore this update
+ if (battle_config.error_log)
+ ShowWarning("intif_parse_LoadStorage: storage received for a client already open (User %d:%d)\n", sd->status.account_id, sd->status.char_id);
+ return 1;
+ }
+ if (stor->dirty) { // Already have storage, and it has been modified and not saved yet! Exploit! [Skotlex]
+ if (battle_config.error_log)
+ ShowWarning("intif_parse_LoadStorage: received storage for an already modified non-saved storage! (User %d:%d)\n", sd->status.account_id, sd->status.char_id);
+ return 1;
+ }
+ if (RFIFOW(fd,2)-8 != sizeof(struct storage)) {
+ if (battle_config.error_log)
+ ShowError("intif_parse_LoadStorage: data size error %d %d\n", RFIFOW(fd,2)-8, sizeof(struct storage));
+ return 1;
+ }
+ if(battle_config.save_log)
+ ShowInfo("intif_openstorage: %d\n",RFIFOL(fd,4) );
+ memcpy(stor,RFIFOP(fd,8),sizeof(struct storage));
+ stor->dirty=0;
+ stor->storage_status=1;
+ sd->state.storage_flag = 1;
+ clif_storagelist(sd,stor);
+ clif_updatestorageamount(sd,stor);
+
+ return 0;
+}
+
+// 倉庫データ送信成功
+int intif_parse_SaveStorage(int fd)
+{
+ RFIFOHEAD(fd);
+ if(battle_config.save_log)
+ ShowInfo("intif_savestorage: done %d %d\n",RFIFOL(fd,2),RFIFOB(fd,6) );
+ storage_storage_saved(RFIFOL(fd,2));
+ return 0;
+}
+
+int intif_parse_LoadGuildStorage(int fd)
+{
+ struct guild_storage *gstor;
+ struct map_session_data *sd;
+ int guild_id;
+ RFIFOHEAD(fd);
+ guild_id = RFIFOL(fd,8);
+ if(guild_id <= 0)
+ return 1;
+ sd=map_id2sd( RFIFOL(fd,4) );
+ if(sd==NULL){
+ if(battle_config.error_log)
+ ShowError("intif_parse_LoadGuildStorage: user not found %d\n",RFIFOL(fd,4));
+ return 1;
+ } else if(!session_isValid(sd->fd))
+ return 1; // Invalid session
+
+ gstor=guild2storage(guild_id);
+ if(!gstor) {
+ if(battle_config.error_log)
+ ShowWarning("intif_parse_LoadGuildStorage: error guild_id %d not exist\n",guild_id);
+ return 1;
+ }
+ if (gstor->storage_status == 1) { // Already open.. lets ignore this update
+ if (battle_config.error_log)
+ ShowWarning("intif_parse_LoadGuildStorage: storage received for a client already open (User %d:%d)\n", sd->status.account_id, sd->status.char_id);
+ return 1;
+ }
+ if (gstor->dirty) { // Already have storage, and it has been modified and not saved yet! Exploit! [Skotlex]
+ if (battle_config.error_log)
+ ShowWarning("intif_parse_LoadGuildStorage: received storage for an already modified non-saved storage! (User %d:%d)\n", sd->status.account_id, sd->status.char_id);
+ return 1;
+ }
+ if( RFIFOW(fd,2)-12 != sizeof(struct guild_storage) ){
+ gstor->storage_status = 0;
+ if(battle_config.error_log)
+ ShowError("intif_parse_LoadGuildStorage: data size error %d %d\n",RFIFOW(fd,2)-12 , sizeof(struct guild_storage));
+ return 1;
+ }
+ if(battle_config.save_log)
+ ShowInfo("intif_open_guild_storage: %d\n",RFIFOL(fd,4) );
+ memcpy(gstor,RFIFOP(fd,12),sizeof(struct guild_storage));
+ gstor->storage_status = 1;
+ sd->state.storage_flag = 2;
+ clif_guildstoragelist(sd,gstor);
+ clif_updateguildstorageamount(sd,gstor);
+ return 0;
+}
+int intif_parse_SaveGuildStorage(int fd)
+{
+ RFIFOHEAD(fd);
+ if(battle_config.save_log) {
+ ShowInfo("intif_save_guild_storage: done %d %d %d\n",RFIFOL(fd,2),RFIFOL(fd,6),RFIFOB(fd,10) );
+ }
+ storage_guild_storagesaved(/*RFIFOL(fd,2), */RFIFOL(fd,6));
+ return 0;
+}
+
+// パーティ作成可否
+int intif_parse_PartyCreated(int fd)
+{
+ RFIFOHEAD(fd);
+ if(battle_config.etc_log)
+ ShowInfo("intif: party created by account %d\n\n", RFIFOL(fd,2));
+ party_created(RFIFOL(fd,2), RFIFOL(fd,6),RFIFOB(fd,10),RFIFOL(fd,11), (char *)RFIFOP(fd,15));
+ return 0;
+}
+// パーティ情報
+int intif_parse_PartyInfo(int fd)
+{
+ RFIFOHEAD(fd);
+ if( RFIFOW(fd,2)==8){
+ if(battle_config.error_log)
+ ShowWarning("intif: party noinfo %d\n",RFIFOL(fd,4));
+ party_recv_noinfo(RFIFOL(fd,4));
+ return 0;
+ }
+
+// printf("intif: party info %d\n",RFIFOL(fd,4));
+ if( RFIFOW(fd,2)!=sizeof(struct party)+4 ){
+ if(battle_config.error_log)
+ ShowError("intif: party info : data size error %d %d %d\n",RFIFOL(fd,4),RFIFOW(fd,2),sizeof(struct party)+4);
+ }
+ party_recv_info((struct party *)RFIFOP(fd,4));
+ return 0;
+}
+// パーティ追加通知
+int intif_parse_PartyMemberAdded(int fd)
+{
+ RFIFOHEAD(fd);
+ if(battle_config.etc_log)
+ ShowInfo("intif: party member added Party (%d), Account(%d), Char(%d)\n",RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10));
+ party_member_added(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10), RFIFOB(fd, 14));
+ return 0;
+}
+// パーティ設定変更通知
+int intif_parse_PartyOptionChanged(int fd)
+{
+ RFIFOHEAD(fd);
+ party_optionchanged(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOW(fd,10),RFIFOW(fd,12),RFIFOB(fd,14));
+ return 0;
+}
+// パーティ脱退通知
+int intif_parse_PartyMemberLeaved(int fd)
+{
+ RFIFOHEAD(fd);
+ if(battle_config.etc_log)
+ ShowInfo("intif: party member leaved: Party(%d), Account(%d), Char(%d)\n",RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10));
+ party_member_leaved(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10));
+ return 0;
+}
+// パーティ解散通知
+int intif_parse_PartyBroken(int fd)
+{
+ RFIFOHEAD(fd);
+ party_broken(RFIFOL(fd,2));
+ return 0;
+}
+// パーティ移動通知
+int intif_parse_PartyMove(int fd)
+{
+ RFIFOHEAD(fd);
+ party_recv_movemap(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOW(fd,14),RFIFOB(fd,16),RFIFOW(fd,17));
+ return 0;
+}
+// パーティメッセージ
+int intif_parse_PartyMessage(int fd)
+{
+ RFIFOHEAD(fd);
+// if(battle_config.etc_log)
+// printf("intif_parse_PartyMessage: %s\n",RFIFOP(fd,12));
+ party_recv_message(RFIFOL(fd,4),RFIFOL(fd,8),(char *) RFIFOP(fd,12),RFIFOW(fd,2)-12);
+ return 0;
+}
+
+// ギルド作成可否
+int intif_parse_GuildCreated(int fd)
+{
+ RFIFOHEAD(fd);
+ guild_created(RFIFOL(fd,2),RFIFOL(fd,6));
+ return 0;
+}
+// ギルド情報
+int intif_parse_GuildInfo(int fd)
+{
+ RFIFOHEAD(fd);
+ if( RFIFOW(fd,2)==8){
+ if(battle_config.error_log)
+ ShowWarning("intif: guild noinfo %d\n",RFIFOL(fd,4));
+ guild_recv_noinfo(RFIFOL(fd,4));
+ return 0;
+ }
+
+// if(battle_config.etc_log)
+// printf("intif: guild info %d\n",RFIFOL(fd,4));
+ if( RFIFOW(fd,2)!=sizeof(struct guild)+4 ){
+ if(battle_config.error_log)
+ ShowError("intif: guild info : data size error Gid: %d recv size: %d Expected size: %d\n",RFIFOL(fd,4),RFIFOW(fd,2),sizeof(struct guild)+4);
+ }
+ guild_recv_info((struct guild *)RFIFOP(fd,4));
+ return 0;
+}
+// ギルドメンバ追加通知
+int intif_parse_GuildMemberAdded(int fd)
+{
+ RFIFOHEAD(fd);
+ if(battle_config.etc_log)
+ ShowInfo("intif: guild member added %d %d %d %d\n",RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14));
+ guild_member_added(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14));
+ return 0;
+}
+// ギルドメンバ脱退/追放通知
+int intif_parse_GuildMemberLeaved(int fd)
+{
+ RFIFOHEAD(fd);
+ guild_member_leaved(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14),
+ (char *) RFIFOP(fd,55), (char *) RFIFOP(fd,15));
+ return 0;
+}
+
+// ギルドメンバオンライン状態/Lv変更通知
+int intif_parse_GuildMemberInfoShort(int fd)
+{
+ RFIFOHEAD(fd);
+ guild_recv_memberinfoshort(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14),RFIFOW(fd,15),RFIFOW(fd,17));
+ return 0;
+}
+// ギルド解散通知
+int intif_parse_GuildBroken(int fd)
+{
+ RFIFOHEAD(fd);
+ guild_broken(RFIFOL(fd,2),RFIFOB(fd,6));
+ return 0;
+}
+
+// ギルド基本情報変更通知
+int intif_parse_GuildBasicInfoChanged(int fd)
+{
+ int type, guild_id;
+ unsigned int dd;
+ void *data;
+ struct guild *g;
+ short dw;
+ RFIFOHEAD(fd);
+ type=RFIFOW(fd,8);
+ guild_id=RFIFOL(fd,4);
+ data=RFIFOP(fd,10);
+ g=guild_search(guild_id);
+ dw=*((short *)data);
+ dd=*((unsigned int *)data);
+ if( g==NULL )
+ return 0;
+ switch(type){
+ case GBI_EXP: g->exp=dd; break;
+ case GBI_GUILDLV: g->guild_lv=dw; break;
+ case GBI_SKILLPOINT: g->skill_point=dd; break;
+ }
+ return 0;
+}
+// ギルドメンバ情報変更通知
+int intif_parse_GuildMemberInfoChanged(int fd)
+{
+ int type, guild_id, account_id, char_id, idx, dd;
+ void* data;
+ struct guild *g;
+ RFIFOHEAD(fd);
+ type=RFIFOW(fd,16);
+ guild_id=RFIFOL(fd,4);
+ account_id=RFIFOL(fd,8);
+ char_id=RFIFOL(fd,12);
+ data=RFIFOP(fd,18);
+ g=guild_search(guild_id);
+ dd=*((int *)data);
+ if( g==NULL )
+ return 0;
+ idx=guild_getindex(g,account_id,char_id);
+ switch(type){
+ case GMI_POSITION:
+ g->member[idx].position=dd;
+ guild_memberposition_changed(g,idx,dd);
+ break;
+ case GMI_EXP:
+ g->member[idx].exp=dd;
+ break;
+ case GMI_HAIR:
+ g->member[idx].hair=dd;
+ break;
+ case GMI_HAIR_COLOR:
+ g->member[idx].hair_color=dd;
+ break;
+ case GMI_GENDER:
+ g->member[idx].gender=dd;
+ break;
+ case GMI_CLASS:
+ g->member[idx].class_=dd;
+ break;
+ case GMI_LEVEL:
+ g->member[idx].lv=dd;
+ break;
+ }
+ return 0;
+}
+
+// ギルド役職変更通知
+int intif_parse_GuildPosition(int fd)
+{
+ RFIFOHEAD(fd);
+ if( RFIFOW(fd,2)!=sizeof(struct guild_position)+12 ){
+ if(battle_config.error_log)
+ ShowError("intif: guild info : data size error\n %d %d %d",RFIFOL(fd,4),RFIFOW(fd,2),sizeof(struct guild_position)+12);
+ }
+ guild_position_changed(RFIFOL(fd,4),RFIFOL(fd,8),(struct guild_position *)RFIFOP(fd,12));
+ return 0;
+}
+// ギルドスキル割り振り通知
+int intif_parse_GuildSkillUp(int fd)
+{
+ RFIFOHEAD(fd);
+ guild_skillupack(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10));
+ return 0;
+}
+// ギルド同盟/敵対通知
+int intif_parse_GuildAlliance(int fd)
+{
+ RFIFOHEAD(fd);
+ guild_allianceack(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOL(fd,14),
+ RFIFOB(fd,18),(char *) RFIFOP(fd,19),(char *) RFIFOP(fd,43));
+ return 0;
+}
+// ギルド告知変更通知
+int intif_parse_GuildNotice(int fd)
+{
+ RFIFOHEAD(fd);
+ guild_notice_changed(RFIFOL(fd,2),(char *) RFIFOP(fd,6),(char *) RFIFOP(fd,66));
+ return 0;
+}
+// ギルドエンブレム変更通知
+int intif_parse_GuildEmblem(int fd)
+{
+ RFIFOHEAD(fd);
+ guild_emblem_changed(RFIFOW(fd,2)-12,RFIFOL(fd,4),RFIFOL(fd,8), (char *)RFIFOP(fd,12));
+ return 0;
+}
+// ギルド会話受信
+int intif_parse_GuildMessage(int fd)
+{
+ RFIFOHEAD(fd);
+ guild_recv_message(RFIFOL(fd,4),RFIFOL(fd,8),(char *) RFIFOP(fd,12),RFIFOW(fd,2)-12);
+ return 0;
+}
+// ギルド城データ要求返信
+int intif_parse_GuildCastleDataLoad(int fd)
+{
+ RFIFOHEAD(fd);
+ return guild_castledataloadack(RFIFOW(fd,2),RFIFOB(fd,4),RFIFOL(fd,5));
+}
+// ギルド城データ変更通知
+int intif_parse_GuildCastleDataSave(int fd)
+{
+ RFIFOHEAD(fd);
+ return guild_castledatasaveack(RFIFOW(fd,2),RFIFOB(fd,4),RFIFOL(fd,5));
+}
+
+// ギルド城データ一括受信(初期化時)
+int intif_parse_GuildCastleAllDataLoad(int fd)
+{
+ RFIFOHEAD(fd);
+ return guild_castlealldataload(RFIFOW(fd,2),(struct guild_castle *)RFIFOP(fd,4));
+}
+
+int intif_parse_GuildMasterChanged(int fd)
+{
+ RFIFOHEAD(fd);
+ return guild_gm_changed(RFIFOL(fd,2),RFIFOL(fd,6));
+}
+
+// pet
+int intif_parse_CreatePet(int fd)
+{
+ RFIFOHEAD(fd);
+ pet_get_egg(RFIFOL(fd,2),RFIFOL(fd,7),RFIFOB(fd,6));
+
+ return 0;
+}
+
+int intif_parse_RecvPetData(int fd)
+{
+ struct s_pet p;
+ int len;
+ RFIFOHEAD(fd);
+ len=RFIFOW(fd,2);
+ if(sizeof(struct s_pet)!=len-9) {
+ if(battle_config.etc_log)
+ ShowError("intif: pet data: data size error %d %d\n",sizeof(struct s_pet),len-9);
+ }
+ else{
+ memcpy(&p,RFIFOP(fd,9),sizeof(struct s_pet));
+ pet_recv_petdata(RFIFOL(fd,4),&p,RFIFOB(fd,8));
+ }
+
+ return 0;
+}
+int intif_parse_SavePetOk(int fd)
+{
+ RFIFOHEAD(fd);
+ if(RFIFOB(fd,6) == 1) {
+ if(battle_config.error_log)
+ ShowError("pet data save failure\n");
+ }
+
+ return 0;
+}
+
+int intif_parse_DeletePetOk(int fd)
+{
+ RFIFOHEAD(fd);
+ if(RFIFOB(fd,2) == 1) {
+ if(battle_config.error_log)
+ ShowError("pet data delete failure\n");
+ }
+
+ return 0;
+}
+
+int intif_parse_RenamePetOk(int fd)
+{
+ struct map_session_data *sd = NULL;
+ RFIFOHEAD(fd);
+ if((sd=map_id2sd(RFIFOL(fd,2)))==NULL ||
+ sd->status.char_id != RFIFOL(fd,6) ||
+ !session_isValid(sd->fd)) // Invalid session
+ return 0;
+ if (RFIFOB(fd,10) == 0) {
+ clif_displaymessage(sd->fd, msg_txt(280)); // You cannot use this name for your pet.
+ clif_send_petstatus(sd); //Send status so client knows oet name change got rejected.
+ return 0;
+ }
+ pet_change_name(sd, RFIFOP(fd,11),1);
+ return 0;
+}
+
+//----------------------------------------------------------------
+// Homunculus recv packets [albator]
+
+int intif_parse_CreateHomunculus(int fd)
+{
+ int len;
+ RFIFOHEAD(fd);
+ len=RFIFOW(fd,2)-9;
+ if(sizeof(struct s_homunculus)!=len) {
+ if(battle_config.etc_log)
+ ShowError("intif: create homun data: data size error %d != %d\n",sizeof(struct s_homunculus),len);
+ return 0;
+ }
+ merc_hom_recv_data(RFIFOL(fd,4), (struct s_homunculus*)RFIFOP(fd,9), RFIFOB(fd,8)) ;
+ return 0;
+}
+
+int intif_parse_RecvHomunculusData(int fd)
+{
+ int len;
+
+ RFIFOHEAD(fd);
+ len=RFIFOW(fd,2)-9;
+
+ if(sizeof(struct s_homunculus)!=len) {
+ if(battle_config.etc_log)
+ ShowError("intif: homun data: data size error %d %d\n",sizeof(struct s_homunculus),len);
+ return 0;
+ }
+ merc_hom_recv_data(RFIFOL(fd,4), (struct s_homunculus*)RFIFOP(fd,9), RFIFOB(fd,8));
+ return 0;
+}
+
+int intif_parse_SaveHomunculusOk(int fd)
+{
+ RFIFOHEAD(fd);
+ if(RFIFOB(fd,6) != 1) {
+ if(battle_config.error_log)
+ ShowError("homunculus data save failure for account %d\n", RFIFOL(fd,2));
+ }
+ return 0;
+}
+
+int intif_parse_DeleteHomunculusOk(int fd)
+{
+ RFIFOHEAD(fd);
+ if(RFIFOB(fd,2) != 1) {
+ if(battle_config.error_log)
+ ShowError("Homunculus data delete failure\n");
+ }
+
+ return 0;
+}
+//-----------------------------------------------------------------
+// inter serverからの通信
+// エラーがあれば0(false)を返すこと
+// パケットが処理できれば1,パケット長が足りなければ2を返すこと
+int intif_parse(int fd)
+{
+ int packet_len, cmd;
+ RFIFOHEAD(fd);
+ cmd = RFIFOW(fd,0);
+ // パケットのID確認
+ if(cmd<0x3800 || cmd>=0x3800+(sizeof(packet_len_table)/sizeof(packet_len_table[0])) ||
+ packet_len_table[cmd-0x3800]==0){
+ return 0;
+ }
+ // パケットの長さ確認
+ packet_len = packet_len_table[cmd-0x3800];
+ if(packet_len==-1){
+ if(RFIFOREST(fd)<4)
+ return 2;
+ packet_len = RFIFOW(fd,2);
+ }
+// if(battle_config.etc_log)
+// printf("intif_parse %d %x %d %d\n",fd,cmd,packet_len,RFIFOREST(fd));
+ if((int)RFIFOREST(fd)<packet_len){
+ return 2;
+ }
+ // 処理分岐
+ switch(cmd){
+ case 0x3800:
+ if (RFIFOL(fd,4) == 0xFF000000) //Normal announce.
+ clif_GMmessage(NULL,(char *) RFIFOP(fd,8),packet_len-8,0);
+ else if (RFIFOL(fd,4) == 0xFE000000) //Main chat message [LuzZza]
+ clif_MainChatMessage((char *)RFIFOP(fd,8));
+ else //Color announce.
+ clif_announce(NULL,(char *) RFIFOP(fd,8),packet_len-8,RFIFOL(fd,4),0);
+ break;
+ case 0x3801: intif_parse_WisMessage(fd); break;
+ case 0x3802: intif_parse_WisEnd(fd); break;
+ case 0x3803: mapif_parse_WisToGM(fd); break;
+ case 0x3804: intif_parse_Registers(fd); break;
+ case 0x3810: intif_parse_LoadStorage(fd); break;
+ case 0x3811: intif_parse_SaveStorage(fd); break;
+ case 0x3818: intif_parse_LoadGuildStorage(fd); break;
+ case 0x3819: intif_parse_SaveGuildStorage(fd); break;
+ case 0x3820: intif_parse_PartyCreated(fd); break;
+ case 0x3821: intif_parse_PartyInfo(fd); break;
+ case 0x3822: intif_parse_PartyMemberAdded(fd); break;
+ case 0x3823: intif_parse_PartyOptionChanged(fd); break;
+ case 0x3824: intif_parse_PartyMemberLeaved(fd); break;
+ case 0x3825: intif_parse_PartyMove(fd); break;
+ case 0x3826: intif_parse_PartyBroken(fd); break;
+ case 0x3827: intif_parse_PartyMessage(fd); break;
+ case 0x3830: intif_parse_GuildCreated(fd); break;
+ case 0x3831: intif_parse_GuildInfo(fd); break;
+ case 0x3832: intif_parse_GuildMemberAdded(fd); break;
+ case 0x3834: intif_parse_GuildMemberLeaved(fd); break;
+ case 0x3835: intif_parse_GuildMemberInfoShort(fd); break;
+ case 0x3836: intif_parse_GuildBroken(fd); break;
+ case 0x3837: intif_parse_GuildMessage(fd); break;
+ case 0x3839: intif_parse_GuildBasicInfoChanged(fd); break;
+ case 0x383a: intif_parse_GuildMemberInfoChanged(fd); break;
+ case 0x383b: intif_parse_GuildPosition(fd); break;
+ case 0x383c: intif_parse_GuildSkillUp(fd); break;
+ case 0x383d: intif_parse_GuildAlliance(fd); break;
+ case 0x383e: intif_parse_GuildNotice(fd); break;
+ case 0x383f: intif_parse_GuildEmblem(fd); break;
+ case 0x3840: intif_parse_GuildCastleDataLoad(fd); break;
+ case 0x3841: intif_parse_GuildCastleDataSave(fd); break;
+ case 0x3842: intif_parse_GuildCastleAllDataLoad(fd); break;
+ case 0x3843: intif_parse_GuildMasterChanged(fd); break;
+ case 0x3880: intif_parse_CreatePet(fd); break;
+ case 0x3881: intif_parse_RecvPetData(fd); break;
+ case 0x3882: intif_parse_SavePetOk(fd); break;
+ case 0x3883: intif_parse_DeletePetOk(fd); break;
+ case 0x3884: intif_parse_RenamePetOk(fd); break;
+ case 0x3890: intif_parse_CreateHomunculus(fd); break;
+ case 0x3891: intif_parse_RecvHomunculusData(fd); break;
+ case 0x3892: intif_parse_SaveHomunculusOk(fd); break;
+ case 0x3893: intif_parse_DeleteHomunculusOk(fd); break;
+ default:
+ if(battle_config.error_log)
+ ShowError("intif_parse : unknown packet %d %x\n",fd,RFIFOW(fd,0));
+ return 0;
+ }
+ // パケット読み飛ばし
+ RFIFOSKIP(fd,packet_len);
+ return 1;
+}