summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog-SVN.txt18
-rw-r--r--Readme-jap428
-rw-r--r--conf-tmpl/battle_athena.conf11
-rw-r--r--conf-tmpl/script_athena.conf21
-rw-r--r--db/skill_db.txt22
-rw-r--r--src/common/core.c31
-rw-r--r--src/common/db.c106
-rw-r--r--src/common/db.h12
-rw-r--r--src/map/atcommand.c43
-rw-r--r--src/map/atcommand.h1
-rw-r--r--src/map/battle.c68
-rw-r--r--src/map/battle.h2
-rw-r--r--src/map/chrif.c2
-rw-r--r--src/map/guild.c34
-rw-r--r--src/map/guild.h1
-rw-r--r--src/map/map.c162
-rw-r--r--src/map/map.h8
-rw-r--r--src/map/mob.c17
-rw-r--r--src/map/npc.c6
-rw-r--r--src/map/path.c23
-rw-r--r--src/map/pc.c43
-rw-r--r--src/map/script.c8
-rw-r--r--src/map/skill.c201
-rw-r--r--src/map/status.c94
24 files changed, 1028 insertions, 334 deletions
diff --git a/Changelog-SVN.txt b/Changelog-SVN.txt
index 1e5ffce25..a6c499e82 100644
--- a/Changelog-SVN.txt
+++ b/Changelog-SVN.txt
@@ -1,6 +1,24 @@
Date Added
03/07
+ * Updated core and map-server to jA 1115~1137 [celest]
+ - Added monster_delay_damage to battle conf
+ - Increased some default settings in script conf
+ - Updated Brandish Spear, Soul Change, Soul Burn
+ - Updated Body Relocation (shorter distance)
+ - Added monster skill NPC_EXPLOSIONSPIRITS
+ - Corrected Mindbreaker level to 5
+ - Updated Meteor Assault to instant-cast
+ - Removed some unused code for Breaker
+ - Temporarily set Emperium to be immune to Breaker
+ - Added command @users - shows the percentage of users in all maps
+ - Don't save status if the player is set for disconnection
+ - Added free block lock-checking system
+ - Added saving the processes' ID into [xx-server.pid]
+ - Fixed a memory leak with duplicate script labels
+ + For more detailed logs check 'Readme-jap'
+
+ * Fixed a typo in Volcano, thanks to Ilpalazzo-sama [celest]
* Fixed Apple of Idun reading the wrong skill level and giving too much HP
[celest]
diff --git a/Readme-jap b/Readme-jap
index 9956e4bd0..3bc55cedd 100644
--- a/Readme-jap
+++ b/Readme-jap
@@ -1,4 +1,432 @@
--------------------
+//1136 by by eigen
+
+�E1135�ŏ����Ă���battle_athena.conf�̍��ڂƃf�t�H���g�l�𕜊�
+�Econf_ref.txt��next_exp_limit�̐�����lj�
+
+ (conf)
+ battle_athena.conf - ���������ڂƃf�t�H���g�l�𕜊�
+ (doc)
+ conf_ref.txt - next_exp_limit�̐�����lj�
+
+--------------------
+//1135 by by Toshi^2
+�E�p�b�`1125�ŏC�����ꂽ�A�o���l�̏���ݒ���]�������̐����������I�ׂ�悤�ɕύX
+
+ (db)
+ battle_athena.conf - next_exp_limit��lj��B
+ (src/map)
+ battle.c - battle_config_read() �C��
+ battle.h - struct Battle_Config{}�� int next_exp_limit; ��lj��B
+ pc.c - pc_gainexp() �C��
+
+--------------------
+//1134 by End_of_exam
+
+�E1132��#undef close��Y������o�O���C��(socket.c)
+�E1133�̃A�C�e��dupe�΍􂪕s���S�������̂��C��(map.c)
+�Eathena-start stop , kill �̏��Ԃ�map -> char -> login �ɕύX
+�@�@�@�@(athena-start thanks to eigen����)
+
+ (/)
+ athena-start - athena-start stop , kill �̏��ԏC��
+
+ (src/common)
+ socket.c - #undef close �lj�
+
+ (src/map)
+ map.c - map_quit() �C��
+
+--------------------
+//1133 by End_of_exam
+
+�Emapflag nosave ���w�肳�ꂽ�}�b�v�Ŏ���Ń��X�^�[�g���鎞�ɁA�Z�[�u�|�C���g��
+�@�ʃ}�b�v�T�[�o�[�ɂ���ƁA(nul,0,0)�ɔ�΂���Ă����o�O���C��(pc.c)
+�E�}�b�v�T�[�o�[�𕪔z���Ă��鎞�ɁA�׍H����������ȃc�[�����g�����Ƃɂ���āA
+�@�A�C�e����dupe�ł����o�O���C���B(pc.c)
+�Ebuildin_menu, buildin_select() ���o�b�t�@�I�[�o�[�t���[���N��������
+�@�o�O���C��(script.c)
+
+ (src/map)
+ pc.c - pc_makesavestatus(), pc_setpos(), pc_autosave_sub() �C��
+ script.c - buildin_menu(), buildin_select() �C��
+
+--------------------
+//1132 by End_of_exam
+�E@users �R�}���h(�T�[�o�[���̐l���}�b�v��\��)��lj�(atcommand.c / h)
+�Eguild_check_alliance() ���Ăяo���Ƃ��̃`�F�b�N��lj�(mob.c battle.c)
+�E�}�b�v�T�[�o�[���z���ɃM���h�̃����o�[�����������A���̃M���h�����o�[��
+�@��l�����O�C�����Ă��Ȃ��}�b�v�T�[�o�[�������Ă����̂��C��(guild.c)
+�E1130�Ō��؂�̉�𗦏㏸�������Ă����̂�߂�(status.c)
+�Epid �Ή��ł�start, athena-start �𓝍�(start , athena_start)
+�E�c��C�΍�AShinomori����� do_sendrecv() ��������g�ݍ���
+�@(socket.c socket.conf Makefile)
+�Esocket �̍�����
+�@�@1. FIFOFLUSH �����s�����p�x��������(socket.c char.c)
+�@�@2. �s����fd��0 �ɕύX(socket.c socket.h chrif.c char.c)
+
+ (/)
+ start - pid �t�@�C���ɑΉ�����悤�ɏC��
+ sthena-start - pid �t�@�C���ɑΉ�����悤�ɏC��
+ Makefile - "-D_XOPEN_SOURCE -D_BSD_SOURCE" �lj�
+
+ (conf/)
+ help.txt - @users �lj��A@mes �̏C��
+ socket.conf - �A�N�Z�X�����̐ݒ�t�@�C��
+
+ (src/common/)
+ socket.c - �A�N�Z�X�����̒lj��A�F�X������
+ socket.h - FIFO���߂̍�����
+
+ (src/char/)
+ char.c - parse_tologin(), parse_char() �X�V
+
+ (src/map/)
+ atcommand.c - @users �lj�
+ atcommand.h - @users �lj�
+ battle.c - battle_calc_damage() �C��
+ chrif.c - �s����fd��0 �ɕύX�����̂ɔ����C��
+ guild.c - guild_member_leaved() �C��
+ mob.c - mob_gvmobcheck() �C��
+ status.c - status_calc_pc() �C��
+
+--------------------
+//1131 by eigen
+�E�M���h�g���̐l��������+2/Lv����+4/Lv�ɕύX
+�E���e�I�X�g�[���ɃX�^����������悤�C��
+�E���[�h�I�u���@�[�~���I���ɈÈł�������悤�C��
+�E�q���g�o�C���f�B���O������Ă����STR+1 ATK+4���t���悤�ύX
+�E�q���g�o�C���f�B���O������Ă����AR�EOT�EWP���̌��ʎ��Ԃ�10%�����Ȃ�悤�ύX
+�EAR�EOT�̃p�[�e�B�[�����o�[���ʎ��Ԍ�����P�p
+�E�t���X�g�_�C�o�[�œ�������ہA�������Ԃ�MDEF�ɉe�������悤�ύX
+�Eskill_db.txt�Askill_require_db.txt�Askill_cast_db.txt��OWN��e�EWiki�Ȃǂ��Q�l�ɏC��
+
+ (src/map)
+ skill.c
+ status.c
+ (db)
+ skill_db.txt
+ skill_cast_db.txt
+ skill_require_db.txt
+
+--------------------
+//1130 by eigen
+�E�������E�ʑ�����+100/Lv��+200/Lv�ɏC��
+�E�V�[�t�̏�ʐE�ɉ����ĉ�𗦑�����Flee�㏸��+3/Lv��+4/Lv�ɏC��
+�E�A�T�V���n����𗦑������擾���Ă���ꍇ�A�ړ����x��+0.5%/Lv�ɂȂ�悤�C��
+�E�v���b�V���[��SP�U��������
+�E�v���U�[�u�A�t���X�g���b�v�A���퐸�B�A�X�����s�b�`���[�A�t���P�~�J���`���[�W
+��db�ɒlj�
+
+ (src/map)
+ skill.c - skill_additional_effect() �C��
+ status.c - status_calc_pc() �C��
+ (db)
+ skill_db.txt
+ skill_cast_db.txt
+ skill_require_db.txt
+ skill_tree.txt
+
+--------------------
+//1129 by En_of_exam
+
+�ENPC �C�x���g���d�������ꍇ�̃���������菇������Ă����o�O���C��
+�@�@(npc.c thanks to TOSHI^2����)
+
+ (src/map)
+ npc.c - npc_parse_script() �C��
+
+--------------------
+//1128 by �Y�߂�l
+�E�A�C�e����������Ɏg�p���邩�̃I�v�V�����lj�
+�E�J�[�h�A�����i�A�G���E�I���̃h���b�v����ʂɐݒ�o����悤�ɃI�v�V�����lj�
+�Ebattle_athena.conf�̏����ݒ�Ŗ�E���������쐬���ɖ��O��t���Ȃ��悤�ɕύX
+�@�i�{�I�ł͂܂����ĂȂ��Ǝv�����̂ŏ����ݒ��ς��܂����j
+ (src/map)
+ battle.c
+ mob.c
+ pc.c
+ battle.h
+ (conf)
+ battle_athena.conf
+
+--------------------
+//1127 by End_of_exam
+
+�Egetarraysize() ���������l��Ԃ��Ȃ��o�O���C��(script.c)
+�@���̃o�O�̉e���ŁAdeletearray() ���߂̓��삪����Ȃ��̂ƈقȂ��Ă��܂����B
+
+�Ebuildin_deletearray() �̍œK��(script.c)
+�E�V�O�i���������ɍēx�V�O�i�����Ă΂��”\���ɑΏ�����(core.c)
+�E�ϑ��̔���lj����Ă݂�(npc_test_seller.txt)
+
+ (src/map)
+ script.c - getarraysize() , buildin_deletearray() �C��
+
+ (src/common)
+ core.c - sig_proc() �C��
+
+ (script/sample)
+ npc_test_seller.txt - �ϑ��̔�NPC
+
+--------------------
+//1126 by eigen
+�E�������C�Y�̌��ʉ񐔂Ɖr���Z�k�䗦�����ꂼ��5��A1/2�ɏC��
+
+ (src/map)
+ skill.c - 1/3�ɂȂ��Ă���̂�1/2�ɏC��
+ status.c - 3��ɂȂ��Ă���̂�5��ɏC��
+
+--------------------
+//1125 by lizorett
+�E�u�����f�B�b�V���X�s�A�̃m�b�N�o�b�N��3�Z���ɂ��A�~�X���ɂ̓m�b�N�o�b�N���Ȃ�
+�悤�ύX
+�E�X�s�A�X�^�u��Ώۂ��玩���Ɍ�������4�}�X�͈͍̔U���ɕύX(�{�I�d�l)
+�E��/���΂��j���}�Ŗh����悤�ύX
+�E�{�E�����O�o�b�V�����ΏۂɃ~�X�����ꍇ�ɂ̓m�b�N�o�b�N���Ȃ��悤�ύX
+�E�\�E���u���C�J�[�̃_���[�W�v�Z�A�j���}�Ń~�X�ɂȂ�悤�ύX
+�E�l���o���l�̏��(�����x���̕K�v�o���l-1)��ݒ�
+�E�o�W���J�W�J���ɓW�J�҂̓m�b�N�o�b�N���Ȃ��悤�ύX
+�E���e�I�A�T���g�𑦎������A�g�p�Ғ��S�A�r��500ms�Œ�A�G�t�F�N�g�L�ɕύX
+�E�X�g���b�v�E�F�|������mob�̍U���͒ቺ��10%�ɕύX
+�E�|�����Ă�����̂��჌�x���̃u���X�ɂ���/�Ή��������ł���悤�ύX
+�E�\�E���o�[��/�}�C���h�u���[�J�[/�\�E���`�F���W����
+�E�V���[�v�V���[�e�B���O���ː��ɂ���G�ɂ��_���[�W��^����悤�ύX�A�N���e�B�J��
+�m��+20%�Ŗh�䖳���_���[�W�ɕύX
+�E���΂ȂLjꕔ�̃X�L�������Ȃǂ�1�_���[�W�ɂȂ�Ȃ������C��
+
+ (db)
+ skill_db.txt- BDS/���e�I�A�T���g�ύX�A�X�L���lj�
+ skill_cast_db.txt
+ - �X�L���lj�
+ skill_require_db.txt
+ - �X�L���lj�
+ (src/map)
+ battle.c - �\�E���u���C�J�[�̃_���[�W�v�Z��ύX
+ - �V���[�v�V���[�e�B���O�̃N���e�B�J���m���C��
+ - ��/���΂��j���}�Ŗh����悤�ύX
+ skill.h - SC_MINDBREAKER�lj�
+ skill.c - BDS/BB�̃m�b�N�o�b�N���C��
+ - �X�s�A�X�^�u��͈͍U���ɕύX
+ - ���e�I�A�T���g�C��
+ - �\�E���o�[��/�}�C���h�u���[�J�[/�\�E���`�F���W����
+ path.c - �V���[�v�V���[�e�B���O�̎ː��v�Z��lj�
+ pc.c - �l���o���l�̏��(�O�̃��x���̌o���l-1)��ݒ�
+ status.c - �}�C���h�u���[�J�[��matk�㏸/mdef�����̎���
+ map.h - �V���[�v�V���[�e�B���O�̎ː��v�Z�p�\���̂�lj�
+
+--------------------
+//1124 by ��������
+�G���g�������g������
+����
+atk1,atk2 1000*skilllv���Z
+hit 20*skilllv���Z
+
+ (src/map)
+ skill.c
+ skill.h NPC_EXPLOSIONSPIRITS�֌W��lj�
+ status.c�@�@�@�@
+ (db)
+ skill_db.txt
+ skill_cast_db.txt
+
+
+
+--------------------
+//1123 by Nameless
+�EAthena�T�[�r�X���L�b�g��lj����܂����B(NT/2000/XP/2003/LH)
+�@�ڂ������@��doc����instasv.txt���Q�Ƃ��Ă�������
+
+ (bin/tool)
+ instasv.bat - �T�[�r�X�o�^�p�o�b�`
+ delasv.bat - �T�[�r�X�����p�o�b�`
+ (doc/)
+ instasv.txt - ������(�e�L�X�g��)
+
+--------------------
+//1122 by End_of_exam
+
+�E1120��strdb �̃L�[��ۑ����Y��Ă����o�O�C���idb.c�j
+�E�O�̂���1121�A1120��readme ���}�[�W���āA�����Ɋ܂܂�Ă����t�@�C����Y�t����
+
+ (src/char)
+ char.c - 1121�̂��̂�Y�t
+
+ (src/common)
+ mmo.h - 1121�̂��̂�Y�t
+ db.h - 1120�̂��̂�Y�t
+ db.c - strdb �̃L�[��ۑ�����悤�ɂ���
+
+ (src/map)
+ battle.c - 1121�̂��̂�Y�t
+ guild.c - 1121�̂��̂�Y�t
+ guild.h - 1121�̂��̂�Y�t
+ mob.c - 1121�̂��̂�Y�t
+ skill.c - 1121�̂��̂�Y�t
+ skill.h - 1121�̂��̂�Y�t
+
+--------------------
+//1121 by _
+
+�E���[�h�i�C�g/�p���f�B���̃��O�C�����̃G���[�΍�
+�EGv�ł̓����̈������C��
+�@�G���y���E���U���s�A�K�[�f�B�A������U������Ȃ��悤�ɏC��
+�E�V�lj��X�L���p�̒萔�lj��C��
+
+ (src/char)
+ char.c
+ �C�� mmo_char_send006b()
+ (src/common)
+ mmo.h
+ �C�� MAX_SKILL=500
+ �lj� �V�M���h�X�L��(�R�����g�A�E�g���Ă܂�)
+ (src/map)
+ battle.c
+ �C�� battle_calc_damage()
+ guild.c
+ guild.h
+ �lj� guild_check_alliance()
+ mob.c
+ �C�� mob_gvmobcheck()
+ skill.c
+ �C�� SkillStatusChangeTable[] (420-490)
+ skill.h
+ �C�� MAX_SKILL_DB=500
+ �lj� 475�ȍ~�̐V�X�L��ID
+
+--------------------
+//1120 by End_of_exam
+
+�Edb_foreach()�̌Ăяo�����db_erase()���Ăяo����Ă��邳��Ă���ꍇ�A
+�@�����񓯂��L�[�Ŋ֐����Ăяo���”\��������o�O���C��(db.h db.c)
+
+�@cygwin��łQ�dfree�������ꍇ�A�v���O�������\������”\��������܂��B
+�@char�I�Ƃ̐ڑ����؂ꂽmap �I���\������o�O�́A����ɋN�����Ă��܂��B
+
+ (src/common)
+ db.c - db_erase���ꎞ�I�Ƀ��b�N����@�\�lj�
+ db.h - db_erase���ꎞ�I�Ƀ��b�N����@�\�lj�
+
+--------------------
+//1119 by ICO
+
+�ENPC�X�L��(�u���C�N�E�F�|���A�u���C�N�A�[�}�[�A�u���C�N�w�����A�u���C�N�V�[���h)�̎���
+�Ebattle_athena.conf��monster_damage_delay��lj��B
+�@no���w�肷���FW���̃m�b�N�o�b�N�X�L���̋����������{�I�ɋ߂Â������c�H
+
+ (db)
+ skill_db.txt
+ skill_cast_db.txt
+ (conf/)
+ battle_athena.conf
+ monster_damage_delay �lj�
+ (map/)
+ battle.c
+ battle.h
+ mob.c
+ monster_damage_delay�֘A��lj�
+ skill.c
+ skill.h
+ skill_additional_effect,skill_castend_damage_id �C��
+
+--------------------
+//1118 by BDPQ�� [ 2005/02/10 ]
+���f�[�^�x�[�X���ύX����Ă��܂��B�������ɂ͌䒍�ӂ���������
+�E�X�L���̌Œ�r�����Ԃ� skill_cast_db.txt �Ɉړ��B
+ �r�����Ԃ̌v�Z�́A (�ʏ�r�� + �Œ�r��)*�������C�Y�␳ �ƂȂ�܂��B
+ skill_cast_db�̏�����
+ [ID],[cast_list(�ʏ�r��)],[fixed_cast_list(�Œ�r��)],[delay_list(�f�B���C)],[upkeep_time(�ێ�����)],[upkeep_time2(�ێ�����2)] �ł��B
+�E�A�u���J�^�u�����f�B���C��ASPD�ɂ��f�B���C��t�����Ȃ��悤�C��(�������X�L���p)
+�E�V2���E��skill_cast_db�Ɋւ��鍀�ڂ̏C��
+
+ (src/map)
+ skill.c - skill_use_id() �C�� (�r�����Ԍv�Z�� �E �������C�Y/���@�͑��� �Œ�r�����ԕ��폜)
+ (�A�u���J�^�u���̏C��)
+ skill_use_pos() �C�� (�r�����Ԍv�Z��)
+ skill_readdb() �C�� (cast_db �Ǎ���)
+ skill.h - skill_db �C�� (fixedcast�̒lj�)
+ skill_get_fixedcast() �lj� (db����Œ�r�����Ԃ̎擾)
+
+ (db)
+ skill_cast_db.txt- fixed_cast_list �lj� (�Œ�r������)
+ ���@�͑���-700�A�������C�Y-5000�ɐݒ�
+
+ 361(�A�X���v�e�B�I) �C�� ( R.O.M 776���Q�l�ɉr��/�f�B���C���C�� )
+ 365(�}�W�b�N�N���b�V���[)�C�� ( R.O.M 776���Q�l�ɉr��/�f�B���C��lj� )
+ 373(���C�t�u������) �C�� ( R.O.M 776���Q�l�Ƀf�B���C���C�� )
+ 375(�\�E���o�[��) �lj� ( R.O.M 776���Q�l�Ƀf�B���C��lj� ) ( �X�L�����ʂ͎������Ă��܂��� )
+ 381(�t�@���R���A�T���g) �C�� ( R.O.M 776���Q�l�Ƀf�B���C���C�� )
+ 383(�E�B���h�E�H�[�N) �C�� ( R.O.M 776���Q�l�ɉr��/�f�B���C/���ʎ��Ԃ��C�� )
+ 384(�����g�_�E��) �C�� ( R.O.M 776���Q�l�ɉr��/�f�B���C���C�� )
+ 387(�J�[�g�u�[�X�g) �C�� ( R.O.M 776���Q�l�Ɍ��ʎ��Ԃ��C�� )
+ 398(�w�b�h�N���b�V��) �C�� ( R.O.M 776���Q�l�Ƀf�B���C�������Ԃ��C�� )
+ 406(���e�I�A�T���g) �C�� ( R.O.M 776���Q�l�ɉr��/�f�B���C��lj� )
+
+ (doc)
+ db_ref.txt - 1. db/skill_cast_db.txt �C�� (fixed_cast_list�̍��ڂ�lj�)
+
+--------------------
+//1117 by End_of_exam
+
+�E�x�i���X�v���b�V���[��ŏ�Ԃ̓G�Ɏg�p�������A���s�������i�G�����X�^�[��
+�@HP��2/3 �ȏゾ�������j�ɐ[���ȃ��������[�N���N���Ă����o�O���C��(skill.c)
+�E���Ȃ��Ɉ������������s�������ɐ[���ȃ��������[�N���N���Ă����o�O���C��(skill.c)
+
+�@��Q�‚́A����map_freeblock_unlock() �������Ă���ׂɔ������Ă��܂����B
+�@�h���b�v�A�C�e���A�X�L�����j�b�g�A��芪���ȂǂŊm�ۂ��ꂽ���������A
+�@�ȍ~�S���J������Ȃ��Ȃ�Ƃ������Ȃ�[���ȃ��������[�N�̃o�O�ł��B
+�@map_freeblock_lock() ���Ăԃ��[�`�����C������ꍇ�A���[�`���𔲂���Ƃ��ɁA
+�@map_freeblock_unlock() ���Ă΂��悤�ɋC��t���Ă�������(return �ɒ���!)�B
+
+�Emap_freeblock_unlock() ��Y��Ă��ǂ��悤�ɁA����I��block_free_lock��
+�@�N���A����悤�ɏC��(map.c)
+�EDebian�D�� �����MPV�����X�^�[��HP�v�Z���I�[�o�[�t���[����o�O�C���̎�荞��(status.c)
+
+ (src/map)
+ skill.c - skill_castend_nodamage_id() �C��
+ map.c - map_freeblock_timer() �lj��A do_init() �C��
+ status.c - status_get_max_hp() �C��
+
+--------------------
+//1116 by End_of_exam
+
+�Ecopyarray �œ����z����w�肵�����A�R�s�[��̗v�f�ԍ����R�s�[���̗v�f�ԍ����
+�@�傫�����̓��삪�s��ɂȂ��Ă����o�O���C��(script.c npc_test_array.txt)
+�E�֐��錾�����Ɋ֐���`�������[�U�[��`�֐����Ăяo�����Ƃ���ƁA�G���[���o��
+�@�o�O���C��(script.c)
+�E�X�N���v�g�̃I�[�o�[�t���[�������ɘa������(script.c)
+�E�M���h�̍��m��\n���g����o�O���C��(int_guild.c)
+�E�C�x���gdb�̃��������[�N�C�����s���S�������̂��C��(npc.c)
+�Edb_foreach�̃`�F�b�N���@��ύX(db.c)
+�E�N������*.pid (�v���Z�XID�̃t�@�C��)���쐬����悤�ɂ���(core.c)
+�E�o���l�������S�̔����ɂȂ��Ă���o�O���C��(clif.c)
+�E���Ԃ�S�̔����ɕύX(clif.c)
+�Etester����쐬��VC++ Toolkit2003 �p�̃o�b�`�t�@�C���𓯔�(vc07_make.bat)
+
+ (/)
+ vc07_make.bat - tester����쐬�̃o�b�`�t�@�C���𓯔�
+
+ (src/common)
+ db.c - db_foreach() �C��
+ core.c - main() �C�� , pid_create() , pid_delete() �lj�
+
+ (src/char)
+ int_guild.c - mapif_parse_GuildPosition() �C��
+
+ (src/map)
+ clif.c - clif_disp_onlyself() , clif_onlymessage() �C��
+ npc.c - npc_parse_script() �C��
+ script.c - buildin_copyarray() , parse_syntax() �C��
+
+ (script/sample)
+ npc_test_array.txt - �`�F�b�N���ڂ̒lj�
+
+--------------------
+//1115 by ����
+
+�E�T�[�o�[�X�i�b�v�V���b�g
+
+--------------------
//1114-fix1 by �H�}
�Ezlib��map-server�����Ɏ�荞�߂�I�v�V������lj�
diff --git a/conf-tmpl/battle_athena.conf b/conf-tmpl/battle_athena.conf
index f2c76990d..ef0802342 100644
--- a/conf-tmpl/battle_athena.conf
+++ b/conf-tmpl/battle_athena.conf
@@ -240,6 +240,9 @@ potion_produce_rate: 100
// Allow monsters to be aggresive and attack first? (Note 1)
monster_active_enable: yes
+// If a monster is attacked, will they have a delay in being able to move? (Note 1)
+monster_damage_delay: yes
+
// Monster damage delay rate (Note 1)
monster_damage_delay_rate: 100
@@ -552,16 +555,16 @@ party_skill_penalty: yes
monster_class_change_full_recover: no
// Do produced items have the maker's name on them? (Note 1)
-produce_item_name_input: yes
+produce_item_name_input: no
// Do produced potions have the maker's name on them? (Note 1)
-produce_potion_name_input: yes
+produce_potion_name_input: no
// Do crafted arrows have the maker's name on them? (Note 1)
-making_arrow_name_input: yes
+making_arrow_name_input: no
// Does created holy water have the maker's name on it? (Note 1)
-holywater_name_input: yes
+holywater_name_input: no
// Stop logout for 10 seconds after a hit? (Note 1)
prevent_logout: yes
diff --git a/conf-tmpl/script_athena.conf b/conf-tmpl/script_athena.conf
index bc8f1c907..3e420744b 100644
--- a/conf-tmpl/script_athena.conf
+++ b/conf-tmpl/script_athena.conf
@@ -1,3 +1,20 @@
+// ______ __ __
+// /\ _ \/\ \__/\ \
+// __\ \ \L\ \ \ ,_\ \ \___ __ ___ __
+// /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\
+///\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_
+//\ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\
+// \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/
+// _ _ _ _ _ _ _ _ _ _ _ _ _
+// / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
+//( e | n | g | l | i | s | h ) ( A | t | h | e | n | a )
+// \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
+//
+//--------------------------------------------------------
+// eAthena Script Configuration File
+//--------------------------------------------------------
+
+
// When choosing those which it refines setting the letter which is indicated. (Those for word use other than Japanese?)
refine_posword: Head,Body,Left hand,Right hand,Robe,Shoes,Accessory 1,Accessory 2,Head 2,Head 3,Not Equipped
@@ -9,9 +26,9 @@ warn_func_mismatch_paramnum: yes
warn_cmd_mismatch_paramnum: yes
-check_cmdcount: 8192
+check_cmdcount: 65536
-check_gotocount: 512
+check_gotocount: 2048
//---- Custom script functions ----
diff --git a/db/skill_db.txt b/db/skill_db.txt
index c66c43a33..ac6acb17f 100644
--- a/db/skill_db.txt
+++ b/db/skill_db.txt
@@ -56,7 +56,7 @@
54,8,6,16,6,1,4,1,yes,0,0,0,magic,0 //ALL_RESURRECTION#���U���N�V����#
55,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //KN_SPEARMASTERY#���C��#
56,-1,8,1,0,0,10,3,no,0,0,0,weapon,0 //KN_PIERCE#�s�A?�X#
-57,1,6,1,0,1,10,1,no,33,0,0,weapon,1 //KN_BRANDISHSPEAR#�u�����f�B�b�V���X�s�A#
+57,1,6,1,0,1,10,1,no,33,0,0,weapon,3 //KN_BRANDISHSPEAR#�u�����f�B�b�V���X�s�A#
58,4,6,1,0,2,10,1,no,0,0,0,weapon,6 //KN_SPEARSTAB#�X�s�A�X?�u#
59,-3:-5:-7:-9:-11,6,1,0,0,5,1,no,0,0,0,weapon,0 //KN_SPEARBOOMERANG#�X�s�A�u?������#
60,0,6,4,0,1,10,1,no,0,0,0,weapon,0 //KN_TWOHANDQUICKEN#�c?�n���h�N�C�b�P��#
@@ -313,7 +313,7 @@
261,0,6,4,0,1,5,1,no,0,0,0,weapon,0 //MO_CALLSPIRITS#�C��#
262,6,6,16,0,1,1,1,no,0,0,0,weapon,0 //MO_ABSORBSPIRITS#�C�D#
263,0,8,0,0,0,10,3,no,0,0,0,weapon,0 //MO_TRIPLEATTACK#�O�i��#
-264,50,6,2,0,1,1,1,no,0,0,0,none,0 //MO_BODYRELOCATION#�c�e#
+264,14,6,2,0,1,1,1,no,0,0,0,none,0 //MO_BODYRELOCATION#�c�e#
265,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //MO_DODGE#���؂�#
266,8,6,1,0,0,5,1,no,0,0,0,weapon,0 //MO_INVESTIGATE#����#
267,10,8,1,0,0,5,1:2:3:4:5,no,0,0,0,weapon,0 //MO_FINGEROFFENSIVE#�w�e#
@@ -392,10 +392,10 @@
340,8,8,1,7,0,10,1:1:2:2:3:3:4:4:5:5,yes,0,2,0,magic,0 //NPC_DARKSOULSTRIKE#�Ń\�E���X�g���C�N#
341,8,8,1,7,0,10,3:4:5:6:7:8:9:10:11:12,yes,0,2,0,magic,2:3:3:4:4:5:5:6:6:7 //NPC_DARKJUPITEL#���s�e��#
-343,1,6,1,0,1,10,1,yes,0,2,0,weapon,0 //NPC_BREAKWEAPON
-344,1,6,1,0,1,10,1,yes,0,2,0,weapon,0 //NPC_BREAKARMOR
-345,1,6,1,0,1,10,1,yes,0,2,0,weapon,0 //NPC_BREAKHELM
-346,1,6,1,0,1,10,1,yes,0,2,0,weapon,0 //NPC_BREAKSHIELD
+343,8,6,1,0,0,5,1,no,0,2,0,weapon,0 //NPC_BREAKWEAPON#�u���C�N�E�F�|��#
+344,8,6,1,0,0,5,1,no,0,2,0,weapon,0 //NPC_BREAKARMOR#�u���C�N�A�[�}�[#
+345,8,6,1,0,0,5,1,no,0,2,0,weapon,0 //NPC_BREAKHELM#�u���C�N�w����#
+346,8,6,1,0,0,5,1,no,0,2,0,weapon,0 //NPC_BREAKSIELD#�u���C�N�V�[���h#
347,-1,6,1,9,0,10,1,no,0,2,0,weapon,0 //NPC_UNDEADATTACK
//342����
@@ -405,7 +405,7 @@
//346����
//347�s�������U��
//348�U���n�G�t�F�N�g�i��ށH�j
-//349�Ԕ���
+349,0,6,4,0,1,5,0,no,0,0,0,weapon,0 //NPC_EXPLOSIONSPIRITS#NPC�����g��#
//350���x�����G�t�F�N�g
//351�U���n�X�L���G�t�F�N�g
//352�U���n�X�L���G�t�F�N�g
@@ -431,8 +431,8 @@
371,-2,8,4,0,0,5,1,no,0,0,0,weapon,0 //CH_TIGERFIST#���Ռ�#
372,-2,8,4,0,0,10,1:1:2:2:3:3:4:4:5:5,no,0,0,0,weapon,0 //CH_CHAINCRUSH#�A������#
373,0,6,4,0,1,5,1,no,0,0,0,magic,0 //PF_HPCONVERSION#���C�t�u������#
-374,4,6,16,0,1,1,1,yes,0,0,0,magic,0 //PF_SOULCHANGE#?�E��?�F���W#
-375,4,6,1,0,0,5,1,yes,0,0,0,magic,0 //PF_SOULBURN#?�E���o?��#
+374,8,6,16,0,1,1,1,yes,0,0,0,none,0 //PF_SOULCHANGE#?�E��?�F���W#
+375,8,6,1,0,0,5,1,yes,0,0,0,magic,0 //PF_SOULBURN#?�E���o?��#
376,0,0,0,0,1,5,1,no,0,0,0,weapon,0 //ASC_KATAR#�A�h�o���X�h�J??������#
377,0,0,4,0,1,10,1,no,0,0,0,misc,0 //ASC_HALLUCINATION#�n���V�l?�V�����E�H?�N#
378,0,6,4,5,1,5,1,no,0,1024,0,weapon,0 //ASC_EDP#�G��?�����g�f�b�h��??�C�Y��#
@@ -459,11 +459,11 @@
399,4,6,1,0,0,10,1,no,0,0,0,weapon,0 //LK_JOINTBEAT#�W���C���g�r?�g#
400,8,8,1,8,0,5,1:2:3:4:5,yes,0,0,0,magic,0 //HW_NAPALMVULCAN#�i�p??�o���J��#
401,0,6,4,0,1,1,1,yes,0,0,0,weapon,0 //CH_SOULCOLLECT#���C��#
-402,8,6,1,0,1,10,1,no,0,0,0,none,0 //PF_MINDBREAKER#?�C���h�u��?�J?#
+402,8,6,1,0,1,5,1,no,0,0,0,none,0 //PF_MINDBREAKER#?�C���h�u��?�J?#
403,0,0,4,0,1,1,1,yes,0,0,0,magic,0 //PF_MEMORIZE#�������C�Y#
404,3,6,2,2,1,5,1,yes,0,256,1,magic,0 //PF_FOGWALL#�t�H�O�E�H?��#
405,3,6,2,0,1,1,1,no,0,128,2,misc,0 //PF_SPIDERWEB#�X�p�C??�E�F�b�u#
-406,-1,6,1,0,2,10,1,no,33,0,0,weapon,0 //ASC_METEORASSAULT#���e�I�A�T���g#
+406,0,6,4,0,1,10,1,no,33,0,0,weapon,0 //ASC_METEORASSAULT#���e�I�A�T���g#
407,0,6,4,0,1,1,0,no,0,0,0,none,0 //ASC_CDP#�f�b�h��??�C�Y������#
408,0,0,4,0,1,1,1,yes,0,0,0,magic,0 //WE_BABY##
409,0,0,4,0,1,1,1,yes,0,0,0,magic,0 //WE_CALLPARENT##
diff --git a/src/common/core.c b/src/common/core.c
index 016ade08d..a30445650 100644
--- a/src/common/core.c
+++ b/src/common/core.c
@@ -76,6 +76,11 @@ sigfunc *compat_signal(int signo, sigfunc *func)
static void sig_proc(int sn)
{
int i;
+ static int is_called = 0;
+
+ if(is_called++)
+ return;
+
switch(sn){
case SIGINT:
case SIGTERM:
@@ -196,11 +201,37 @@ static void display_title(void)
*/
int runflag = 1;
+char pid_file[256];
+
+void pid_delete(void) {
+ unlink(pid_file);
+}
+
+void pid_create(const char* file) {
+ FILE *fp;
+ int len = strlen(file);
+ strcpy(pid_file,file);
+ if(len > 4 && pid_file[len - 4] == '.') {
+ pid_file[len - 4] = 0;
+ }
+ strcat(pid_file,".pid");
+ fp = fopen(pid_file,"w");
+ if(fp) {
+#ifdef _WIN32
+ fprintf(fp,"%d",GetCurrentProcessId());
+#else
+ fprintf(fp,"%d",getpid());
+#endif
+ fclose(fp);
+ atexit(pid_delete);
+ }
+}
int main(int argc,char **argv)
{
int next;
+ pid_create(argv[0]);
Net_Init();
do_socket();
diff --git a/src/common/db.c b/src/common/db.c
index 9f2c75a68..5eb73c785 100644
--- a/src/common/db.c
+++ b/src/common/db.c
@@ -354,6 +354,29 @@ static void db_rebalance_erase(struct dbn *z,struct dbn **root)
}
}
+void db_free_lock(struct dbt *table) {
+ table->free_lock++;
+}
+
+void db_free_unlock(struct dbt *table) {
+ if(--table->free_lock == 0) {
+ int i;
+ for(i = 0; i < table->free_count ; i++) {
+ db_rebalance_erase(table->free_list[i].z,table->free_list[i].root);
+ if(table->cmp == strdb_cmp) {
+ free(table->free_list[i].z->key);
+ }
+#ifdef MALLOC_DBN
+ free_dbn(table->free_list[i].z);
+#else
+ free(table->free_list[i].z);
+#endif
+ table->item_count--;
+ }
+ table->free_count = 0;
+ }
+}
+
struct dbn* db_insert(struct dbt *table,void* key,void* data)
{
struct dbn *p,*priv;
@@ -363,10 +386,33 @@ struct dbn* db_insert(struct dbt *table,void* key,void* data)
for(c=0,priv=NULL ,p = table->ht[hash];p;){
c=table->cmp(table,key,p->key);
if(c==0){ // replace
- if (table->release)
- table->release(p, 3);
+ if (table->release)
+ table->release(p, 3);
+ if(p->deleted) {
+ // �폜���ꂽ�f�[�^�Ȃ̂ŁAfree_list ��̍폜�\�������
+ int i;
+ for(i = 0; i < table->free_count ; i++) {
+ if(table->free_list[i].z == p) {
+ memmove(
+ &table->free_list[i],
+ &table->free_list[i+1],
+ sizeof(struct db_free)*(table->free_count - i - 1)
+ );
+ break;
+ }
+ }
+ if(i == table->free_count || table->free_count <= 0) {
+ printf("db_insert: cannnot find deleted db node.\n");
+ } else {
+ table->free_count--;
+ if(table->cmp == strdb_cmp) {
+ free(p->key);
+ }
+ }
+ }
p->data=data;
p->key=key;
+ p->deleted = 0;
return p;
}
priv=p;
@@ -391,6 +437,7 @@ struct dbn* db_insert(struct dbt *table,void* key,void* data)
p->key = key;
p->data = data;
p->color = RED;
+ p->deleted = 0;
if(c==0){ // hash entry is empty
table->ht[hash] = p;
p->color = BLACK;
@@ -429,25 +476,47 @@ void* db_erase(struct dbt *table,void* key)
if(!p)
return NULL;
data=p->data;
- db_rebalance_erase(p,&table->ht[hash]);
-#ifdef MALLOC_DBN
- free_dbn(p);
-#else
- aFree(p);
-#endif
- table->item_count--;
+ if(table->free_lock) {
+ if(table->free_count == table->free_max) {
+ table->free_max += 32;
+ table->free_list = (struct db_free*)realloc(table->free_list,sizeof(struct db_free) * table->free_max);
+ }
+ table->free_list[table->free_count].z = p;
+ table->free_list[table->free_count].root = &table->ht[hash];
+ table->free_count++;
+ p->deleted = 1;
+ p->data = NULL;
+ if(table->cmp == strdb_cmp) {
+ if(table->maxlen) {
+ char *key = (char*)malloc(table->maxlen);
+ memcpy(key,p->key,table->maxlen);
+ p->key = key;
+ } else {
+ p->key = strdup((const char*)p->key);
+ }
+ }
+ } else {
+ db_rebalance_erase(p,&table->ht[hash]);
+ #ifdef MALLOC_DBN
+ free_dbn(p);
+ #else
+ aFree(p);
+ #endif
+ table->item_count--;
+ }
return data;
}
void db_foreach(struct dbt *table,int (*func)(void*,void*,va_list),...)
{
int i,sp;
- int count = 0;
+ int count = table->item_count;
// red-black tree�Ȃ̂�64��stack�������2^32�ƒm�[�h�܂ő��v
struct dbn *p,*pn,*stack[64];
va_list ap;
va_start(ap,func);
+ db_free_lock(table);
for(i=0;i<HASH_SIZE;i++){
if((p=table->ht[i])==NULL)
continue;
@@ -457,8 +526,9 @@ void db_foreach(struct dbt *table,int (*func)(void*,void*,va_list),...)
//if (!p->data) {
// printf("Warning: no data for key %d in db_foreach (db.c) !\n",(int)p->key);
//} else {
- func(p->key, p->data, ap);
- count++;
+ if(!p->deleted)
+ func(p->key, p->data, ap);
+ count--;
//}
if((pn=p->left)!=NULL){
if(p->right){
@@ -476,10 +546,11 @@ void db_foreach(struct dbt *table,int (*func)(void*,void*,va_list),...)
}
}
}
- if(count != table->item_count) {
+ db_free_unlock(table);
+ if(count) {
printf(
- "db_foreach : data lost %d of %d item(s) allocated from %s line %d\n",
- table->item_count - count,count,table->alloc_file,table->alloc_line
+ "db_foreach : data lost %d item(s) allocated from %s line %d\n",
+ count,table->alloc_file,table->alloc_line
);
}
va_end(ap);
@@ -492,12 +563,13 @@ void db_final(struct dbt *table,int (*func)(void*,void*,va_list),...)
va_list ap;
va_start(ap,func);
+ db_free_lock(table);
for(i=0;i<HASH_SIZE;i++){
if((p=table->ht[i])==NULL)
continue;
sp=0;
while(1){
- if(func)
+ if(func && !p->deleted)
func(p->key,p->data,ap);
if((pn=p->left)!=NULL){
if(p->right){
@@ -520,6 +592,8 @@ void db_final(struct dbt *table,int (*func)(void*,void*,va_list),...)
p=pn;
}
}
+ db_free_unlock(table);
+ free(table->free_list);
aFree(table);
va_end(ap);
}
diff --git a/src/common/db.h b/src/common/db.h
index c31f5bfaa..11ed4f3e1 100644
--- a/src/common/db.h
+++ b/src/common/db.h
@@ -13,6 +13,7 @@ struct dbn {
int color;
void *key;
void *data;
+ int deleted; // �폜�ς݃t���O(db_foreach)
};
struct dbt {
@@ -24,7 +25,16 @@ struct dbt {
struct dbn *ht[HASH_SIZE];
int item_count; // vf?
const char* alloc_file; // DB?t@C
- int alloc_line; // DB?s
+ int alloc_line; // DB?s
+ // db_foreach ������db_erase �����΍�Ƃ��āA
+ // db_foreach ���I���܂Ń��b�N���邱�Ƃɂ���
+ struct db_free {
+ struct dbn *z;
+ struct dbn **root;
+ } *free_list;
+ int free_count;
+ int free_max;
+ int free_lock;
};
#define strdb_search(t,k) db_search((t),(void*)(k))
diff --git a/src/map/atcommand.c b/src/map/atcommand.c
index ded7d593d..9fea47dee 100644
--- a/src/map/atcommand.c
+++ b/src/map/atcommand.c
@@ -213,6 +213,7 @@ ACMD_FUNC(mobsearch);
ACMD_FUNC(cleanmap);
ACMD_FUNC(npctalk);
ACMD_FUNC(pettalk);
+ACMD_FUNC(users);
ACMD_FUNC(autoloot); // by Upa-Kun
#ifndef TXT_ONLY
@@ -489,6 +490,7 @@ static AtCommandInfo atcommand_info[] = {
{ AtCommand_CleanMap, "@cleanmap", 0, atcommand_cleanmap },
{ AtCommand_NpcTalk, "@npctalk", 0, atcommand_npctalk },
{ AtCommand_PetTalk, "@pettalk", 0, atcommand_pettalk },
+ { AtCommand_Users, "@users", 0, atcommand_users },
{ AtCommand_ResetState, "/reset", 40, NULL },
#ifndef TXT_ONLY // sql-only commands
@@ -7839,6 +7841,47 @@ atcommand_pettalk(
}
/*==========================================
+ * @users
+ * �T�[�o�[���̐l���}�b�v��\��������
+ * �蔲���̂��߉����Ȃ��Ă���͎̂d�l�ł��B
+ *------------------------------------------
+ */
+
+static struct dbt *users_db;
+static int users_all;
+
+static int atcommand_users_sub1(struct map_session_data* sd,va_list va) {
+ int users = (int)strdb_search(users_db,sd->mapname) + 1;
+ users_all++;
+ strdb_insert(users_db,sd->mapname,(void *)users);
+ return 0;
+}
+
+static int atcommand_users_sub2(void* key,void* val,va_list va) {
+ char buf[256];
+ struct map_session_data* sd = va_arg(va,struct map_session_data*);
+ sprintf(buf,"%s : %d (%d%%)",(char *)key,(int)val,(int)val * 100 / users_all);
+ clif_displaymessage(sd->fd,buf);
+ return 0;
+}
+
+int
+atcommand_users(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ char buf[256];
+ users_all = 0;
+ users_db = strdb_init(24);
+ clif_foreachclient(atcommand_users_sub1);
+ strdb_foreach(users_db,atcommand_users_sub2,sd);
+ sprintf(buf,"all : %d",users_all);
+ clif_displaymessage(fd,buf);
+ strdb_final(users_db,NULL);
+ return 0;
+}
+
+/*==========================================
*
*------------------------------------------
*/
diff --git a/src/map/atcommand.h b/src/map/atcommand.h
index ea6849476..bdc4f429d 100644
--- a/src/map/atcommand.h
+++ b/src/map/atcommand.h
@@ -198,6 +198,7 @@ enum AtCommandType {
AtCommand_CleanMap,
AtCommand_NpcTalk,
AtCommand_PetTalk,
+ AtCommand_Users,
// SQL-only commands start
#ifndef TXT_ONLY
diff --git a/src/map/battle.c b/src/map/battle.c
index cc82c6ddc..bffbd0684 100644
--- a/src/map/battle.c
+++ b/src/map/battle.c
@@ -400,7 +400,7 @@ int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,i
if(class_ == 1288 || class_ == 1287 || class_ == 1286 || class_ == 1285) {
// if(class_ == 1288) {
- if(class_ == 1288 && flag&BF_SKILL)
+ if(class_ == 1288 && (flag&BF_SKILL || skill_num == ASC_BREAKER))
damage=0;
if(src->type == BL_PC) {
struct guild *g=guild_search(((struct map_session_data *)src)->status.guild_id);
@@ -417,6 +417,8 @@ int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,i
damage=0;//���K�M���h���F���Ȃ��ƃ_���[�W����
else if (battle_config.guild_max_castles != 0 && guild_checkcastles(g)>=battle_config.guild_max_castles)
damage = 0; // [MouseJstr]
+ else if (g && gc && guild_check_alliance(gc->guild_id, g->guild_id, 0) == 1)
+ return 0;
}
else damage = 0;
}
@@ -775,7 +777,6 @@ static struct Damage battle_calc_pet_weapon_attack(
if(skill_lv>9 && wflag==2) damage2+=damage/4;
if(skill_lv>9 && wflag==3) damage2+=damage/2;
damage +=damage2;
- blewcount=0;
break;
case KN_BOWLINGBASH: // �{�E�����O�o�b�V��
damage = damage*(100+ 50*skill_lv)/100;
@@ -1271,7 +1272,6 @@ static struct Damage battle_calc_mob_weapon_attack(
if(skill_lv>9 && wflag==2) damage2+=damage/4;
if(skill_lv>9 && wflag==3) damage2+=damage/2;
damage +=damage2;
- blewcount=0;
break;
case KN_BOWLINGBASH: // �{�E�����O�o�b�V��
damage = damage*(100+ 50*skill_lv)/100;
@@ -1615,7 +1615,6 @@ static struct Damage battle_calc_pc_weapon_attack(
int no_cardfix=0;
int def1 = status_get_def(target);
int def2 = status_get_def2(target);
-// int mdef1, mdef2;
int t_vit = status_get_vit(target);
struct Damage wd;
int damage,damage2,damage3=0,damage4=0,type,div_,blewcount=skill_get_blewcount(skill_num,skill_lv);
@@ -2024,6 +2023,7 @@ static struct Damage battle_calc_pc_weapon_attack(
case KN_SPEARSTAB: // �X�s�A�X�^�u
damage = damage*(100+ 15*skill_lv)/100;
damage2 = damage2*(100+ 15*skill_lv)/100;
+ blewcount=0;
break;
case KN_SPEARBOOMERANG: // �X�s�A�u�[������
damage = damage*(100+ 50*skill_lv)/100;
@@ -2047,7 +2047,6 @@ static struct Damage battle_calc_pc_weapon_attack(
if(skill_lv>9 && wflag==2) damage4+=damage2/4;
if(skill_lv>9 && wflag==3) damage4+=damage2/2;
damage2 +=damage4;
- blewcount=0;
break;
case KN_BOWLINGBASH: // �{�E�����O�o�b�V��
damage = damage*(100+ 50*skill_lv)/100;
@@ -2287,49 +2286,12 @@ static struct Damage battle_calc_pc_weapon_attack(
break;
case ASC_BREAKER: // -- moonsoul (special damage for ASC_BREAKER skill)
if(sd){
-/* int mdef1=status_get_mdef(target);
- int mdef2=status_get_mdef2(target);
- int imdef_flag=0;
-
- damage = ((damage * 5) + (skill_lv * status_get_int(src) * 5) + rand()%500 + 500) /2;
- damage2 = ((damage2 * 5) + (skill_lv * status_get_int(src) * 5) + rand()%500 + 500) /2;
- damage3 = damage;
- // physical damage can miss
- hitrate = 1000000;*/
-
// calculate physical part of damage
damage = damage * skill_lv;
damage2 = damage2 * skill_lv;
- // element modifier added right after this
-
// calculate magic part of damage
damage3 = skill_lv * status_get_int(src) * 5;
- // ignores magic defense now [Celest]
- /*if(sd->ignore_mdef_ele & (1<<t_ele) || sd->ignore_mdef_race & (1<<t_race))
- imdef_flag = 1;
- if(t_mode & 0x20) {
- if(sd->ignore_mdef_race & (1<<10))
- imdef_flag = 1;
- }
- else {
- if(sd->ignore_mdef_race & (1<<11))
- imdef_flag = 1;
- }
- if(!imdef_flag){
- if(battle_config.magic_defense_type) {
- damage3 = damage3 - (mdef1 * battle_config.magic_defense_type) - mdef2;
- }
- else{
- damage3 = (damage3*(100-mdef1))/100 - mdef2;
- }
- }
-
- if(damage3<1)
- damage3=1;
-
- damage3=battle_attr_fix(damage2,s_ele_, status_get_element(target) );*/
-
flag=(flag&~BF_RANGEMASK)|BF_LONG;
}
break;
@@ -3221,7 +3183,7 @@ struct Damage battle_calc_misc_attack(
struct Damage md;
int damagefix=1;
- int aflag=BF_MISC|BF_LONG|BF_SKILL;
+ int aflag=BF_MISC|BF_SHORT|BF_SKILL;
//return�O�̏���������̂ŏ��o�͕��̂ݕύX
if( bl == NULL || target == NULL ){
@@ -3263,13 +3225,13 @@ struct Damage battle_calc_misc_attack(
damage=(dex/10+int_/2+skill*3+40)*2;
if(flag > 1)
damage /= flag;
- if(status_get_mode(target) & 0x40)
- damage = 1;
+ aflag |= (flag&~BF_RANGEMASK)|BF_LONG;
break;
case TF_THROWSTONE: // ����
damage=50;
damagefix=0;
+ aflag |= (flag&~BF_RANGEMASK)|BF_LONG;
break;
case BA_DISSONANCE: // �s���a��
@@ -3312,8 +3274,7 @@ struct Damage battle_calc_misc_attack(
#endif
if(flag > 1)
damage /= flag;
- if(status_get_mode(target) & 0x40)
- damage = 1;
+ aflag |= (flag&~BF_RANGEMASK)|BF_LONG;
break;
}
@@ -3348,6 +3309,9 @@ struct Damage battle_calc_misc_attack(
damage = div_;
}
+ if(status_get_mode(target)&0x40 && damage>0)
+ damage = 1;
+
damage=battle_calc_damage(bl,target,damage,div_,skill_num,skill_lv,aflag); // �ŏI�C��
md.damage=damage;
@@ -3476,7 +3440,7 @@ int battle_weapon_attack( struct block_list *src,struct block_list *target,
}
}
if(rdamage > 0)
- clif_damage(src,src,tick, wd.amotion,0,rdamage,1,4,0);
+ clif_damage(src,src,tick,wd.amotion,wd.dmotion,rdamage,1,4,0);
}
if (wd.div_ == 255 && sd) { //�O�i��
@@ -3925,7 +3889,7 @@ int battle_check_range(struct block_list *src,struct block_list *bl,int range)
// return 1;
// ��Q������
- return path_search_long(src->m,src->x,src->y,bl->x,bl->y);
+ return path_search_long(NULL,src->m,src->x,src->y,bl->x,bl->y);
}
/*==========================================
@@ -4122,6 +4086,9 @@ static const struct {
{ "gm_can_drop_lv", &battle_config.gm_can_drop_lv },
{ "disp_hpmeter", &battle_config.disp_hpmeter },
{ "bone_drop", &battle_config.bone_drop },
+ { "monster_damage_delay", &battle_config.monster_damage_delay },
+
+// eAthena additions
{ "item_rate_common", &battle_config.item_rate_common }, // Added by RoVeRT
{ "item_rate_equip", &battle_config.item_rate_equip },
{ "item_rate_card", &battle_config.item_rate_card }, // End Addition
@@ -4369,6 +4336,9 @@ void battle_set_defaults() {
battle_config.gm_can_drop_lv = 0;
battle_config.disp_hpmeter = 0;
battle_config.bone_drop = 0;
+ battle_config.monster_damage_delay = 1;
+
+// eAthena additions
battle_config.item_rate_common = 100;
battle_config.item_rate_equip = 100;
battle_config.item_rate_card = 100;
diff --git a/src/map/battle.h b/src/map/battle.h
index 150e08f41..63681360a 100644
--- a/src/map/battle.h
+++ b/src/map/battle.h
@@ -280,7 +280,9 @@ extern struct Battle_Config {
int gm_can_drop_lv;
int disp_hpmeter;
int bone_drop;
+ int monster_damage_delay;
+// eAthena additions
int night_at_start; // added by [Yor]
int day_duration; // added by [Yor]
int night_duration; // added by [Yor]
diff --git a/src/map/chrif.c b/src/map/chrif.c
index 8bd70a737..a3a3e63f5 100644
--- a/src/map/chrif.c
+++ b/src/map/chrif.c
@@ -1006,7 +1006,7 @@ int chrif_disconnect_sub(struct map_session_data* sd,va_list va) {
int chrif_disconnect(int fd) {
if(fd == char_fd) {
- char_fd = -1;
+ char_fd = 0;
sprintf(tmp_output,"Map Server disconnected from Char Server.\n\n");
ShowWarning(tmp_output);
clif_foreachclient(chrif_disconnect_sub);
diff --git a/src/map/guild.c b/src/map/guild.c
index ea9c3795f..06838c4b8 100644
--- a/src/map/guild.c
+++ b/src/map/guild.c
@@ -678,11 +678,10 @@ int guild_member_leaved(int guild_id,int account_id,int char_id,int flag,
{
struct map_session_data *sd=map_id2sd(account_id);
struct guild *g=guild_search(guild_id);
- int i;
if(g!=NULL){
int i;
- for(i=0;i<g->max_member;i++)
+ for(i=0;i<g->max_member;i++) {
if( g->member[i].account_id==account_id &&
g->member[i].char_id==char_id ){
struct map_session_data *sd2=sd;
@@ -698,6 +697,12 @@ int guild_member_leaved(int guild_id,int account_id,int char_id,int flag,
g->member[i].account_id=0;
g->member[i].sd=NULL;
}
+ // �����o�[���X�g��S���ɍĒʒm
+ for(i=0;i<g->max_member;i++){
+ if( g->member[i].sd!=NULL )
+ clif_guild_memberlist(g->member[i].sd);
+ }
+ }
}
if(sd!=NULL) {
if (sd->status.guild_id==guild_id){
@@ -706,13 +711,7 @@ int guild_member_leaved(int guild_id,int account_id,int char_id,int flag,
sd->guild_sended=0;
}
}
-
- // �����o�[���X�g��S���ɍĒʒm
- for(i=0;i<g->max_member;i++){
- if( g->member[i].sd!=NULL )
- clif_guild_memberlist(g->member[i].sd);
- }
-
+
return 0;
}
// �M���h�����o�̃I�����C�����/Lv�X�V���M
@@ -1037,6 +1036,23 @@ int guild_get_alliance_count(struct guild *g,int flag)
}
return c;
}
+// �����֌W���ǂ����`�F�b�N
+// �����Ȃ�1�A����ȊO��0
+int guild_check_alliance(int guild_id1, int guild_id2, int flag)
+{
+ struct guild *g;
+ int i;
+
+ g = guild_search(guild_id1);
+ if (g == NULL)
+ return 0;
+
+ for (i=0; i<MAX_GUILDALLIANCE; i++)
+ if ((g->alliance[i].guild_id == guild_id2) && (g->alliance[i].opposition == flag))
+ return 1;
+
+ return 0;
+}
// �M���h�����v��
int guild_reqalliance(struct map_session_data *sd,int account_id)
{
diff --git a/src/map/guild.h b/src/map/guild.h
index 8f5243a8c..1dee350a1 100644
--- a/src/map/guild.h
+++ b/src/map/guild.h
@@ -54,6 +54,7 @@ int guild_allianceack(int guild_id1,int guild_id2,int account_id1,int account_id
int flag,const char *name1,const char *name2);
int guild_delalliance(struct map_session_data *sd,int guild_id,int flag);
int guild_opposition(struct map_session_data *sd,int char_id);
+int guild_check_alliance(int guild_id1, int guild_id2, int flag);
int guild_send_memberinfoshort(struct map_session_data *sd,int online);
int guild_recv_memberinfoshort(int guild_id,int account_id,int char_id,int online,int lv,int class_);
diff --git a/src/map/map.c b/src/map/map.c
index d402ac06c..bcf6c83ad 100644
--- a/src/map/map.c
+++ b/src/map/map.c
@@ -239,10 +239,27 @@ int map_freeblock_unlock(void) {
}else if(block_free_lock<0){
if(battle_config.error_log)
printf("map_freeblock_unlock: lock count < 0 !\n");
+ block_free_lock = 0; // ����ȍ~�̃��b�N�Ɏx�Ⴊ�o�Ă���̂Ń��Z�b�g
}
return block_free_lock;
}
+// map_freeblock_lock() ���Ă�� map_freeblock_unlock() ���Ă΂Ȃ�
+// �֐����������̂ŁA����I��block_free_lock�����Z�b�g����悤�ɂ���B
+// ���̊֐��́Ado_timer() �̃g�b�v���x������Ă΂��̂ŁA
+// block_free_lock �𒼐ڂ������Ă��x�ᖳ���͂��B
+
+int map_freeblock_timer(int tid,unsigned int tick,int id,int data) {
+ if(block_free_lock > 0) {
+ printf("map_freeblock_timer: block_free_lock(%d) is invalid.\n",block_free_lock);
+ block_free_lock = 1;
+ map_freeblock_unlock();
+ }
+ // else {
+ // printf("map_freeblock_timer: check ok\n");
+ // }
+ return 0;
+}
//
// block��?��
@@ -1428,96 +1445,98 @@ void map_addnickdb(struct map_session_data *sd) {
int map_quit(struct map_session_data *sd) {
nullpo_retr(0, sd);
- if (sd->state.event_disconnect) {
- struct npc_data *npc;
- if ((npc = npc_name2id(script_config.logout_event_name))) {
- run_script(npc->u.scr.script,0,sd->bl.id,npc->bl.id); // PCLogoutNPC
- sprintf (tmp_output, "Event '"CL_WHITE"%s"CL_RESET"' executed.\n", script_config.logout_event_name);
- ShowStatus(tmp_output);
+ if(!sd->state.waitingdisconnect) {
+ if (sd->state.event_disconnect) {
+ struct npc_data *npc;
+ if ((npc = npc_name2id(script_config.logout_event_name))) {
+ run_script(npc->u.scr.script,0,sd->bl.id,npc->bl.id); // PCLogoutNPC
+ sprintf (tmp_output, "Event '"CL_WHITE"%s"CL_RESET"' executed.\n", script_config.logout_event_name);
+ ShowStatus(tmp_output);
+ }
}
- }
- if(sd->chatID) // �`���b�g����o��
- chat_leavechat(sd);
+ if(sd->chatID) // �`���b�g����o��
+ chat_leavechat(sd);
- if(sd->trade_partner) // �����?����
- trade_tradecancel(sd);
+ if(sd->trade_partner) // �����?����
+ trade_tradecancel(sd);
- if(sd->party_invite>0) // �p?�e�B?�U�����ۂ���
- party_reply_invite(sd,sd->party_invite_account,0);
+ if(sd->party_invite>0) // �p?�e�B?�U�����ۂ���
+ party_reply_invite(sd,sd->party_invite_account,0);
- if(sd->guild_invite>0) // �M���h?�U�����ۂ���
- guild_reply_invite(sd,sd->guild_invite,0);
- if(sd->guild_alliance>0) // �M���h����?�U�����ۂ���
- guild_reply_reqalliance(sd,sd->guild_alliance_account,0);
+ if(sd->guild_invite>0) // �M���h?�U�����ۂ���
+ guild_reply_invite(sd,sd->guild_invite,0);
+ if(sd->guild_alliance>0) // �M���h����?�U�����ۂ���
+ guild_reply_reqalliance(sd,sd->guild_alliance_account,0);
- party_send_logout(sd); // �p?�e�B�̃��O�A�E�g���b�Z?�W���M
+ party_send_logout(sd); // �p?�e�B�̃��O�A�E�g���b�Z?�W���M
- guild_send_memberinfoshort(sd,0); // �M���h�̃��O�A�E�g���b�Z?�W���M
+ guild_send_memberinfoshort(sd,0); // �M���h�̃��O�A�E�g���b�Z?�W���M
- pc_cleareventtimer(sd); // �C�x���g�^�C�}��j������
+ pc_cleareventtimer(sd); // �C�x���g�^�C�}��j������
- if(sd->state.storage_flag)
- storage_guild_storage_quit(sd,0);
- else
- storage_storage_quit(sd); // �q�ɂ��J���Ă�Ȃ�ۑ�����
-
- // check if we've been authenticated [celest]
- if (sd->state.auth)
- skill_castcancel(&sd->bl,0); // �r����?����
-
- skill_stop_dancing(&sd->bl,1);// �_���X/���t��?
-
- if(sd->sc_data && sd->sc_data[SC_BERSERK].timer!=-1) //�o?�T?�N���̏I����HP��100��
- sd->status.hp = 100;
+ if(sd->state.storage_flag)
+ storage_guild_storage_quit(sd,0);
+ else
+ storage_storage_quit(sd); // �q�ɂ��J���Ă�Ȃ�ۑ�����
- status_change_clear(&sd->bl,1); // �X�e?�^�X�ُ����������
- skill_clear_unitgroup(&sd->bl); // �X�L�����j�b�g�O��?�v�̍폜
- skill_cleartimerskill(&sd->bl);
+ // check if we've been authenticated [celest]
+ if (sd->state.auth)
+ skill_castcancel(&sd->bl,0); // �r����?����
- // check if we've been authenticated [celest]
- if (sd->state.auth) {
- pc_stop_walking(sd,0);
- pc_stopattack(sd);
- pc_delinvincibletimer(sd);
- }
- pc_delspiritball(sd,sd->spiritball,1);
- skill_gangsterparadise(sd,0);
+ skill_stop_dancing(&sd->bl,1);// �_���X/���t��?
- if (sd->state.auth)
- status_calc_pc(sd,4);
-// skill_clear_unitgroup(&sd->bl); // [Sara-chan]
+ if(sd->sc_data && sd->sc_data[SC_BERSERK].timer!=-1) //�o?�T?�N���̏I����HP��100��
+ sd->status.hp = 100;
- clif_clearchar_area(&sd->bl,2);
+ status_change_clear(&sd->bl,1); // �X�e?�^�X�ُ����������
+ skill_clear_unitgroup(&sd->bl); // �X�L�����j�b�g�O��?�v�̍폜
+ skill_cleartimerskill(&sd->bl);
- if(sd->status.pet_id && sd->pd) {
- pet_lootitem_drop(sd->pd,sd);
- pet_remove_map(sd);
- if(sd->pet.intimate <= 0) {
- intif_delete_petdata(sd->status.pet_id);
- sd->status.pet_id = 0;
- sd->pd = NULL;
- sd->petDB = NULL;
+ // check if we've been authenticated [celest]
+ if (sd->state.auth) {
+ pc_stop_walking(sd,0);
+ pc_stopattack(sd);
+ pc_delinvincibletimer(sd);
+ }
+ pc_delspiritball(sd,sd->spiritball,1);
+ skill_gangsterparadise(sd,0);
+ skill_unit_move(&sd->bl,gettick(),0);
+
+ if (sd->state.auth)
+ status_calc_pc(sd,4);
+ // skill_clear_unitgroup(&sd->bl); // [Sara-chan]
+
+ clif_clearchar_area(&sd->bl,2);
+
+ if(sd->status.pet_id && sd->pd) {
+ pet_lootitem_drop(sd->pd,sd);
+ pet_remove_map(sd);
+ if(sd->pet.intimate <= 0) {
+ intif_delete_petdata(sd->status.pet_id);
+ sd->status.pet_id = 0;
+ sd->pd = NULL;
+ sd->petDB = NULL;
+ }
+ else
+ intif_save_petdata(sd->status.account_id,&sd->pet);
}
- else
- intif_save_petdata(sd->status.account_id,&sd->pet);
- }
- if(pc_isdead(sd))
- pc_setrestartvalue(sd,2);
+ if(pc_isdead(sd))
+ pc_setrestartvalue(sd,2);
- pc_makesavestatus(sd);
- chrif_save(sd);
- storage_storage_dirty(sd);
- storage_storage_save(sd);
+ pc_makesavestatus(sd);
+ chrif_save(sd);
+ storage_storage_dirty(sd);
+ storage_storage_save(sd);
+ map_delblock(&sd->bl);
+ }
if( sd->npc_stackbuf && sd->npc_stackbuf != NULL) {
aFree( sd->npc_stackbuf );
sd->npc_stackbuf = NULL;
}
- map_delblock(&sd->bl);
-
#ifndef TXT_ONLY
chrif_char_offline(sd);
#endif
@@ -3348,11 +3367,16 @@ int do_init(int argc, char *argv[]) {
map_readallmap();
+ add_timer_func_list(map_freeblock_timer,"map_freeblock_timer");
add_timer_func_list(map_clearflooritem_timer, "map_clearflooritem_timer");
+ add_timer_interval(gettick()+1000,map_freeblock_timer,0,0,60*1000);
//Added by Mugendai for GUI support
if (flush_on)
add_timer_interval(gettick()+10, flush_timer,0,0,flush_time);
+ //Added for Mugendais I'm Alive mod
+ if (imalive_on)
+ add_timer_interval(gettick()+10, imalive_timer,0,0,imalive_time*1000);
#ifndef TXT_ONLY // online status timer, checks every hour [Valaris]
add_timer_func_list(online_timer, "online_timer");
@@ -3395,10 +3419,6 @@ int do_init(int argc, char *argv[]) {
if (battle_config.pk_mode == 1)
ShowNotice("Server is running on '"CL_WHITE"PK Mode"CL_RESET"'.\n");
- //Added for Mugendais I'm Alive mod
- if (imalive_on)
- add_timer_interval(gettick()+10, imalive_timer,0,0,imalive_time*1000);
-
sprintf(tmp_output,"Server is '"CL_GREEN"ready"CL_RESET"' and listening on port '"CL_WHITE"%d"CL_RESET"'.\n\n", map_port);
ShowStatus(tmp_output);
diff --git a/src/map/map.h b/src/map/map.h
index c1d0670e7..aa73b7a8b 100644
--- a/src/map/map.h
+++ b/src/map/map.h
@@ -53,6 +53,12 @@ struct walkpath_data {
unsigned char path_len,path_pos,path_half;
unsigned char path[MAX_WALKPATH];
};
+struct shootpath_data {
+ int rx,ry,len;
+ int x[MAX_WALKPATH];
+ int y[MAX_WALKPATH];
+};
+
struct script_reg {
int index;
int data;
@@ -774,7 +780,7 @@ int map_calc_dir( struct block_list *src,int x,int y);
// path.c���
int path_search(struct walkpath_data*,int,int,int,int,int,int);
-int path_search_long(int m,int x0,int y0,int x1,int y1);
+int path_search_long(struct shootpath_data *,int,int,int,int,int);
int path_blownpos(int m,int x0,int y0,int dx,int dy,int count);
int map_who(int fd);
diff --git a/src/map/mob.c b/src/map/mob.c
index 327d78b02..b313328c2 100644
--- a/src/map/mob.c
+++ b/src/map/mob.c
@@ -1103,7 +1103,7 @@ int mob_stop_walking(struct mob_data *md,int type)
if(type&0x02) {
int delay=status_get_dmotion(&md->bl);
unsigned int tick = gettick();
- if(md->canmove_tick < tick)
+ if(battle_config.monster_damage_delay && md->canmove_tick < tick)
md->canmove_tick = tick + delay;
}
@@ -2225,7 +2225,7 @@ int mob_damage(struct block_list *src,struct mob_data *md,int damage,int type)
return 0;
}
- if(md->sc_data[SC_ENDURE].timer == -1)
+ if(battle_config.monster_damage_delay && md->sc_data[SC_ENDURE].timer == -1)
mob_stop_walking(md,3);
if(damage > max_hp>>2)
skill_stop_dancing(&md->bl,0);
@@ -3777,11 +3777,14 @@ int mob_gvmobcheck(struct map_session_data *sd, struct block_list *bl)
return 0;//�M���h�������Ȃ�_���[�W����
else if(gc != NULL && !map[sd->bl.m].flag.gvg)
return 0;//�ԓ���Gv����Ȃ��Ƃ��̓_���[�W�Ȃ�
- else if(g && gc != NULL && g->guild_id == gc->guild_id)
- return 0;//����̃M���h�̃G���y�Ȃ�_���[�W����
- else if(g && guild_checkskill(g,GD_APPROVAL) <= 0 && md->class_ == 1288)
- return 0;//���K�M���h���F���Ȃ��ƃ_���[�W����
-
+ else if(g) {
+ if (gc != NULL && g->guild_id == gc->guild_id)
+ return 0;//����̃M���h�̃G���y�Ȃ�_���[�W����
+ else if(guild_checkskill(g,GD_APPROVAL) <= 0 && md->class_ == 1288)
+ return 0;//���K�M���h���F���Ȃ��ƃ_���[�W����
+ else if (gc && guild_check_alliance(gc->guild_id, g->guild_id, 0) == 1)
+ return 0; // �����Ȃ�_���[�W����
+ }
}
return 1;
diff --git a/src/map/npc.c b/src/map/npc.c
index c6d77c18c..89837da77 100644
--- a/src/map/npc.c
+++ b/src/map/npc.c
@@ -1882,9 +1882,15 @@ static int npc_parse_script(char *w1,char *w2,char *w3,char *w4,char *first_line
printf("npc_parse_script: label name error !\n");
exit(1);
}else{
+ struct event_data *ev2;
ev->nd=nd;
ev->pos=pos;
sprintf(buf,"%s::%s",nd->exname,lname);
+ ev2 = strdb_search(ev_db,buf);
+ if(ev2 != NULL) {
+ printf("npc_parse_script : duplicate event %s\n",buf);
+ free(ev2);
+ }
strdb_insert(ev_db,buf,ev);
}
}
diff --git a/src/map/path.c b/src/map/path.c
index 92ea4941e..c2b852469 100644
--- a/src/map/path.c
+++ b/src/map/path.c
@@ -246,7 +246,7 @@ int path_blownpos(int m,int x0,int y0,int dx,int dy,int count)
*------------------------------------------
*/
#define swap(x,y) { int t; t = x; x = y; y = t; }
-int path_search_long(int m,int x0,int y0,int x1,int y1)
+int path_search_long(struct shootpath_data *spd,int m,int x0,int y0,int x1,int y1)
{
int dx, dy;
int wx = 0, wy = 0;
@@ -265,13 +265,25 @@ int path_search_long(int m,int x0,int y0,int x1,int y1)
}
dy = (y1 - y0);
+ if (spd) {
+ spd->rx = spd->ry = 0;
+ spd->len = 1;
+ spd->x[0] = x0;
+ spd->y[0] = y0;
+ }
+
if (map_getcellp(md,x1,y1,CELL_CHKWALL))
return 0;
- if (dx > abs(dy))
+ if (dx > abs(dy)) {
weight = dx;
- else
+ if (spd)
+ spd->ry=1;
+ } else {
weight = abs(y1 - y0);
+ if (spd)
+ spd->rx=1;
+ }
while (x0 != x1 || y0 != y1) {
if (map_getcellp(md,x0,y0,CELL_CHKWALL))
@@ -289,6 +301,11 @@ int path_search_long(int m,int x0,int y0,int x1,int y1)
wy += weight;
y0 --;
}
+ if (spd && spd->len<MAX_WALKPATH) {
+ spd->x[spd->len] = x0;
+ spd->y[spd->len] = y0;
+ spd->len++;
+ }
}
return 1;
diff --git a/src/map/pc.c b/src/map/pc.c
index 2b04699d2..282aa79c4 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -371,22 +371,24 @@ int pc_makesavestatus(struct map_session_data *sd)
sd->status.clothes_color=0;
// ���S?�Ԃ������̂�hp��1�A�ʒu���Z?�u�ꏊ��?�X
- if(pc_isdead(sd)){
- pc_setrestartvalue(sd,0);
- memcpy(&sd->status.last_point,&sd->status.save_point,sizeof(sd->status.last_point));
- } else {
- memcpy(sd->status.last_point.map,sd->mapname,24);
- sd->status.last_point.x = sd->bl.x;
- sd->status.last_point.y = sd->bl.y;
- }
-
- // �Z?�u�֎~�}�b�v�������̂Ŏw��ʒu�Ɉړ�
- if(map[sd->bl.m].flag.nosave){
- struct map_data *m=&map[sd->bl.m];
- if(strcmp(m->save.map,"SavePoint")==0)
+ if(!sd->state.waitingdisconnect) {
+ if(pc_isdead(sd)){
+ pc_setrestartvalue(sd,0);
memcpy(&sd->status.last_point,&sd->status.save_point,sizeof(sd->status.last_point));
- else
- memcpy(&sd->status.last_point,&m->save,sizeof(sd->status.last_point));
+ } else {
+ memcpy(sd->status.last_point.map,sd->mapname,24);
+ sd->status.last_point.x = sd->bl.x;
+ sd->status.last_point.y = sd->bl.y;
+ }
+
+ // �Z?�u�֎~�}�b�v�������̂Ŏw��ʒu�Ɉړ�
+ if(map[sd->bl.m].flag.nosave){
+ struct map_data *m=&map[sd->bl.m];
+ if(strcmp(m->save.map,"SavePoint")==0)
+ memcpy(&sd->status.last_point,&sd->status.save_point,sizeof(sd->status.last_point));
+ else
+ memcpy(&sd->status.last_point,&m->save,sizeof(sd->status.last_point));
+ }
}
//�}�i?�|�C���g���v���X�������ꍇ0��
@@ -585,10 +587,8 @@ int pc_isequip(struct map_session_data *sd,int n)
//�����j��
int pc_break_equip(struct map_session_data *sd, unsigned short where)
{
- struct item_data* item;
int i;
int sc;
- char output[255];
nullpo_retr(-1, sd);
if(sd->unbreakable_equip & where)
@@ -616,13 +616,12 @@ int pc_break_equip(struct map_session_data *sd, unsigned short where)
for (i=0;i<MAX_INVENTORY;i++) {
if (sd->status.inventory[i].equip & where &&
- !sd->status.inventory[i].attribute == 1) {
- item=sd->inventory_data[i];
+ sd->status.inventory[i].attribute != 1) {
sd->status.inventory[i].attribute = 1;
pc_unequipitem(sd,i,3);
- sprintf(output, "%s has broken.",item->jname);
+ sprintf(tmp_output, "%s has broken.",sd->inventory_data[i]->jname);
clif_emotion(&sd->bl,23);
- clif_displaymessage(sd->fd, output);
+ clif_displaymessage(sd->fd, tmp_output);
clif_equiplist(sd);
break;
}
@@ -6823,7 +6822,7 @@ static int pc_autosave_sub(struct map_session_data *sd,va_list ap)
Assert((sd->status.pet_id == 0 || sd->pd == 0) || sd->pd->msd == sd);
- if(save_flag==0 && sd->fd>last_save_fd){
+ if(save_flag==0 && sd->fd>last_save_fd && !sd->state.waitingdisconnect){
struct guild_castle *gc=NULL;
int i;
// if(battle_config.save_log)
diff --git a/src/map/script.c b/src/map/script.c
index d0fc773b2..201635b8f 100644
--- a/src/map/script.c
+++ b/src/map/script.c
@@ -1725,7 +1725,7 @@ int buildin_menu(struct script_state *st)
conv_str(st,& (st->stack->stack_data[i]));
len+=strlen(st->stack->stack_data[i].u.str)+1;
}
- buf=(char *)aCallocA(len,sizeof(char));
+ buf=(char *)aCallocA(len+1,sizeof(char));
buf[0]=0;
for(i=st->start+2,len=0;i<st->end;i+=2){
strcat(buf,st->stack->stack_data[i].u.str);
@@ -6326,7 +6326,7 @@ int buildin_select(struct script_state *st)
conv_str(st,& (st->stack->stack_data[i]));
len+=strlen(st->stack->stack_data[i].u.str)+1;
}
- buf=(char *)aCalloc(len,sizeof(char));
+ buf=(char *)aCalloc(len+1,sizeof(char));
buf[0]=0;
for(i=st->start+2,len=0;i<st->end;i++){
strcat(buf,st->stack->stack_data[i].u.str);
@@ -7652,8 +7652,8 @@ int script_config_read(char *cfgName)
script_config.warn_cmd_no_comma=1;
script_config.warn_func_mismatch_paramnum=1;
script_config.warn_cmd_mismatch_paramnum=1;
- script_config.check_cmdcount=8192;
- script_config.check_gotocount=512;
+ script_config.check_cmdcount=65535;
+ script_config.check_gotocount=2048;
script_config.die_event_name = (char *)aCallocA(24,sizeof(char));
script_config.kill_event_name = (char *)aCallocA(24,sizeof(char));
diff --git a/src/map/skill.c b/src/map/skill.c
index c693ec2c1..a8e158c71 100644
--- a/src/map/skill.c
+++ b/src/map/skill.c
@@ -1113,7 +1113,7 @@ int skill_blown( struct block_list *src, struct block_list *target,int count)
{
int dx=0,dy=0,nx,ny;
int x=target->x,y=target->y;
- int ret,prev_state=MS_IDLE;
+ int dir,ret,prev_state=MS_IDLE;
int moveblock;
struct map_session_data *sd=NULL;
struct mob_data *md=NULL;
@@ -1133,16 +1133,15 @@ int skill_blown( struct block_list *src, struct block_list *target,int count)
su=(struct skill_unit *)target;
}else return 0;
- if(!(count&0x10000)){ /* �w��Ȃ��Ȃ�ʒu�֌W������������߂� */
- dx=target->x-src->x; dx=(dx>0)?1:((dx<0)?-1: 0);
- dy=target->y-src->y; dy=(dy>0)?1:((dy<0)?-1: 0);
- }
- if(dx==0 && dy==0){
- int dir=status_get_dir(target);
- if(dir>=0 && dir<8){
- dx=-dirx[dir];
- dy=-diry[dir];
- }
+ if (count&0xf00000)
+ dir = (count>>20)&0xf;
+ else if (count&0x10000 || (target->x==src->x && target->y==src->y))
+ dir = status_get_dir(target);
+ else
+ dir = map_calc_dir(target,src->x,src->y);
+ if (dir>=0 && dir<8){
+ dx = -dirx[dir];
+ dy = -diry[dir];
}
ret=path_blownpos(target->m,x,y,dx,dy,count&0xffff);
@@ -2093,10 +2092,11 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s
case AS_SONICBLOW: /* �\�j�b�N�u��? */
case KN_PIERCE: /* �s�A?�X */
case KN_SPEARBOOMERANG: /* �X�s�A�u?������ */
+ case KN_BRANDISHSPEAR: /* �u�����f�B�b�V���X�s�A */
case TF_POISON: /* �C���x�i�� */
case TF_SPRINKLESAND: /* ���܂� */
case AC_CHARGEARROW: /* �`��?�W�A��? */
- case KN_SPEARSTAB: /* �X�s�A�X�^�u */
+// case KN_SPEARSTAB: /* �X�s�A�X�^�u */
case RG_RAID: /* �T�v���C�Y�A�^�b�N */
case RG_INTIMIDATE: /* �C���e�B�~�f�C�g */
case BA_MUSICALSTRIKE: /* �~��?�W�J���X�g���C�N */
@@ -2135,6 +2135,10 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s
case NPC_DARKNESSATTACK:
case NPC_TELEKINESISATTACK:
case NPC_UNDEADATTACK:
+ case NPC_BREAKARMOR:
+ case NPC_BREAKWEAPON:
+ case NPC_BREAKHELM:
+ case NPC_BREAKSHIELD:
case LK_AURABLADE: /* �I?���u��?�h */
case LK_SPIRALPIERCE: /* �X�p�C�����s�A?�X */
case LK_HEADCRUSH: /* �w�b�h�N���b�V�� */
@@ -2145,6 +2149,7 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s
case CG_ARROWVULCAN: /* �A��?�o���J�� */
case ASC_BREAKER: /* �\�E���u��?�J? */
case HW_MAGICCRASHER: /* �}�W�b�N�N���b�V��? */
+ case ASC_METEORASSAULT: /* ���e�I�A�T���g */
case ITM_TOMAHAWK:
skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
break;
@@ -2188,22 +2193,7 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s
case SN_FALCONASSAULT: /* �t�@���R���A�T���g */
skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,flag);
break;
- case KN_BRANDISHSPEAR: /* �u�����f�B�b�V���X�s�A */
- {
- struct mob_data *md = (struct mob_data *)bl;
- nullpo_retr(1, md);
- skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
- if(md->hp > 0){
- skill_blown(src,bl,skill_get_blewcount(skillid,skilllv));
- if(bl->type == BL_MOB)
- clif_fixmobpos((struct mob_data *)bl);
- else if(bl->type == BL_PET)
- clif_fixpetpos((struct pet_data *)bl);
- else
- clif_fixpos(bl);
- }
- }
- break;
+
case RG_BACKSTAP: /* �o�b�N�X�^�u */
{
int dir = map_calc_dir(src,bl->x,bl->y),t_dir = status_get_dir(bl);
@@ -2310,21 +2300,14 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s
break;
/* ����n��?�U?�X�L�� */
case AC_SHOWER: /* �A��?�V����? */
-// case SM_MAGNUM: /* �}�O�i���u���C�N */
case AS_GRIMTOOTH: /* �O�����g�D?�X */
case MC_CARTREVOLUTION: /* �J?�g�����H����?�V���� */
case NPC_SPLASHATTACK: /* �X�v���b�V���A�^�b�N */
- case ASC_METEORASSAULT: /* ���e�I�A�T���g */
case AS_SPLASHER: /* [Valaris] */
if(flag&1){
/* �•ʂɃ_��?�W��?���� */
if(bl->id!=skill_area_temp[1]){
int dist=0;
- //if(skillid==SM_MAGNUM){ /* �}�O�i���u���C�N�Ȃ璆�S����̋������v�Z */
- // int dx=abs( bl->x - skill_area_temp[2] );
- // int dy=abs( bl->y - skill_area_temp[3] );
- // dist=((dx>dy)?dx:dy);
- //}
skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,
0x0500|dist );
if (bl->type == BL_MOB && skillid == AS_GRIMTOOTH) {
@@ -2333,22 +2316,20 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s
status_change_start(bl,SC_SLOWDOWN,0,0,0,0,1000,0);
}
}
- }else{
- int ar=1;
- int x=bl->x,y=bl->y;
- /*if( skillid==SM_MAGNUM){
- x=src->x;
- y=src->y;
- }else*/
- if(skillid==AC_SHOWER || skillid==ASC_METEORASSAULT) /* �A��?�V����?�A���e�I�A�T���g��?5*5 */
- ar=2;
- else if(skillid==AS_SPLASHER) /* �x�i���X�v���b�V��?��?3*3 */
- ar=1;
- else if(skillid==NPC_SPLASHATTACK) /* �X�v���b�V���A�^�b�N�͔�?7*7 */
- ar=3;
-
- if (skillid == ASC_METEORASSAULT)
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ } else {
+ int ar;
+ int x = bl->x, y = bl->y;
+ switch (skillid) {
+ case AC_SHOWER:
+ ar=2;
+ break;
+ case NPC_SPLASHATTACK:
+ ar=3;
+ break;
+ default:
+ ar=1;
+ break;
+ }
skill_area_temp[1]=bl->id;
skill_area_temp[2]=x;
@@ -2382,11 +2363,10 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s
if(bl->id!=skill_area_temp[1])
skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,0x0500);
} else {
-/* int damage;
- map_freeblock_lock();
- damage = skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,0);
- if(damage > 0) {*/
int i,c; /* ���l���畷���������Ȃ̂ŊԈ���Ă�”\���偕?����?���������� */
+ /* �܂��^�[�Q�b�g�ɍU���������� */
+ if (!skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,0))
+ break;
c = skill_get_blewcount(skillid,skilllv);
if(map[bl->m].flag.gvg) c = 0;
for(i=0;i<c;i++){
@@ -2405,20 +2385,36 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s
if(skill_area_temp[0]>1) break;
}
skill_area_temp[1]=bl->id;
- skill_area_temp[2]=bl->x;
- skill_area_temp[3]=bl->y;
- skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,0);
-
/* ���̌�^?�Q�b�g�ȊO�̔�??�̓G�S?��?�����s�� */
map_foreachinarea(skill_area_sub,
bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0,
src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
skill_castend_damage_id);
-/* battle_damage(src,bl,damage,1);
- if(rdamage > 0)
- battle_damage(bl,src,rdamage,0);
+ }
+ break;
+
+ case KN_SPEARSTAB: /* �X�s�A�X�^�u */
+ if(flag&1){
+ /* �•ʂɃ_���[�W��^���� */
+ if (bl->id==skill_area_temp[1])
+ break;
+ if (skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,0x0500))
+ skill_blown(src,bl,skill_area_temp[2]);
+ } else {
+ int x=bl->x,y=bl->y,i,dir;
+ /* �܂��^�[�Q�b�g�ɍU���������� */
+ dir = map_calc_dir(bl,src->x,src->y);
+ skill_area_temp[1] = bl->id;
+ skill_area_temp[2] = skill_get_blewcount(skillid,skilllv)|dir<<20;
+ if (skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,0))
+ skill_blown(src,bl,skill_area_temp[2]);
+ for (i=0;i<4;i++) {
+ map_foreachinarea(skill_area_sub,bl->m,x,y,x,y,0,
+ src,skillid,skilllv,tick,flag|BCT_ENEMY|1,
+ skill_castend_damage_id);
+ x += dirx[dir];
+ y += diry[dir];
}
- map_freeblock_unlock();*/
}
break;
@@ -2441,12 +2437,10 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s
case WZ_EARTHSPIKE: /* �A�[�X�X�p�C�N */
case AL_HEAL: /* �q�[�� */
case AL_HOLYLIGHT: /* �z�[���[���C�g */
-// case MG_FROSTDIVER: /* �t���X�g�_�C�o�[ */
case WZ_JUPITEL: /* ���s�e���T���_�[ */
case NPC_DARKJUPITEL: /*���s�e��*/
case NPC_MAGICALATTACK: /* MOB:���@��?�U? */
case PR_ASPERSIO: /* �A�X�y���V�I */
-// case HW_NAPALMVULCAN: /* �i�p�[���o���J�� */
skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
break;
@@ -2465,7 +2459,8 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s
}
damage = skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
if (status_get_hp(bl) > 0 && damage > 0 && rand()%100 < rate) {
- status_change_start(bl,SC_FREEZE,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
+ status_change_start(bl,SC_FREEZE,skilllv,0,0,0,
+ skill_get_time2(skillid,skilllv)*(1-sc_def_mdef/100),0);
} else if (sd) {
clif_skill_fail(sd,skillid,0,0);
}
@@ -2631,11 +2626,11 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s
clif_skill_nodamage(src,bl,skillid,skilllv,1);
if (skilllv == 5)
skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,0 );
- if (bl->type == BL_PC) {
+ if (bl->type == BL_PC && (map[src->m].flag.pvp || map[src->m].flag.gvg)) {
struct map_session_data *tsd = (struct map_session_data *)bl;
if (tsd) {
tsd->status.sp = 0;
- clif_updatestatus((struct map_session_data *)bl,SP_SP);
+ clif_updatestatus(tsd,SP_SP);
}
}
} else {
@@ -3162,6 +3157,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
clif_skill_nodamage(src,bl,skillid,skilllv,1);
status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
break;
+
case LK_TENSIONRELAX: /* �e���V���������b�N�X */
clif_skill_nodamage(src,bl,skillid,skilllv,1);
pc_setsit(sd);
@@ -3173,9 +3169,11 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
//sd->status.hp = sd->status.max_hp * 3;
break;
+
case MC_CHANGECART:
clif_skill_nodamage(src,bl,skillid,skilllv,1);
break;
+
case AC_CONCENTRATION: /* �W���͌��� */
{
int range = 1;
@@ -3186,6 +3184,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
src,SkillStatusChangeTable[skillid],tick);
}
break;
+
case SM_PROVOKE: /* �v���{�b�N */
{
struct status_change *sc_data = status_get_sc_data(bl);
@@ -3347,19 +3346,21 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
case RG_RAID: /* �T�v���C�Y�A�^�b�N */
clif_skill_nodamage(src,bl,skillid,skilllv,1);
- {
- int x=bl->x,y=bl->y;
- skill_area_temp[1]=bl->id;
- skill_area_temp[2]=x;
- skill_area_temp[3]=y;
- map_foreachinarea(skill_area_sub,
- bl->m,x-1,y-1,x+1,y+1,0,
- src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
- skill_castend_damage_id);
- }
+ map_foreachinarea(skill_area_sub,
+ bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0,
+ src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
+ skill_castend_damage_id);
status_change_end(src, SC_HIDING, -1); // �n�C�f�B���O����
break;
+ case ASC_METEORASSAULT: /* ���e�I�A�T���g */
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ map_foreachinarea(skill_area_sub,
+ bl->m,bl->x-2,bl->y-2,bl->x+2,bl->y+2,0,
+ src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
+ skill_castend_damage_id);
+ break;
+
case KN_BRANDISHSPEAR: /*�u�����f�B�b�V���X�s�A*/
{
int c,n=4,ar;
@@ -3769,35 +3770,36 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
case ST_FULLSTRIP: // Celest
{
struct status_change *tsc_data = status_get_sc_data(bl);
- int scid, equip, strip_fix, strip_num = 0;
+ int scid, cp_scid = 0, equip, strip_fix, strip_num = 0;
scid = SkillStatusChangeTable[skillid];
switch (skillid) {
case RG_STRIPWEAPON:
equip = EQP_WEAPON;
+ cp_scid = SC_CP_WEAPON;
break;
case RG_STRIPSHIELD:
equip = EQP_SHIELD;
+ cp_scid = SC_CP_SHIELD;
break;
case RG_STRIPARMOR:
equip = EQP_ARMOR;
+ cp_scid = SC_CP_ARMOR;
break;
case RG_STRIPHELM:
equip = EQP_HELM;
+ cp_scid = SC_CP_HELM;
break;
case ST_FULLSTRIP:
equip = EQP_WEAPON | EQP_SHIELD | EQP_ARMOR | EQP_HELM;
strip_num = 3;
break;
default:
+ map_freeblock_unlock();
return 1;
}
- if (tsc_data) {
- if (tsc_data[scid].timer != -1)
- break;
- if (tsc_data[skillid - RG_STRIPWEAPON + SC_CP_WEAPON].timer != -1)
+ if (tsc_data && (tsc_data[scid].timer != -1 || tsc_data[cp_scid].timer != -1))
break;
- }
if (dstsd && dstsd->unstripable_equip & equip)
break;
@@ -3810,7 +3812,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
if (dstsd) {
for (i=0;i<MAX_INVENTORY;i++) {
- if (dstsd->status.inventory[i].equip && dstsd->status.inventory[i].equip & equip){
+ if (dstsd->status.inventory[i].equip && (dstsd->status.inventory[i].equip & equip)){
pc_unequipitem(dstsd,i,3);
if ((--strip_num) <= 0)
break;
@@ -4159,28 +4161,31 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
// Equipment breaking monster skills [Celest]
case NPC_BREAKWEAPON:
clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(bl->type == BL_PC && rand()%100 < skilllv && battle_config.equipment_breaking)
- pc_breakweapon((struct map_session_data *)bl);
+ if(bl->type == BL_PC && battle_config.equipment_breaking)
+ pc_breakweapon(dstsd);
break;
case NPC_BREAKARMOR:
clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(bl->type == BL_PC && rand()%100 < skilllv && battle_config.equipment_breaking)
- pc_breakarmor((struct map_session_data *)bl);
+ if(bl->type == BL_PC && battle_config.equipment_breaking)
+ pc_breakarmor(dstsd);
break;
case NPC_BREAKHELM:
clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(bl->type == BL_PC && rand()%100 < skilllv && battle_config.equipment_breaking)
- // since we don't have any code for helm breaking yet...
- pc_breakweapon((struct map_session_data *)bl);
+ if(bl->type == BL_PC && battle_config.equipment_breaking)
+ pc_breakhelm(dstsd);
break;
case NPC_BREAKSHIELD:
clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(bl->type == BL_PC && rand()%100 < skilllv && battle_config.equipment_breaking)
- // since we don't have any code for helm breaking yet...
- pc_breakweapon((struct map_session_data *)bl);
+ if(bl->type == BL_PC && battle_config.equipment_breaking)
+ pc_breakshield(dstsd);
+ break;
+
+ case NPC_EXPLOSIONSPIRITS: //NPC�����g��
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ status_change_start(bl,SC_EXPLOSIONSPIRITS,skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
break;
case WE_MALE: /* �N�����͌��� */
@@ -4204,10 +4209,12 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
if(sd && dstsd){
if((dstsd = pc_get_partner(sd)) == NULL){
clif_skill_fail(sd,skillid,0,0);
+ map_freeblock_unlock();
return 0;
}
if(map[sd->bl.m].flag.nomemo || map[sd->bl.m].flag.nowarpto || map[dstsd->bl.m].flag.nowarp){
clif_skill_teleportmessage(sd,1);
+ map_freeblock_unlock();
return 0;
}
skill_unitsetting(src,skillid,skilllv,sd->bl.x,sd->bl.y,0);
@@ -4307,8 +4314,10 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
break;
case AS_SPLASHER: /* �x�i���X�v���b�V��? */
- if((double)status_get_max_hp(bl)*2/3 < status_get_hp(bl)) //HP��2/3�ȏ�?���Ă����玸�s
+ if((double)status_get_max_hp(bl)*2/3 < status_get_hp(bl)) { //HP��2/3�ȏ�?���Ă����玸�s
+ map_freeblock_unlock();
return 1;
+ }
clif_skill_nodamage(src,bl,skillid,skilllv,1);
status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,skillid,src->id,skill_get_time(skillid,skilllv),1000,0 );
break;
diff --git a/src/map/status.c b/src/map/status.c
index 50fa778e1..f13694145 100644
--- a/src/map/status.c
+++ b/src/map/status.c
@@ -720,7 +720,7 @@ int status_calc_pc(struct map_session_data* sd,int first)
sd->paramb[1]+= (sd->status.agi+sd->paramb[1]+sd->parame[1]-sd->paramcard[1])*(2+sd->sc_data[SC_CONCENTRATE].val1)/100;
sd->paramb[4]+= (sd->status.dex+sd->paramb[4]+sd->parame[4]-sd->paramcard[4])*(2+sd->sc_data[SC_CONCENTRATE].val1)/100;
}
- if(sd->sc_data[SC_INCREASEAGI].timer!=-1 && sd->sc_data[SC_QUAGMIRE].timer == -1 && sd->sc_data[SC_DONTFORGETME].timer == -1){ // ���x?��
+ if(sd->sc_data[SC_INCREASEAGI].timer!=-1){ // ���x?��
sd->paramb[1]+= 2+sd->sc_data[SC_INCREASEAGI].val1;
sd->speed -= sd->speed *25/100;
}
@@ -1021,13 +1021,12 @@ int status_calc_pc(struct map_session_data* sd,int first)
//Flee�㏸
if( (skill=pc_checkskill(sd,TF_MISS))>0 ){ // ���?��
- if(sd->status.class_==6||sd->status.class_==4007 || sd->status.class_==23){
+ if(sd->status.class_==6||sd->status.class_==4007 || sd->status.class_==23)
sd->flee += skill*3;
- }
- if(sd->status.class_==12||sd->status.class_==17||sd->status.class_==4013||sd->status.class_==4018)
+ else if(sd->status.class_==12||sd->status.class_==17||sd->status.class_==4013||sd->status.class_==4018)
sd->flee += skill*4;
if(sd->status.class_==12||sd->status.class_==4013)
- sd->speed -= sd->speed *(skill*1.5)/100;
+ sd->speed -= (short)(skill*1.5/100 * DEFAULT_WALK_SPEED);
}
if( (skill=pc_checkskill(sd,MO_DODGE))>0 ) // ���؂�
sd->flee += (skill*3)>>1;
@@ -1090,7 +1089,7 @@ int status_calc_pc(struct map_session_data* sd,int first)
}
if(sd->sc_data[SC_VOLCANO].timer!=-1 && sd->def_ele==3){ // �{���P?�m
- sd->watk += sd->sc_data[SC_VIOLENTGALE].val3;
+ sd->watk += sd->sc_data[SC_VOLCANO].val3;
}
if(sd->sc_data[SC_SIGNUMCRUCIS].timer!=-1)
@@ -1663,12 +1662,16 @@ int status_get_max_hp(struct block_list *bl)
max_hp += (md->level - mob_db[md->class_].lv) * status_get_vit(bl);
if(mob_db[md->class_].mexp > 0) {
- if(battle_config.mvp_hp_rate != 100)
- max_hp = (max_hp * battle_config.mvp_hp_rate)/100;
+ if(battle_config.mvp_hp_rate != 100) {
+ double hp = (double)max_hp * battle_config.mvp_hp_rate / 100.0;
+ max_hp = (hp > 0x7FFFFFFF ? 0x7FFFFFFF : (int)hp);
+ }
}
else {
- if(battle_config.monster_hp_rate != 100)
- max_hp = (max_hp * battle_config.monster_hp_rate)/100;
+ if(battle_config.mvp_hp_rate != 100) {
+ double hp = (double)max_hp * battle_config.mvp_hp_rate / 100.0;
+ max_hp = (hp > 0x7FFFFFFF ? 0x7FFFFFFF : (int)hp);
+ }
}
}
else if(bl->type == BL_PET) {
@@ -2007,6 +2010,8 @@ int status_get_hit(struct block_list *bl)
sc_data[SC_GOSPEL].val4 == BCT_PARTY &&
sc_data[SC_GOSPEL].val3 == 14)
hit += hit*5/100;
+ if(sc_data[SC_EXPLOSIONSPIRITS].timer!=-1)
+ hit += 20*sc_data[SC_EXPLOSIONSPIRITS].val1;
}
}
if(hit < 1) hit = 1;
@@ -2130,6 +2135,10 @@ int status_get_atk(struct block_list *bl)
atk -= atk*25/100;
if(sc_data[SC_CONCENTRATION].timer!=-1) //�R���Z���g���[�V����
atk += atk*(5*sc_data[SC_CONCENTRATION].val1)/100;
+ if(sc_data[SC_EXPLOSIONSPIRITS].timer!=-1)
+ atk += (1000*sc_data[SC_EXPLOSIONSPIRITS].val1);
+ if(sc_data[SC_STRIPWEAPON].timer!=-1)
+ atk -= atk*10/100;
if(sc_data[SC_GOSPEL].timer!=-1) {
if (sc_data[SC_GOSPEL].val4 == BCT_PARTY &&
@@ -2191,6 +2200,8 @@ int status_get_atk2(struct block_list *bl)
atk2 = atk2*sc_data[SC_STRIPWEAPON].val2/100;
if(sc_data[SC_CONCENTRATION].timer!=-1) //�R���Z���g���[�V����
atk2 += atk2*(5*sc_data[SC_CONCENTRATION].val1)/100;
+ if(sc_data[SC_EXPLOSIONSPIRITS].timer!=-1)
+ atk2 += (1000*sc_data[SC_EXPLOSIONSPIRITS].val1);
}
if(atk2 < 0) atk2 = 0;
return atk2;
@@ -2471,8 +2482,11 @@ int status_get_speed(struct block_list *bl)
if(sc_data) {
//���x��������25%���Z
- if(sc_data[SC_INCREASEAGI].timer!=-1 && sc_data[SC_DONTFORGETME].timer == -1)
+ if(sc_data[SC_INCREASEAGI].timer!=-1)
speed -= speed*25/100;
+ //�E�B���h�E�H�[�N����Lv*2%���Z
+ else if(sc_data[SC_WINDWALK].timer!=-1)
+ speed -= (speed*(sc_data[SC_WINDWALK].val1*2))/100;
//���x��������25%���Z
if(sc_data[SC_DECREASEAGI].timer!=-1)
speed = speed*125/100;
@@ -2495,9 +2509,6 @@ int status_get_speed(struct block_list *bl)
//�􂢎���450���Z
if(sc_data[SC_CURSE].timer!=-1)
speed = speed + 450;
- //�E�B���h�E�H�[�N����Lv*2%���Z
- if(sc_data[SC_WINDWALK].timer!=-1 && sc_data[SC_INCREASEAGI].timer==-1)
- speed -= (speed*(sc_data[SC_WINDWALK].val1*2))/100;
if(sc_data[SC_SLOWDOWN].timer!=-1)
speed = speed*150/100;
if(sc_data[SC_SPEEDUP0].timer!=-1)
@@ -3050,6 +3061,13 @@ int status_change_start(struct block_list *bl,int type,int val1,int val2,int val
if(type==SC_FREEZE && undead_flag && !(flag&1))
return 0;
+ if (type==SC_BLESSING && (bl->type==BL_PC || (!undead_flag && race!=6))) {
+ if (sc_data[SC_CURSE].timer!=-1)
+ status_change_end(bl,SC_CURSE,-1);
+ if (sc_data[SC_STONE].timer!=-1 && sc_data[SC_STONE].val2==0)
+ status_change_end(bl,SC_STONE,-1);
+ }
+
if((type == SC_ADRENALINE || type == SC_WEAPONPERFECTION || type == SC_OVERTHRUST) &&
sc_data[type].timer != -1 && sc_data[type].val2 && !val2)
return 0;
@@ -3066,15 +3084,25 @@ int status_change_start(struct block_list *bl,int type,int val1,int val2,int val
if(sc_data[type].timer != -1){ /* ���łɓ����ُ�ɂȂ��Ă���ꍇ�^�C�}���� */
if(sc_data[type].val1 > val1 && type != SC_COMBO && type != SC_DANCING && type != SC_DEVOTION &&
type != SC_SPEEDPOTION0 && type != SC_SPEEDPOTION1 && type != SC_SPEEDPOTION2 && type != SC_SPEEDPOTION3
- && type != SC_ATKPOT && type != SC_MATKPOT) // added atk and matk potions [Valaris]
+ && type != SC_ATKPOT && type != SC_MATKPOT) // added atk and matk potions [Valaris]
return 0;
+
if ((type >=SC_STAN && type <= SC_BLIND) || type == SC_DPOISON)
return 0;/* ?���������ł��Ȃ�?�Ԉُ�ł��鎞��?�Ԉُ���s��Ȃ� */
+
(*sc_count)--;
delete_timer(sc_data[type].timer, status_change_timer);
sc_data[type].timer = -1;
}
+ // �N�A�O�}�C�A/����Y��Ȃ��Œ��͖����ȃX�L��
+ if ((sc_data[SC_QUAGMIRE].timer!=-1 || sc_data[SC_DONTFORGETME].timer!=-1) &&
+ (type==SC_CONCENTRATE || type==SC_INCREASEAGI ||
+ type==SC_TWOHANDQUICKEN || type==SC_SPEARSQUICKEN ||
+ type==SC_ADRENALINE || type==SC_LOUD || type==SC_TRUESIGHT ||
+ type==SC_WINDWALK || type==SC_CARTBOOST || type==SC_ASSNCROS))
+ return 0;
+
switch(type){ /* �ُ�̎�ނ��Ƃ�?�� */
case SC_PROVOKE: /* �v���{�b�N */
calc_flag = 1;
@@ -3093,23 +3121,13 @@ int status_change_start(struct block_list *bl,int type,int val1,int val2,int val
status_change_start(bl,SC_PROVOKE,10,1,0,0,0,0);
}
break;
+
case SC_CONCENTRATE: /* �W���͌��� */
- calc_flag = 1;
- break;
case SC_BLESSING: /* �u���b�V���O */
- {
- if(bl->type == BL_PC || (!undead_flag && race != 6)) {
- if(sc_data[SC_CURSE].timer!=-1 )
- status_change_end(bl,SC_CURSE,-1);
- if(sc_data[SC_STONE].timer!=-1 && sc_data[SC_STONE].val2 == 0)
- status_change_end(bl,SC_STONE,-1);
- }
- calc_flag = 1;
- }
- break;
case SC_ANGELUS: /* �A���[���X */
calc_flag = 1;
break;
+
case SC_INCREASEAGI: /* ���x�㏸ */
calc_flag = 1;
if(sc_data[SC_DECREASEAGI].timer!=-1 )
@@ -3151,16 +3169,21 @@ int status_change_start(struct block_list *bl,int type,int val1,int val2,int val
case SC_ADRENALINE: /* �A�h���i�������b�V�� */
if(sc_data[SC_DECREASEAGI].timer!=-1)
return 0;
+ if(bl->type == BL_PC)
+ if(pc_checkskill(sd,BS_HILTBINDING)>0)
+ tick *= 1.1;
calc_flag = 1;
break;
case SC_WEAPONPERFECTION: /* �E�F�|���p?�t�F�N�V���� */
- // Lasting time penalties have been removed on sakray as of 12/14 [celest]
- //if(battle_config.party_skill_penalty && !val2) tick /= 5;
+ if(bl->type == BL_PC)
+ if(pc_checkskill(sd,BS_HILTBINDING)>0)
+ tick *= 1.1;
break;
case SC_OVERTHRUST: /* �I?�o?�X���X�g */
+ if(bl->type == BL_PC)
+ if(pc_checkskill(sd,BS_HILTBINDING)>0)
+ tick *= 1.1;
*opt3 |= 2;
- // Lasting time penalties have been removed on sakray as of 12/14 [celest]
- //if(battle_config.party_skill_penalty && !val2) tick /= 10;
break;
case SC_MAXIMIZEPOWER: /* �}�L�V�}�C�Y�p��?(SP��1���鎞��,val2�ɂ�) */
if(bl->type == BL_PC)
@@ -3624,10 +3647,9 @@ int status_change_start(struct block_list *bl,int type,int val1,int val2,int val
break;
case SC_TENSIONRELAX: /* �e���V���������b�N�X */
- calc_flag = 1;
if(bl->type == BL_PC) {
tick = 10000;
- }
+ } else return 0;
break;
case SC_AURABLADE: /* �I?���u��?�h */
@@ -3746,7 +3768,7 @@ int status_change_start(struct block_list *bl,int type,int val1,int val2,int val
break;
case SC_MEMORIZE: /* �������C�Y */
- val2 = 3; //3��r����1/3�ɂ���
+ val2 = 5; //��r����1/3�ɂ���
break;
case SC_SPLASHER: /* �x�i���X�v���b�V��? */
@@ -4001,10 +4023,7 @@ int status_change_end( struct block_list* bl , int type,int tid )
case SC_APPLEIDUN: /* �C�h�D���̗ь� */
case SC_RIDING:
case SC_BLADESTOP_WAIT:
- case SC_AURABLADE: /* �I?���u��?�h */
- case SC_PARRYING: /* �p���C���O */
case SC_CONCENTRATION: /* �R���Z���g��?�V���� */
- case SC_TENSIONRELAX: /* �e���V���������b�N�X */
case SC_ASSUMPTIO: /* �A�V�����v�e�B�I */
case SC_WINDWALK: /* �E�C���h�E�H?�N */
case SC_TRUESIGHT: /* �g�D��?�T�C�g */
@@ -4015,6 +4034,7 @@ int status_change_end( struct block_list* bl , int type,int tid )
case SC_MATKPOT: /* magic attack potion [Valaris] */
case SC_WEDDING: //�����p(�����ߏւɂȂ���?���̂�?���Ƃ�)
case SC_MELTDOWN: /* �����g�_�E�� */
+ case SC_MINDBREAKER: /* �}�C���h�u���[�J�[ */
// Celest
case SC_EDP:
case SC_SLOWDOWN: