diff options
-rw-r--r-- | Changelog-SVN.txt | 18 | ||||
-rw-r--r-- | Readme-jap | 428 | ||||
-rw-r--r-- | conf-tmpl/battle_athena.conf | 11 | ||||
-rw-r--r-- | conf-tmpl/script_athena.conf | 21 | ||||
-rw-r--r-- | db/skill_db.txt | 22 | ||||
-rw-r--r-- | src/common/core.c | 31 | ||||
-rw-r--r-- | src/common/db.c | 106 | ||||
-rw-r--r-- | src/common/db.h | 12 | ||||
-rw-r--r-- | src/map/atcommand.c | 43 | ||||
-rw-r--r-- | src/map/atcommand.h | 1 | ||||
-rw-r--r-- | src/map/battle.c | 68 | ||||
-rw-r--r-- | src/map/battle.h | 2 | ||||
-rw-r--r-- | src/map/chrif.c | 2 | ||||
-rw-r--r-- | src/map/guild.c | 34 | ||||
-rw-r--r-- | src/map/guild.h | 1 | ||||
-rw-r--r-- | src/map/map.c | 162 | ||||
-rw-r--r-- | src/map/map.h | 8 | ||||
-rw-r--r-- | src/map/mob.c | 17 | ||||
-rw-r--r-- | src/map/npc.c | 6 | ||||
-rw-r--r-- | src/map/path.c | 23 | ||||
-rw-r--r-- | src/map/pc.c | 43 | ||||
-rw-r--r-- | src/map/script.c | 8 | ||||
-rw-r--r-- | src/map/skill.c | 201 | ||||
-rw-r--r-- | src/map/status.c | 94 |
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: |