summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog-SVN.txt17
-rw-r--r--Readme-jap402
-rw-r--r--conf-tmpl/atcommand_athena.conf12
-rw-r--r--conf-tmpl/msg_athena.conf4
-rw-r--r--db/packet_db.txt2
-rw-r--r--db/skill_cast_db.txt6
-rw-r--r--db/skill_db.txt24
-rw-r--r--db/skill_require_db.txt2
-rw-r--r--db/skill_unit_db.txt2
-rw-r--r--src/map/atcommand.c71
-rw-r--r--src/map/atcommand.h4
-rw-r--r--src/map/battle.c4
-rw-r--r--src/map/clif.c56
-rw-r--r--src/map/guild.c20
-rw-r--r--src/map/mail.c39
-rw-r--r--src/map/map.c76
-rw-r--r--src/map/map.h15
-rw-r--r--src/map/mob.c76
-rw-r--r--src/map/mob.h1
-rw-r--r--src/map/party.c4
-rw-r--r--src/map/pc.c157
-rw-r--r--src/map/pc.h4
-rw-r--r--src/map/pet.c2
-rw-r--r--src/map/pet.h1
-rw-r--r--src/map/skill.c658
-rw-r--r--src/map/skill.h6
-rw-r--r--src/map/status.c11
-rw-r--r--src/map/status.h1
28 files changed, 1156 insertions, 521 deletions
diff --git a/Changelog-SVN.txt b/Changelog-SVN.txt
index cf19bf917..316f0d8c3 100644
--- a/Changelog-SVN.txt
+++ b/Changelog-SVN.txt
@@ -1,6 +1,23 @@
Date Added
+03/30
+ * updated map server to jA1137~1159
+ - Added @reloadatcommand, @reloadbattleconf, @reloadstatusdb, @reloadpcdb
+
+ (Note: You should copy the latest msg_athena.conf from conf-tmpl and replace
+ your current one EVERYTIME it's updated to prevent it from crashing when it
+ can't find the newer messages!)
+
+ - Updated packet DB to support /item and /monster
+ - Added pc_remove_map()
+ - Added 2 new mobs skills: NPC_RUNAWAY and RECALL
+ - Updated BioCannibalize
+ - Updated Hammerfall, Meteor Shower and Lord of Vermillion -- when MvP's
+ cast them they should have much more range
+ - Some other skill tweaks
+ * Some tidying up in mob.c and skill.c [celest]
+
03/29
* Please make sure to use the stable/sql-files/upgrade_svn1315.sql to
upgrade your mysql as a result of the new adoption system. Thank you
diff --git a/Readme-jap b/Readme-jap
index 3bc55cedd..f43c0499c 100644
--- a/Readme-jap
+++ b/Readme-jap
@@ -1,4 +1,406 @@
--------------------
+//1162 by pizza
+�E�X�p�C�����s�A�[�X�E�\�E���u���[�J�[�E�����E�t�@���R���A�T���g�ɂ‚��Ė{�I�����ɏC��
+
+ (db)
+ skill_db.txt
+ �X�p�C�����s�A�[�X�E�\�E���u���[�J�[�̎˒�
+ �\�E���u���[�J�[���r���W�Q��
+ skill_cast_db.txt
+ �\�E���u���[�J�[�̉r������
+
+ (src/map)
+ battle.c
+ �����E�t�@���R���A�T���g�̌v�Z��
+ �X�p�C�����s�A�[�X���j���}�Ŗ�����
+
+--------------------
+//1161 by Nameless
+
+�E�o�C�I�v�����g�ɂ�鏢��mob��ID�ƃX�L����{�I�����ɏC��
+�@���Ăяo���鐔�ɂ‚��Ă͂܂��������c
+
+ (db)
+ mob_avail.txt
+ �N���C�A���g�ɂ���Ĕ�������”\���̂���O������
+ �b��Ή�
+ mob_db.txt
+ �o�C�I�v�����g�pmob�̃X�e���ꕔ�C��
+ mob_skill_db.txt
+ �o�C�I�v�����g�pmob�ɃX�L�����C��
+
+ (src/map)
+ skill.c - case AM_CANNIBALIZE: �C��
+
+--------------------
+//1160 by Nameless
+
+�E1158��fix
+�@�t�F�A���[�t�̔�ړ����ƌĂяo���ꂽMOB��HP�������C��
+
+ (src/map)
+ skill.c - case AM_CANNIBALIZE: �C��
+
+--------------------
+//1158 by ��������
+�Emob��ގ��� �@�����������Ă���Ƃ͋t��skilllv�̕����炢�����܂�
+ ���ꂷ����Ăі߂���Ȃ��̂Ŏ�芪���Ăі߂����C��
+ IW�̎΂߈ʒu���������������̂��C���i�o�O�񍐃X���b�h part8 >>110)
+
+ (src/map)
+ skill.c �Ăі߂��C���A��ޒlj��AIW�C��
+ skill.h
+ mob.c
+ map.h
+ (db)
+ skill_db.txt
+--------------------
+//1158 by Nameless
+
+�E�A���P�~�̃o�C�I�v�����g���C��
+�@�eLV�ɂ��킹�āA�}���h���S���A�q�h���A�t���[���A�t�F�A���[�t�A�W�I�O���t�@�[
+�@���Ăяo���悤�ɂ���
+
+ (src/map)
+ skill.c - case AM_CANNIBALIZE: �C��
+
+--------------------
+//1157 by eigen
+
+�E�o�[�h�_���T�[�X�L���̎g�p��MAP�I��������s����C��
+
+ (src/map)
+ skill.c - skill_unit_onout() �C��
+
+--------------------
+//1156 by eigen
+
+�E���̍~���g�p���A�����N���l���J�E���g����Ă��Ȃ������s����C��
+�ithanks to �{�I����X��part3 >>121���j
+�E�o�[�h�_���T�[�X�L���̌��ʂ��؂�Ȃ������s����C��
+
+ (src/map)
+ skill.c - skill_unit_onout(), skill_check_condition_char_sub() �C��
+
+--------------------
+//1155 by latte
+�E�f�B�{�[�V�����ɉr�����ԕt�^
+�E�T�N���t�@�C�X�F�{���C���ƃ{�X�ɗL���ɁB
+�E�O�����h�N���X�̃G�t�F�N�g�̏C��
+
+ (db)
+ skill_cast_db.txt
+ skill_db.txt
+ (src/map)
+ battle.c
+
+--------------------
+//1154 by eigen
+
+�E�o�[�h�_���T�[�X�L���g�p��MAP�I������������C��
+�E�S�X�y���̎���
+�E�}�O�i���u���C�N�̎d�l��{�I�ɍ��킹�ĕύX(�Α����lj��_���[�W�͖������ł�)
+
+ (db)
+ skill_cast_db.txt - �S�X�y��, �}�O�i���u���C�N�Ɋւ���C��
+ skill_require_db.txt - �}�O�i���u���C�N�Ɋւ���C��
+ skill_unit_db.txt - �S�X�y���Ɋւ���C��
+ (src/map)
+ battle.c - battle_calc_pet_weapon_attack(), battle_calc_mob_weapon_attack(),
+ battle_calc_pc_weapon_attack(), battle_calc_magic_attack() �C��
+ clif.c - clif_parse_UseSkillToId(), clif_parse_UseSkillToId(),
+ clif_parse_WalkToXY(), clif_parse_ActionRequest(),
+ clif_parse_UseSkillToId(), clif_parse_UseSkillMap() �C��
+ map.h - MAX_STATUSCHANGE�̑���
+ pc.c - pc_natural_heal_sub() �C��
+ skill.h - �}�O�i���u���C�N, �S�X�y���Ɋւ����Ԉُ�e�[�u���lj�
+ skill.c - skill_castend_damage_id(), skill_castend_nodamage_id(),
+ skill_unit_onout(), skill_unit_onplace_timer(),
+ skill_init_unit_layout() �C��
+ status.c - status_change_start(), status_change_end() �C��
+
+--------------------
+//1153 by �ۂ�
+
+�E�q�[���A�T���N�̏C��
+�@(�C�r���h���C�hC��������Pv,Gv�ȊO���ƃ_���[�W���o�Ȃ��悤�ɏC��)
+�@(�Y��PC�Ƀq�[�����g�p�����ꍇSP��������)
+�E���u����Ă�version.h�̍X�V
+ (src/map)
+ skill.c - skill_castend_id(),skill_unit_onplace_timer() �C��
+ (src/common)
+ version.h - mod version 1153
+--------------------
+//1152 by p
+
+�E�z�����C��
+ (db)
+ item_db.txt - �Â������� getitem �ԍ���߂�
+ (src/map)
+ itemdb.c - �z�Δ��������������̕ύX
+ mob.c - �z�Δ��������̕ύX
+--------------------
+//1151 by p
+
+�E�u���b�N�X�~�X�X�L���z�Δ����̎���(��)
+ (conf)
+ battle_athena.conf - �z�Δ������̎w��
+ (db)
+ item_findingore.txt - �z�΃h���b�v���̎w��
+ item_db.txt - �Â������� getitem �ԍ��ύX
+ (src/map)
+ itemdb.c - db/item_findingore.txt �̓ǂݍ��݂Ɣ���������
+ battle.h - �ݒ�ێ��p�̍��ڒlj�
+ battle.c - �ݒ�ǂݍ��ݏ����lj�
+ mob.c - �z���������lj�
+
+--------------------
+//1150 by Theia
+
+�E�x�m���X�v���b�V���[��jRO�d�l�ɕύX
+�@(���S�ł͂Ȃ��̂ŕ⊮��])
+�E�V���[�v�V���[�e�B���O�̌v�Z����ύX
+�@(���܂ł̌v�Z�����ƕK�����Ă���)
+ (db)
+ skill_cast.txt
+ skill_require_db.txt
+ (src/map)
+ skill.c - �x�m���X�v���b�V���[�̔���������ύX
+ battle.c - �x�m���X�v���b�V���[,�V���[�v�V���[�e�B���O�̔{����ύX
+
+--------------------
+//1149 by eigen
+
+�E�ꕔ�̃_���T�[�o�[�h�X�L���̉��t�X�L���ォ��o���MAP�I��������s����C��
+
+ (src/map)
+ skill.c - skill_unit_onout() �C��
+
+--------------------
+//1148 by eigen
+
+�E�X�g���b�v�X�L�����r�����f����Ȃ��悤�ύX
+�E�X�g���b�v�X�L���������̃X�L�����x����d��5�ɕύX
+�E�o�b�N�X�^�u�̎˒��𕐊�Ɋ֌W�Ȃ�1�ɕύX
+�E�o�b�N�X�^�u�g�p���A�|�𑕔����Ă���Ȃ�_���[�W�����ɕύX
+�E�A�V�b�h�e���[�ƃf�����X�g���[�V�������r�����f�����悤�ύX
+�E�A�V�b�h�e���[�g�p��A����̊Z��j�󂷂邱�Ƃɐ��������ꍇ�V���b�N�G�����o���悤�ύX
+�E�����g�_�E���Ŕj��ł���ӏ��𕐊�ƊZ�݂̂ɕύX
+�E�_���T�[�o�[�h�̉��t�X�L���͈͊O�ɏo�Ă����ʂ�20�b��������悤�ύX
+�i����������Y��Ȃ��łƍ��t�X�L���͏����j
+�E�q�ɂ̍ő���e�ʂ�300�ɕύX
+�i�ȏ�thanks to �{�I����X��Part3 >>115���j
+�E�����g�_�E���Z�j��m����0.7�`7%�ɕύX
+
+ (db)
+ skill_db.txt - cast_cancel�Arange�̏C��
+ skill_unit_db.txt - (1148-fix�̎�荞��)
+ (src/common)
+ mmo.h - MAX_STORAGE��300��
+ (src/map)
+ battle.c - battle_calc_pc_weapon_attack() �C��
+ skill.c - skill_additional_effect(), skill_castend_nodamage_id(),
+ skill_castend_damage_id(), skill_unit_onout() �C��
+
+--------------------
+//1147 by eigen
+
+�E�C���f���A�g�p��A10�b�o���Ȃ��ƍĎg�p�ł��Ȃ��悤�ύX
+�E�V�[�Y���[�h�ł̓C���f���A���g�p�����MDEF���オ�邾���ɕύX
+�E�c�e�g�p��A2�b�o���Ȃ��ƈ��C�����g�p�ł��Ȃ��悤�ύX
+
+ (src/map)
+ map.h - #define MAX_SKILL_ID, unsigned int skillstatictimer[MAX_SKILL_ID] �lj�
+ clif.c - clif_parse_UseSkillToId(), clif_damage() �C��
+ skill.c - skill_castend_nodamage_id(), skill_castend_pos2(), skill_use_id() �C��
+ pc.c - pc_setnewpc(), pc_authok() �C��
+ status.c - status_get_dmotion() �C��
+ battle.c - battle_calc_damage() �C��
+
+--------------------
+//1146 by eigen
+
+�E�C���f���A�g�p��Lv�ɉ�����MDEF���オ��悤�ɕύX
+�E�C���f���A�g�p��7��_���[�W���󂯂�Ɖ�������悤�ύX
+�E�Γ����̌Œ�_���[�W��50�ɕύX
+
+ (src/map)
+ battle.c - battle_calc_damage(), battle_calc_misc_attack() �C��
+ status.c - status_calc_pc(), status_change_start(), status_change_end() �C��
+
+--------------------
+//1145 by End_of_exam
+
+�Estart �̃`�F�b�N�Ԋu���Z�������̂��C��(start)
+�Eskill_unit_effect() ���疳�����[�v�ɓ˓����āA�X�^�b�N�I�[�o�[�t���[�ŗ�����
+�@�”\��������o�O���C��(skill.c)
+�E�y�b�g�̓ǂݍ��݂Ɏ��s�������ɗ�����o�O���C��(pet.c)
+�E�Q�d���O�C���̐ؒf����������Ă����o�O���C��(map.c)
+
+�E1142�̃}�O�k�X�G�N�\�V�Y���̏C�������ɖ߂�(skill.c)
+�E���f�B�^�e�B�I��SP�񕜗ʏC���̎�荞��(skill.c thanks to �ȂȂ�����)
+
+ (/)
+ start - �`�F�b�N�Ԋu���C��
+
+ (src/map)
+ map.c - map_quit() �C��
+ pet.c - pet_recv_petdata() �C��
+ skill.c - skill_unit_onplace_timer() , skill_unit_effect() �C��
+ status.c - status_calc_pc() �C��
+
+--------------------
+//1144 by ��
+
+�EVC�ŃR���p�C�������Ƃ��x�����o��̂��C���B
+�E�ȈՃA�C�e���E�����X�^�[���҃R�}���h@im��lj��B
+�E@im�lj��ɔ���AEGIS�Ŏg���Ă���/item,/monster�������B
+�@(AEGIS�̎d�l�ɑ��葕����1�’P�ʁE���Ӓ��
+�@�ق��̃A�C�e����30�’P�ʁE�Ӓ�ς݂ŏo�܂��B)
+�E@monster�����ҕC�����͂Ȃ��ŏ��҂ł���悤�ɂ����B
+�E�R�}���h���͂̍ۂƂ�������𖞂�����
+�@�o�b�t�@�I�[�o�[�t���[����������o�O���C���B
+ (src/map)
+ atcommand.h �C���B
+ atcommand.c
+ atcommand_monster() �C���B
+ atcommand_itemmonster() �lj��B
+ clif.c
+ clif_parse_GMkillall() �C���B
+ clif_parse_GMsummon() �C���B
+ clif_parse_GMitemmonster() �lj��B
+ status.c
+ status_change_start() �C���B
+ (db)
+ packet_db.txt �C���B
+ (conf)
+ msg_athena.conf �C���B
+ atcommand_athena.conf �C���B
+
+--------------------
+//1143 by End_of_exam
+
+�Emap_quit(), pc_setpos() ��F�X����(map.c pc.c)
+�E�����X�^�[���o�V���J���g���Ɨ�����o�O���C��(skill.c)
+�E�{�X�����X�^�[�Ƀ��L�̋��т������Ă����̂��C��(mob.c)
+�E�_���X�r���ɃT�[�o�[���̕ʂ̃}�b�v�Ɉړ������ꍇ�A�X�L�����j�b�g�������Ȃ�
+�@�i�]���O�̃}�b�v�Ɏc���Ă���j�o�O���C���B(pc.c)
+�E1134�ŃT�[�o�[�Ԃ̃��[�v�|�[�^�����g�������ɁA�X�L���g�p�҂��������T�[�o�[��
+�@������o�O���C��(skill.c)
+�E1134�Ńn�G�̉H���g���ăT�[�o�[�Ԃ��ړ������ꍇ�A�A�C�e��������Ȃ��o�O���C��(pc.c)
+
+ (src/map)
+ map.c - map_quit() �C��
+ mob.c - mobskill_castend_id() , mobskill_castend_pos(),
+ mobskill_use_id(), mobskill_use_pos() �C��
+ pc.c - pc_useitem(), pc_setpos() �C���Apc_remove_map() �lj�
+ pc.h - pc_remove_map() �lj�
+ skill.c - skill_castend_nodamege_id(), skill_unit_onplace() �C��
+
+--------------------
+//1142 by ��
+�E�}�O�k�X�G�N�\�V�Y���Ŏ푰�ɃA���f�b�g�����ƒ����X�^�[�ɓ�����Ȃ������̂��C��
+ (src/map)
+ skill.c - && race!=1��lj�
+
+--------------------
+//1141.1 by BDPQ�� [ 2005/02/21 ]
+�E1141�̓Y�t�Y��̒lj��ł��B�\���󂠂�܂���ł����B
+�EGM�R�}���h���s�������̃��b�Z�[�W��lj����܂����B
+
+ (conf)
+ msg_athena.conf - 113�`117 �lj� (@reload�` ���s�������̃��b�Z�[�W��lj�)
+
+--------------------
+//1141 by BDPQ�� [ 2005/02/20 ]
+�EGM�R�}���h��lj�
+ @reloadatcommand - atcommand_athena.conf ���ēǍ�����
+ @reloadbattleconf - battle_athena.conf ���ēǍ�����
+ @reloadgmaccount - gm_account_filename (�f�t�H���g GM_account.txt ) ���ēǍ�����
+ @reloadstatusdb - job_db1.txt / job_db2.txt / job_db2-2.txt / refine_db.txt / size_fix.txt ���ēǍ�����
+ @reloadpcdb - exp.txt / skill_tree.txt / attr_fix.txt ���ēǍ�����
+�EGM�R�}���h�u@reloadmobdb�v�Ńy�b�g�̃f�[�^�x�[�X���ēǍ�����悤�ɕύX
+ * @reload�` �ɂ̓N���C�A���g�̃����O���K�v�ȏꍇ���L��܂��B
+�EGM�R�}���h�u@who+�v�Ń��x�����\������悤�ɕύX
+�E�q�[���������x���ȏ��9999�Œ�ɂ��邩�̃I�v�V����(heal_counterstop)�lj�
+
+ (conf)
+ atcommand_athena.conf - reloadatcommand reloadbattleconf reloadgmaccount reloadstatusdb reloadpcdb �lj� (�f�t�H���g99)
+ battle_athena.conf - heal_counterstop �lj� (�f�t�H���g11)
+ help.txt - reloadatcommand reloadbattleconf reloadgmaccount reloadstatusdb reloadpcdb who+ �̐�����lj�
+
+ (doc)
+ conf_ref.txt - 5. conf/battle_athena.conf �ҏW (heal_counterstop �̐����ƃT���v����lj�)
+ - 6. atcommand_athena.conf �ҏW (�����ƃT���v���ɍēǍ��֘A��lj�)
+
+ (src/map)
+ atcommand.c - AtCommandInfo atcommand_info �ҏW (�\���̒�`)
+ - atcommand_whop() �ҏW (�v���C���[�̃��x�����\������悤�ύX)
+ - atcommand_reloadatcommand() �lj� (atcommand_athena.conf �ēǍ�)
+ - atcommand_reloadbattleconf() �lj� (battle_athena.conf �ēǍ�)
+ - atcommand_reloadgmaccount() �lj� (gm_account_filename �ēǍ�)
+ - atcommand_reloadstatusdb() �lj� (�X�e�[�^�X�֘ADB �ēǍ�)
+ - atcommand_reloadpcdb() �lj� (�v���C���[�֘ADB �ēǍ�)
+ - atcommand_reloadmobdb() �ҏW (�y�b�g�̃f�[�^�x�[�X���Ǎ��ނ悤�ύX)
+ atcommand.h - AtCommandType �ҏW (�\���̒�`)
+
+ battle.c - battle_config_read() �ҏW (heal_counterstop �̒lj�)
+ battle.h - Battle_Config �ҏW (heal_counterstop �̒lj�)
+
+ skill.c - skill_castend_nodamage_id() �ҏW (9999�q�[������ battle_athena.conf ���Q�Ƃ���悤�ύX)
+
+ pet.h - int read_petdb(); �lj� (�y�b�g�֘ADB �ēǍ��p)
+
+ pc.h - int pc_readdb(void); �lj� (�v���C���[�֘ADB �ēǍ��p)
+
+ status.h - int status_readdb(void); �lj� (�X�e�[�^�X�֘ADB �ēǍ��p)
+
+--------------------
+//1140 by eigen
+�E�ꕔ�̊‹���athena-start��start������ɓ��삵�Ă��Ȃ������o�O���C��
+
+ athena-start - ���s�R�[�h��0A�ɓ���
+ start - ���s�R�[�h��0A�ɓ���
+
+--------------------
+//1139 by ��������
+�ENPC��芪���Ăі߂��X�L������
+�E�R�����g����Ă�9999�q�[��(skilllv>10�̎�)�A�L�͈̓��e�I(skilllv>10�̎�)�A�L�͈̓n���}�[�t�H�[��(skilllv>5�̎�)�̃R�����g���O���B
+�E�L�͈�lov�̕t������(skilllv>10�̎�)
+��
+1312,��芪���Ăі߂����^�[�g���W�F�l����,attack,354,1,3000,0,0,no,self,always,0,,,,,,10
+1063,9999�q�[�������i�e�B�b�N,idle,28,11,10,2000,60000,yes,self,always,0,,,,,,�@
+
+ (src/map)
+ skill.c npc_recall�X�L���lj�,��L�̃R�����g���O��
+ skill.h NPC_RECALL = 354��lj�
+ mob.c �X�L���lj��̂��߂Ɂu��芪�������X�^�[�̏����v�����ɕt������
+ mob.h int mob_countslave(struct mob_data *md);��lj�
+ map.h struct mob_data��recall_flag��recallmob_count�����o�[�lj�
+ (db)
+ skill_db.txt �X�L���lj�
+
+--------------------
+//1138 by End_of_exam
+
+�E1132��socket.c�ɕ��ꍞ��ł������Ȃ�[���ȃo�O�i���M�f�[�^�������_����
+�@���������”\��������o�O�j���C��(socket.c)
+�E1134�őg�ݍ��񂾃A�C�e��dupe�΍􂪕s���S�������̂��C��(pc.c party.c guild.c)
+
+ (src/common/)
+ socket.c - send_from_fifo() �C��
+
+ (src/map)
+ pc.c - pc_setpos() �C��
+ party.c - �F�X�C��
+ guild.c - �F�X�C��
+
+--------------------
+//1137 by ����
+
+�E�T�[�o�[�X�i�b�v�V���b�g
+
+--------------------
//1136 by by eigen
�E1135�ŏ����Ă���battle_athena.conf�̍��ڂƃf�t�H���g�l�𕜊�
diff --git a/conf-tmpl/atcommand_athena.conf b/conf-tmpl/atcommand_athena.conf
index 4bb17dbca..2d114a82c 100644
--- a/conf-tmpl/atcommand_athena.conf
+++ b/conf-tmpl/atcommand_athena.conf
@@ -618,6 +618,18 @@ setbattleflag: 99
// Refresh only status of players - SQL Only
refreshonline: 99
+// Re-load gm command config (admin command)
+reloadatcommand: 99
+
+// Re-load battle config (admin command)
+reloadbattleconf: 99
+
+// Re-load status database (admin command)
+reloadstatusdb: 99
+
+// Re-load player info database (admin command)
+reloadpcdb: 99
+
// [Un]Disguise All Players
disguiseall: 99
undisguiseall: 99
diff --git a/conf-tmpl/msg_athena.conf b/conf-tmpl/msg_athena.conf
index afb482043..c1121780b 100644
--- a/conf-tmpl/msg_athena.conf
+++ b/conf-tmpl/msg_athena.conf
@@ -265,6 +265,10 @@
251: You have already opened your guild storage. Close it first.
252: You are not in a guild.
253: You are not authorised to memo this map.
+254: GM commands configuration reloaded.
+255: Battle configuration reloaded.
+256: Status database reloaded.
+257: Player database reloaded.
// Messages of others (not for GM commands)
// ----------------------------------------
diff --git a/db/packet_db.txt b/db/packet_db.txt
index 95591eacf..81bcf2c89 100644
--- a/db/packet_db.txt
+++ b/db/packet_db.txt
@@ -237,7 +237,7 @@ prefer_packet_db: yes
0x013c,4
0x013d,6
0x013e,24
-0x013f,26
+0x013F,26,itemmonster,2
0x0140,22,mapmove,2:18:20
0x0141,14
0x0142,6
diff --git a/db/skill_cast_db.txt b/db/skill_cast_db.txt
index 247c77a25..d1b62cf0c 100644
--- a/db/skill_cast_db.txt
+++ b/db/skill_cast_db.txt
@@ -2,7 +2,7 @@
//id,cast_list,delay_list,upkeep_time,upkeep_time2
6,0,0,30000,0 //SM_PROVOKE#�v���{�b�N#
-
+7,0,2000,0,0 //SM_MAGNUM#�}�O�i���u���C�N#
8,0,0,10000:13000:16000:19000:22000:25000:28000:31000:34000:37000,0 //SM_ENDURE#�C���f���A#
10,0,0,10000,0 //MG_SIGHT#�T�C�g#
@@ -156,7 +156,7 @@
252,0,0,300000,0 //CR_REFLECTSHIELD#���t���N�g�V�[���h#
253,0,0,0,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000 //CR_HOLYCROSS#�z�[���[�N���X#
254,3000,1500,1000,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000 //CR_GRANDCROSS#�O�����h�N���X#
-
+255,3000,0,0,0 //CR_DEVOTION#�f�B�{�[�V����
256,3000,0,180000,0 //CR_PROVIDENCE#�v�����B�f���X#
257,0,800,180000,0 //CR_DEFENDER#�f�B�t�F���_�[#
258,0,0,30000:60000:90000:120000:150000:180000:210000:240000:270000:300000,0 //CR_SPEARQUICKEN#�X�s�A�N�C�b�P��#
@@ -232,7 +232,7 @@
365,300,300,0,0 //HW_MAGICCRASHER
366,700,0,30000,0 //HW_MAGICPOWER#���@�͑���#
367,2000:2500:3000:3500:4000,2000:3000:4000:5000:6000,0,2000:3000:4000:5000:6000 //PA_PRESSURE
-369,0,0,100000,0 //PA_GOSPEL#�S�X�y��#
+369,0,0,60000,20000 //PA_GOSPEL#�S�X�y��#
370,0,300,0,0 //CH_PALMSTRIKE
371,0,0,0,2000:4000:6000:8000:10000 //CH_TIGERFIST#���Ռ�#
372,0,800:800:800:800:800:1000:1000:1000:1000:1000,0,0 //CH_CHAINCRUSH#�A������#
diff --git a/db/skill_db.txt b/db/skill_db.txt
index ac6acb17f..a1ed5b27f 100644
--- a/db/skill_db.txt
+++ b/db/skill_db.txt
@@ -6,7 +6,7 @@
4,0,0,0,0,0,10,0,no,0,0,0,none,0 //SM_RECOVERY#HP�񕜗͌���#
5,-1,6,1,0,0,10,1,no,0,0,0,weapon,0 //SM_BASH#�o�b�V��#
6,8,6,1,0,1,10,1,no,0,0,0,none,0 //SM_PROVOKE#�v��?�b�N#
-7,0,6,4,3,2,10,5,no,0,0,0,weapon,2 //SM_MAGNUM#?�O�i?�u���C�N#
+7,0,6,4,3,2,10,5,no,0,16,0,weapon,2 //SM_MAGNUM#?�O�i?�u���C�N#
8,0,6,4,0,1,10,1,no,0,0,0,weapon,0 //SM_ENDURE#�C���f���A#
9,0,0,0,0,0,10,0,no,0,0,0,none,0 //MG_SRECOVERY#SP�񕜗͌���#
10,8,6,4,3,1,1,1,yes,0,0,0,magic,0 //MG_SIGHT#�T�C�g#
@@ -264,10 +264,10 @@
212,-1,6,1,0,0,10,1,no,0,0,0,weapon,1 //RG_BACKSTAP#�o�b�N�X?�u#
213,0,0,0,0,0,5,0,no,0,0,0,none,0 //RG_TUNNELDRIVE#�g���l���h���C�u#
214,0,6,4,0,1,5,1,no,0,0,0,weapon,0 //RG_RAID#�T�v���C�Y�A?�b�N#
-215,1,6,1,0,1,5,1,yes,0,0,0,weapon,0 //RG_STRIPWEAPON#�X�g���b�v�E�F?��#
-216,1,6,1,0,1,5,1,yes,0,0,0,weapon,0 //RG_STRIPSHIELD#�X�g���b�v�V?���h#
-217,1,6,1,0,1,5,1,yes,0,0,0,weapon,0 //RG_STRIPARMOR#�X�g���b�v�A???#
-218,1,6,1,0,1,5,1,yes,0,0,0,weapon,0 //RG_STRIPHELM#�X�g���b�v�w��?#
+215,1,6,1,0,1,5,1,no,0,0,0,weapon,0 //RG_STRIPWEAPON#�X�g���b�v�E�F?��#
+216,1,6,1,0,1,5,1,no,0,0,0,weapon,0 //RG_STRIPSHIELD#�X�g���b�v�V?���h#
+217,1,6,1,0,1,5,1,no,0,0,0,weapon,0 //RG_STRIPARMOR#�X�g���b�v�A???#
+218,1,6,1,0,1,5,1,no,0,0,0,weapon,0 //RG_STRIPHELM#�X�g���b�v�w��?#
219,-1,6,1,0,0,5,1,no,0,0,0,weapon,0 //RG_INTIMIDATE#�C���e�B?�f�C�g#
220,1,6,2,0,1,1,1,no,0,0,0,none,0 //RG_GRAFFITI#�O���t�B�e�B#
221,0,6,2,0,1,5,1,no,0,0,0,none,0 //RG_FLAGGRAFFITI#�t���b�O�O���t�B�e�B#
@@ -278,8 +278,8 @@
226,0,0,0,0,0,10,0,no,0,0,0,weapon,0 //AM_AXEMASTERY#?�C��#
227,0,0,0,0,0,10,0,no,0,0,0,none,0 //AM_LEARNINGPOTION#��?�j���O??�V����#
228,0,6,4,0,1,10,0,no,0,0,0,none,0 //AM_PHARMACY#�t???�V?#
-229,8,6,2,3,1,5,1,no,0,128,0,weapon,0 //AM_DEMONSTRATION#�f�����X�g��?�V����#
-230,8,6,1,0,0,5,0,no,0,0,0,weapon,0 //AM_ACIDTERROR#�A�V�b�h�e��?#
+229,8,6,2,3,1,5,1,yes,0,128,0,weapon,0 //AM_DEMONSTRATION#�f�����X�g��?�V����#
+230,8,6,1,0,0,5,0,yes,0,0,0,weapon,0 //AM_ACIDTERROR#�A�V�b�h�e��?#
231,8,6,16,0,1,5,1,yes,0,3072,0,none,0 //AM_POTIONPITCHER#??�V�����s�b?��?#
232,3,6,2,0,1,5,1,no,0,0,5,none,0 //AM_CANNIBALIZE#�o�C�I�v�����g#
233,3,6,2,0,1,5,1,no,0,128,3,none,0 //AM_SPHEREMINE#�X�t�B�A??�C��#
@@ -303,7 +303,7 @@
251,3:5:7:9:11,6,1,0,0,5,1,no,0,0,0,weapon,0 //CR_SHIELDBOOMERANG#�V?���h�u?������#
252,0,6,4,0,1,10,1,no,0,0,0,weapon,0 //CR_REFLECTSHIELD#���t���N�g�V?���h#
253,-2,8,1,6,0,10,2,no,0,0,0,weapon,0 //CR_HOLYCROSS#�z?��?�N���X#
-254,0,6,4,6,0,10,1,no,33,256,0,magic,0 //CR_GRANDCROSS#�O�����h�N���X#
+254,0,5,4,6,0,10,1,no,33,256,0,magic,0 //CR_GRANDCROSS#�O�����h�N���X#
255,8,6,16,0,1,5,1,yes,0,0,0,magic,0 //CR_DEVOTION#�f�B??�V����#
256,8,6,16,0,1,5,1,yes,0,0,0,magic,0 //CR_PROVIDENCE#�v�����B�f���X#
257,0,6,4,0,1,5,1,no,0,0,0,weapon,0 //CR_DEFENDER#�f�B�t�F��??#
@@ -404,13 +404,13 @@
//345����
//346����
//347�s�������U��
-//348�U���n�G�t�F�N�g�i��ށH�j
+348,2,6,4,0,1,20,0,no,0,0,0,magic,0 //NPC_RUNAWAY#���#
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
//353�U���n�X�L���G�t�F�N�g
-//354�U���n�X�L���G�t�F�N�g
+354,2,0,4,0,1,1,0,no,0,0,0,magic,0 //NPC_RECALL#��芪���Ăі߂�#
355,0,6,4,0,1,5,1,no,0,0,0,weapon,0 //LK_AURABLADE#�I?���u��?�h#
356,0,6,4,0,1,10,1,no,0,0,0,weapon,0 //LK_PARRYING#�p���C���O#
@@ -436,7 +436,7 @@
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��#
-379,5,6,1,0,0,10,1,no,0,0,0,weapon,0 //ASC_BREAKER#?�E���u��?�J?#
+379,9,6,1,0,0,10,1,yes,0,0,0,weapon,0 //ASC_BREAKER#?�E���u��?�J?#
380,0,6,4,0,1,10,1,no,0,0,0,weapon,0 //SN_SIGHT#�g�D��?�T�C�g#
381,9,8,1,0,0,5,1:2:3:4:5,yes,0,0,0,misc,0 //SN_FALCONASSAULT#�t?���R���A�T���g#
382,14,8,1,0,0,5,1,no,0,0,0,weapon,0 //SN_SHARPSHOOTING#�V��?�v�V��?�e�B���O#
@@ -454,7 +454,7 @@
394,8,8,1,0,0,10,9,no,0,0,0,weapon,0 //CG_ARROWVULCAN#�A��?�o���J��#
395,0,0,4,0,1,1,1,yes,0,0,0,magic,0 //CG_MOONLIT#������̐�ɗ�����Ԃт�#
396,0,6,16,0,1,1,1,yes,0,0,0,magic,1 //CG_MARIONETTE#?���I�l�b�g�R���g��?��#
-397,4,8,1,0,0,5,5,no,0,0,0,weapon,0 //LK_SPIRALPIERCE#�X�p�C�����s�A?�X#
+397,5,8,1,0,0,5,5,no,0,0,0,weapon,0 //LK_SPIRALPIERCE#�X�p�C�����s�A?�X#
398,4,6,1,0,0,5,1,no,0,0,0,weapon,0 //LK_HEADCRUSH#�w�b�h�N���b�V��#
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��#
diff --git a/db/skill_require_db.txt b/db/skill_require_db.txt
index 50578ac49..2cccdfe72 100644
--- a/db/skill_require_db.txt
+++ b/db/skill_require_db.txt
@@ -3,7 +3,7 @@
5,0,0,8:8:8:8:8:15:15:15:15:15,0,0,0,0:1:2:3:4:5:6:7:8:9:10:12:13:14:15:16:17:18:19:20:21:22,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SM_BASH#�o�b�V��#
6,0,0,4:5:6:7:8:9:10:11:12:13,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SM_PROVOKE#�v���{�b�N#
-7,15,0,15,0,0,0,0:1:2:3:4:5:6:7:8:9:10:12:13:14:15:16:17:18:19:20:21:22,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SM_MAGNUM#�}�O�i���u���C�N#
+7,20:20:19:19:18:18:17:17:16:16,0,30,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SM_MAGNUM#�}�O�i���u���C�N#
8,0,0,10,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SM_ENDURE#�C���f���A#
10,0,0,10,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //MG_SIGHT#�T�C�g#
diff --git a/db/skill_unit_db.txt b/db/skill_unit_db.txt
index e9e7dffaf..800548745 100644
--- a/db/skill_unit_db.txt
+++ b/db/skill_unit_db.txt
@@ -75,6 +75,6 @@
336,0xb2, , 0,-1, -1,all, 0x000,0 //WE_CALLPARTNER#���Ȃ��Ɉ�������
339,0x86, , -1, 0, 300,enemy, 0x000,0 //NPC_DARKGRANDCROSS#�ŃO�����h�N���X
362,0xb4, , 0, 3, 300,all, 0x000,0 //HP_BASILICA#�o�W���J
-369,0xb3, , 3, 0, -1,all, 0x000,0 //PA_GOSPEL#�S�X�y��
+369,0xb3, , -1, 0,10000,all, 0x000,0 //PA_GOSPEL#�S�X�y��
404,0xb6, , -1, 0, -1,all, 0x000,0 //PF_FOGWALL#�t�H�O�E�H�[��
405,0xb7, , 0, 1,1000,enemy, 0x006,0 //PF_SPIDERWEB#�X�p�C�_�[�E�F�b�u
diff --git a/src/map/atcommand.c b/src/map/atcommand.c
index b236b211c..a420147bc 100644
--- a/src/map/atcommand.c
+++ b/src/map/atcommand.c
@@ -10,6 +10,7 @@
#include "../common/nullpo.h"
#include "../common/mmo.h"
#include "../common/db.h"
+#include "../common/core.h"
#include "log.h"
#include "clif.h"
@@ -29,7 +30,6 @@
#include "script.h"
#include "npc.h"
#include "trade.h"
-#include "core.h"
#ifndef TXT_ONLY
#include "mail.h"
@@ -142,6 +142,10 @@ ACMD_FUNC(reloadmobdb);
ACMD_FUNC(reloadskilldb);
ACMD_FUNC(reloadscript);
ACMD_FUNC(reloadgmdb); // by Yor
+ACMD_FUNC(reloadatcommand);
+ACMD_FUNC(reloadbattleconf);
+ACMD_FUNC(reloadstatusdb);
+ACMD_FUNC(reloadpcdb);
ACMD_FUNC(mapexit);
ACMD_FUNC(idsearch);
ACMD_FUNC(mapinfo);
@@ -389,6 +393,10 @@ static AtCommandInfo atcommand_info[] = {
{ AtCommand_ReloadSkillDB, "@reloadskilldb", 99, atcommand_reloadskilldb }, // admin command
{ AtCommand_ReloadScript, "@reloadscript", 99, atcommand_reloadscript }, // admin command
{ AtCommand_ReloadGMDB, "@reloadgmdb", 99, atcommand_reloadgmdb }, // admin command
+ { AtCommand_ReloadAtcommand, "@reloadatcommand", 99, atcommand_reloadatcommand },
+ { AtCommand_ReloadBattleConf, "@reloadbattleconf",99, atcommand_reloadbattleconf },
+ { AtCommand_ReloadStatusDB, "@reloadstatusdb", 99, atcommand_reloadstatusdb },
+ { AtCommand_ReloadPcDB, "@reloadpcdb", 99, atcommand_reloadpcdb },
{ AtCommand_CharModel, "@charmodel", 50, atcommand_charmodel },
{ AtCommand_CharSKPoint, "@charskpoint", 60, atcommand_charskpoint },
{ AtCommand_CharSTPoint, "@charstpoint", 60, atcommand_charstpoint },
@@ -5622,6 +5630,7 @@ int atcommand_reloadmobdb(
{
nullpo_retr(-1, sd);
mob_reload();
+ read_petdb();
clif_displaymessage(fd, msg_table[98]); // Monster database reloaded.
return 0;
@@ -5643,6 +5652,66 @@ int atcommand_reloadskilldb(
}
/*==========================================
+ * @reloadatcommand
+ * atcommand_athena.conf �̃����[�h
+ *------------------------------------------
+ */
+int
+atcommand_reloadatcommand(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ atcommand_config_read(ATCOMMAND_CONF_FILENAME);
+ clif_displaymessage(fd, msg_table[254]);
+ return 0;
+}
+/*==========================================
+ * @reloadbattleconf
+ * battle_athena.conf �̃����[�h
+ *------------------------------------------
+ */
+int
+atcommand_reloadbattleconf(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ battle_config_read(BATTLE_CONF_FILENAME);
+ clif_displaymessage(fd, msg_table[255]);
+ return 0;
+}
+/*==========================================
+ * @reloadstatusdb
+ * job_db1.txt job_db2.txt job_db2-2.txt
+ * refine_db.txt size_fix.txt
+ * �̃����[�h
+ *------------------------------------------
+ */
+int
+atcommand_reloadstatusdb(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ status_readdb();
+ clif_displaymessage(fd, msg_table[256]);
+ return 0;
+}
+/*==========================================
+ * @reloadpcdb
+ * exp.txt skill_tree.txt attr_fix.txt
+ * �̃����[�h
+ *------------------------------------------
+ */
+int
+atcommand_reloadpcdb(
+ const int fd, struct map_session_data* sd,
+ const char* command, const char* message)
+{
+ pc_readdb();
+ clif_displaymessage(fd, msg_table[257]);
+ return 0;
+}
+
+/*==========================================
*
*------------------------------------------
*/
diff --git a/src/map/atcommand.h b/src/map/atcommand.h
index 6dcd6cc59..a9678d6a3 100644
--- a/src/map/atcommand.h
+++ b/src/map/atcommand.h
@@ -122,6 +122,10 @@ enum AtCommandType {
AtCommand_ReloadSkillDB,
AtCommand_ReloadScript,
AtCommand_ReloadGMDB,
+ AtCommand_ReloadAtcommand,
+ AtCommand_ReloadBattleConf,
+ AtCommand_ReloadStatusDB,
+ AtCommand_ReloadPcDB,
AtCommand_MapInfo,
AtCommand_Dye,
AtCommand_Hstyle,
diff --git a/src/map/battle.c b/src/map/battle.c
index 78d8215ab..aa30ef0a9 100644
--- a/src/map/battle.c
+++ b/src/map/battle.c
@@ -928,6 +928,7 @@ static struct Damage battle_calc_pet_weapon_attack(
break;
case AS_SPLASHER: /* �x�i���X�v���b�V���[ */
damage = damage*(200+20*skill_lv)/100;
+ hitrate = 1000000;
break;
}
if (div_flag && div_ > 1) { // [Skotlex]
@@ -1432,6 +1433,7 @@ static struct Damage battle_calc_mob_weapon_attack(
break;
case AS_SPLASHER: /* �x�i���X�v���b�V���[ */
damage = damage*(200+20*skill_lv)/100;
+ hitrate = 1000000;
break;
}
if (div_flag && div_ > 1) { // [Skotlex]
@@ -2291,6 +2293,8 @@ static struct Damage battle_calc_pc_weapon_attack(
case AS_SPLASHER: /* �x�i���X�v���b�V���[ */
damage = damage*(200+20*skill_lv+20*pc_checkskill(sd,AS_POISONREACT))/100;
damage2 = damage2*(200+20*skill_lv+20*pc_checkskill(sd,AS_POISONREACT))/100;
+ no_cardfix = 1;
+ hitrate = 1000000;
break;
case ASC_BREAKER: // -- moonsoul (special damage for ASC_BREAKER skill)
if(sd){
diff --git a/src/map/clif.c b/src/map/clif.c
index 7ebf11b8a..20db97554 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -3706,7 +3706,8 @@ int clif_damage(struct block_list *src,struct block_list *dst,unsigned int tick,
if(type != 4 && dst->type == BL_PC && ((struct map_session_data *)dst)->special_state.infinite_endure)
type = 9;
if(sc_data) {
- if(type != 4 && sc_data[SC_ENDURE].timer != -1)
+ if(type != 4 && sc_data[SC_ENDURE].timer != -1 &&
+ (dst->type == BL_PC && !map[dst->m].flag.gvg))
type = 9;
if(sc_data[SC_HALLUCINATION].timer != -1) {
if(damage > 0)
@@ -9794,31 +9795,6 @@ void clif_parse_OpenVending(int fd,struct map_session_data *sd) {
}
/*==========================================
- * /monster /item rewriten by [Yor]
- *------------------------------------------
- */
-void clif_parse_GM_Monster_Item(int fd, struct map_session_data *sd) {
- char monster_item_name[25];
-
- nullpo_retv(sd);
-
- memset(monster_item_name, '\0', sizeof(monster_item_name));
-
- if (battle_config.atc_gmonly == 0 || pc_isGM(sd)) {
- memcpy(monster_item_name, RFIFOP(fd,2), 24);
-
- if (mobdb_searchname(monster_item_name) != 0) {
- if (pc_isGM(sd) >= get_atcommand_level(AtCommand_Monster))
- atcommand_spawn(fd, sd, "@spawn", monster_item_name); // as @spawn
- } else if (itemdb_searchname(monster_item_name) != NULL) {
- if (pc_isGM(sd) >= get_atcommand_level(AtCommand_Item))
- atcommand_item(fd, sd, "@item", monster_item_name); // as @item
- }
-
- }
-}
-
-/*==========================================
* �M���h�����
*------------------------------------------
*/
@@ -10099,6 +10075,31 @@ void clif_parse_Recall(int fd, struct map_session_data *sd) { // Added by RoVeRT
return;
}
+/*==========================================
+ * /monster /item rewriten by [Yor]
+ *------------------------------------------
+ */
+void clif_parse_GM_Monster_Item(int fd, struct map_session_data *sd) {
+ char monster_item_name[25];
+
+ nullpo_retv(sd);
+
+ memset(monster_item_name, '\0', sizeof(monster_item_name));
+
+ if (battle_config.atc_gmonly == 0 || pc_isGM(sd)) {
+ memcpy(monster_item_name, RFIFOP(fd,2), 24);
+
+ if (mobdb_searchname(monster_item_name) != 0) {
+ if (pc_isGM(sd) >= get_atcommand_level(AtCommand_Monster))
+ atcommand_spawn(fd, sd, "@spawn", monster_item_name); // as @spawn
+ } else if (itemdb_searchname(monster_item_name) != NULL) {
+ if (pc_isGM(sd) >= get_atcommand_level(AtCommand_Item))
+ atcommand_item(fd, sd, "@item", monster_item_name); // as @item
+ }
+
+ }
+}
+
void clif_parse_GMHide(int fd, struct map_session_data *sd) { // Modified by [Yor]
nullpo_retv(sd);
@@ -10989,7 +10990,8 @@ static int packetdb_readdb(void)
{clif_parse_friends_list_add,"friendslistadd"},
{clif_parse_friends_list_remove,"friendslistremove"},
{clif_parse_GMkillall,"killall"},
- {clif_parse_GM_Monster_Item,"summon"},
+ {clif_parse_Recall,"summon"},
+ {clif_parse_GM_Monster_Item,"itemmonster"},
{clif_parse_Shift,"shift"},
{clif_parse_debug,"debug"},
diff --git a/src/map/guild.c b/src/map/guild.c
index c65c3963c..935377e19 100644
--- a/src/map/guild.c
+++ b/src/map/guild.c
@@ -386,7 +386,7 @@ int guild_check_member(const struct guild *g)
nullpo_retr(0, g);
for(i=0;i<fd_max;i++){
- if(session[i] && (sd=(struct map_session_data *) session[i]->session_data) && sd->state.auth){
+ if(session[i] && (sd=(struct map_session_data *) session[i]->session_data) && sd->state.auth && !sd->state.waitingdisconnect){
if(sd->status.guild_id==g->guild_id){
int j,f=1;
for(j=0;j<MAX_GUILD;j++){ // �f�[�^�����邩
@@ -412,7 +412,7 @@ int guild_recv_noinfo(int guild_id)
int i;
struct map_session_data *sd;
for(i=0;i<fd_max;i++){
- if(session[i] && (sd=(struct map_session_data *) session[i]->session_data) && sd->state.auth){
+ if(session[i] && (sd=(struct map_session_data *) session[i]->session_data) && sd->state.auth && !sd->state.waitingdisconnect){
if(sd->status.guild_id==guild_id)
sd->status.guild_id=0;
}
@@ -442,9 +442,11 @@ int guild_recv_info(struct guild *sg)
for(i=bm=m=0;i<g->max_member;i++){ // sd�̐ݒ�Ɛl���̊m�F
if(g->member[i].account_id>0){
struct map_session_data *sd = map_id2sd(g->member[i].account_id);
- g->member[i].sd=(sd!=NULL &&
- sd->status.char_id==g->member[i].char_id &&
- sd->status.guild_id==g->guild_id)? sd:NULL;
+ if (sd && sd->status.char_id == g->member[i].char_id &&
+ sd->status.guild_id == g->guild_id &&
+ !sd->state.waitingdisconnect)
+ g->member[i].sd = sd;
+ else sd = NULL;
m++;
}else
g->member[i].sd=NULL;
@@ -795,9 +797,11 @@ int guild_recv_memberinfoshort(int guild_id,int account_id,int char_id,int onlin
for(i=0;i<g->max_member;i++){ // sd�Đݒ�
struct map_session_data *sd= map_id2sd(g->member[i].account_id);
- g->member[i].sd=(sd!=NULL &&
- sd->status.char_id==g->member[i].char_id &&
- sd->status.guild_id==guild_id)?sd:NULL;
+ if (sd && sd->status.char_id == g->member[i].char_id &&
+ sd->status.guild_id == g->guild_id &&
+ !sd->state.waitingdisconnect)
+ g->member[i].sd = sd;
+ else sd = NULL;
}
// �����ɃN���C�A���g�ɑ��M�������K�v
diff --git a/src/map/mail.c b/src/map/mail.c
index c7939cca1..46e80be9f 100644
--- a/src/map/mail.c
+++ b/src/map/mail.c
@@ -15,6 +15,7 @@
#include "clif.h"
#include "chrif.h"
#include "intif.h"
+#include "atcommand.h"
#include "pc.h"
#include "mail.h"
@@ -22,7 +23,7 @@ char mail_db[32] = "mail";
int MAIL_CHECK_TIME = 120000;
int mail_timer;
-extern char msg_table[1000][256]; // Server messages (0-499 reserved for GM commands, 500-999 reserved for others)
+//extern char *msg_table[1000]; // Server messages (0-499 reserved for GM commands, 500-999 reserved for others)
#ifdef MEMWATCH
#include "memwatch.h"
@@ -47,7 +48,7 @@ int mail_check(struct map_session_data *sd,int type)
if(mail_res) {
if (mysql_num_rows(mail_res) == 0) {
//clif_displaymessage(sd->fd,"You have no messages.");
- clif_displaymessage(sd->fd,msg_table[516]);
+ clif_displaymessage(sd->fd, msg_txt(516));
mysql_free_result(mail_res);
return 0;
@@ -69,18 +70,18 @@ int mail_check(struct map_session_data *sd,int type)
if(type==2 || type==3) {
if(atoi(mail_row[4])) {
//sprintf(message, "%d - From : %s (New - Priority)", i, mail_row[2]);
- sprintf(message, msg_table[511], i, mail_row[2]);
+ sprintf(message, msg_txt(511), i, mail_row[2]);
clif_displaymessage(sd->fd, jstrescape(message));
} else {
//sprintf(message, "%d - From : %s (New)", i, mail_row[2]);
- sprintf(message, msg_table[512], i, mail_row[2]);
+ sprintf(message, msg_txt(512), i, mail_row[2]);
clif_displaymessage(sd->fd, jstrescape(message));
}
}
} else if(type==2){
//sprintf(message, "%d - From : %s", i, mail_row[2]);
- sprintf(message, msg_table[513], i, mail_row[2]);
+ sprintf(message, msg_txt(513), i, mail_row[2]);
clif_displaymessage(sd->fd, jstrescape(message));
}
}
@@ -93,18 +94,18 @@ int mail_check(struct map_session_data *sd,int type)
if(i>0 && new_>0 && type==1) {
//sprintf(message, "You have %d new messages.", new_);
- sprintf(message, msg_table[514], new_);
+ sprintf(message, msg_txt(514), new_);
clif_displaymessage(sd->fd, jstrescape(message));
}
if(i>0 && new_>0 && priority>0 && type==1) {
//sprintf(message, "You have %d unread priority messages.", priority);
- sprintf(message, msg_table[515], priority);
+ sprintf(message, msg_txt(515), priority);
clif_displaymessage(sd->fd, jstrescape(message));
}
if(!new_) {
//clif_displaymessage(sd->fd, "You have no new messages.");
- clif_displaymessage(sd->fd, msg_table[516]);
+ clif_displaymessage(sd->fd, msg_txt(516));
}
return 0;
@@ -129,7 +130,7 @@ int mail_read(struct map_session_data *sd, int message_id)
if (mysql_num_rows(mail_res) == 0) {
mysql_free_result(mail_res);
//clif_displaymessage(sd->fd, "Message not found.");
- clif_displaymessage(sd->fd, msg_table[517]);
+ clif_displaymessage(sd->fd, msg_txt(517));
return 0;
}
@@ -142,7 +143,7 @@ int mail_read(struct map_session_data *sd, int message_id)
}
//sprintf(message, "Reading message from %s", mail_row[2]);
- sprintf(message, msg_table[518], mail_row[2]);
+ sprintf(message, msg_txt(518), mail_row[2]);
clif_displaymessage(sd->fd, jstrescape(message));
sprintf(message, "%s", mail_row[3]);
@@ -179,7 +180,7 @@ int mail_delete(struct map_session_data *sd, int message_id)
if (mysql_num_rows(mail_res) == 0) {
mysql_free_result(mail_res);
//clif_displaymessage(sd->fd, "Message not found.");
- clif_displaymessage(sd->fd, msg_table[517]);
+ clif_displaymessage(sd->fd, msg_txt(517));
return 0;
}
@@ -187,14 +188,14 @@ int mail_delete(struct map_session_data *sd, int message_id)
if(!atoi(mail_row[2]) && atoi(mail_row[3])) {
mysql_free_result(mail_res);
//clif_displaymessage(sd->fd,"Cannot delete unread priority mail.");
- clif_displaymessage(sd->fd,msg_table[519]);
+ clif_displaymessage(sd->fd,msg_txt(519));
return 0;
}
if(!atoi(mail_row[4])) {
mysql_free_result(mail_res);
//clif_displaymessage(sd->fd,"You have recieved new mail, use @listmail before deleting.");
- clif_displaymessage(sd->fd,msg_table[520]);
+ clif_displaymessage(sd->fd,msg_txt(520));
return 0;
}
sprintf(tmp_msql,"DELETE FROM `%s` WHERE `message_id` = \"%d\"", mail_db, atoi(mail_row[0]));
@@ -204,7 +205,7 @@ int mail_delete(struct map_session_data *sd, int message_id)
return 0;
}
//else clif_displaymessage(sd->fd,"Message deleted.");
- else clif_displaymessage(sd->fd,msg_table[521]);
+ else clif_displaymessage(sd->fd,msg_txt(521));
}
mysql_free_result(mail_res);
@@ -222,14 +223,14 @@ int mail_send(struct map_session_data *sd, char *name, char *message, int flag)
if(pc_isGM(sd) < 80 && sd->mail_counter > 0) {
//clif_displaymessage(sd->fd,"You must wait 10 minutes before sending another message");
- clif_displaymessage(sd->fd,msg_table[522]);
+ clif_displaymessage(sd->fd,msg_txt(522));
return 0;
}
if(strcmp(name,"*")==0) {
if(pc_isGM(sd) < 80) {
//clif_displaymessage(sd->fd, "Access Denied.");
- clif_displaymessage(sd->fd, msg_table[523]);
+ clif_displaymessage(sd->fd, msg_txt(523));
return 0;
}
else
@@ -248,7 +249,7 @@ int mail_send(struct map_session_data *sd, char *name, char *message, int flag)
if (mysql_num_rows(mail_res) == 0) {
mysql_free_result(mail_res);
//clif_displaymessage(sd->fd,"Character does not exist.");
- clif_displaymessage(sd->fd,msg_table[524]);
+ clif_displaymessage(sd->fd,msg_txt(524));
return 0;
}
@@ -273,7 +274,7 @@ int mail_send(struct map_session_data *sd, char *name, char *message, int flag)
}
//clif_displaymessage(sd->fd,"Mail has been sent.");
- clif_displaymessage(sd->fd,msg_table[525]);
+ clif_displaymessage(sd->fd,msg_txt(525));
return 0;
}
@@ -310,7 +311,7 @@ int mail_check_timer(int tid,unsigned int tick,int id,int data)
sd->mail_counter--;
if(sd->status.account_id==atoi(mail_row[0]))
//clif_displaymessage(sd->fd, "You have new mail.");
- clif_displaymessage(sd->fd, msg_table[526]);
+ clif_displaymessage(sd->fd, msg_txt(526));
}
}
}
diff --git a/src/map/map.c b/src/map/map.c
index 19edfd08b..f04d64a79 100644
--- a/src/map/map.c
+++ b/src/map/map.c
@@ -110,6 +110,16 @@ int check_online_timer=0; // [Valaris]
#endif /* not TXT_ONLY */
+char *INTER_CONF_NAME;
+char *LOG_CONF_NAME;
+char *MAP_CONF_NAME;
+char *BATTLE_CONF_FILENAME;
+char *ATCOMMAND_CONF_FILENAME;
+char *CHARCOMMAND_CONF_FILENAME;
+char *SCRIPT_CONF_NAME;
+char *MSG_CONF_NAME;
+char *GRF_PATH_FILENAME;
+
#define USE_AFM
#define USE_AF2
@@ -1460,60 +1470,20 @@ int map_quit(struct map_session_data *sd) {
}
}
- if(sd->chatID) // �`���b�g����o��
- chat_leavechat(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->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->sc_data && sd->sc_data[SC_BERSERK].timer!=-1) //�o?�T?�N���̏I����HP��100��
+ sd->status.hp = 100;
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
-
- 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;
-
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) {
- pc_stop_walking(sd,0);
- pc_stopattack(sd);
- pc_delinvincibletimer(sd);
- }
+ pc_cleareventtimer(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);
@@ -1530,11 +1500,11 @@ int map_quit(struct map_session_data *sd) {
if(pc_isdead(sd))
pc_setrestartvalue(sd,2);
+ pc_remove_map(sd,2);
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) {
@@ -3266,15 +3236,15 @@ int do_init(int argc, char *argv[]) {
GC_enable_incremental();
#endif
- char *INTER_CONF_NAME="conf/inter_athena.conf";
- char *LOG_CONF_NAME="conf/log_athena.conf";
- char *MAP_CONF_NAME = "conf/map_athena.conf";
- char *BATTLE_CONF_FILENAME = "conf/battle_athena.conf";
- char *ATCOMMAND_CONF_FILENAME = "conf/atcommand_athena.conf";
- char *CHARCOMMAND_CONF_FILENAME = "conf/charcommand_athena.conf";
- char *SCRIPT_CONF_NAME = "conf/script_athena.conf";
- char *MSG_CONF_NAME = "conf/msg_athena.conf";
- char *GRF_PATH_FILENAME = "conf/grf-files.txt";
+ INTER_CONF_NAME="conf/inter_athena.conf";
+ LOG_CONF_NAME="conf/log_athena.conf";
+ MAP_CONF_NAME = "conf/map_athena.conf";
+ BATTLE_CONF_FILENAME = "conf/battle_athena.conf";
+ ATCOMMAND_CONF_FILENAME = "conf/atcommand_athena.conf";
+ CHARCOMMAND_CONF_FILENAME = "conf/charcommand_athena.conf";
+ SCRIPT_CONF_NAME = "conf/script_athena.conf";
+ MSG_CONF_NAME = "conf/msg_athena.conf";
+ GRF_PATH_FILENAME = "conf/grf-files.txt";
chrif_connected = 0;
diff --git a/src/map/map.h b/src/map/map.h
index b25e6f05a..81d1b8cbc 100644
--- a/src/map/map.h
+++ b/src/map/map.h
@@ -220,6 +220,7 @@ struct map_session_data {
struct skill_unit_group_tickset skillunittick[MAX_SKILLUNITGROUPTICKSET];
struct skill_timerskill skilltimerskill[MAX_SKILLTIMERSKILL];
char blockskill[MAX_SKILL]; // [celest]
+ //unsigned int skillstatictimer[MAX_SKILL];
unsigned short timerskill_count; // [celest]
int cloneskill_id;
int potion_hp,potion_sp,potion_per_hp,potion_per_sp;
@@ -490,7 +491,9 @@ struct mob_data {
struct skill_unit_group_tickset skillunittick[MAX_SKILLUNITGROUPTICKSET];
char npc_event[50];
unsigned char size;
- int owner;
+ short recall_flag;
+ int recallmob_count;
+ short recallcount;
};
struct pet_data {
struct block_list bl;
@@ -800,6 +803,16 @@ int cleanup_sub(struct block_list *bl, va_list ap);
void map_helpscreen(); // [Valaris]
int map_delmap(char *mapname);
+extern char *INTER_CONF_NAME;
+extern char *LOG_CONF_NAME;
+extern char *MAP_CONF_NAME;
+extern char *BATTLE_CONF_FILENAME;
+extern char *ATCOMMAND_CONF_FILENAME;
+extern char *CHARCOMMAND_CONF_FILENAME;
+extern char *SCRIPT_CONF_NAME;
+extern char *MSG_CONF_NAME;
+extern char *GRF_PATH_FILENAME;
+
#ifndef TXT_ONLY
// MySQL
diff --git a/src/map/mob.c b/src/map/mob.c
index 80cd6e346..b46b2a317 100644
--- a/src/map/mob.c
+++ b/src/map/mob.c
@@ -196,8 +196,8 @@ int mob_once_spawn (struct map_session_data *sd, char *mapname,
md->m = m;
md->x0 = x;
md->y0 = y;
- md->xs = 0;
- md->ys = 0;
+ //md->xs = 0;
+ //md->ys = 0;
md->spawndelay1 = -1; // ��x�̂݃t���O
md->spawndelay2 = -1; // ��x�̂݃t���O
@@ -297,14 +297,8 @@ int mob_spawn_guardian(struct map_session_data *sd,char *mapname,
for(count=0;count<amount;count++){
struct guild_castle *gc;
md=(struct mob_data *) aCalloc(sizeof(struct mob_data), 1);
- if(md==NULL){
- printf("mob_spawn_guardian: out of memory !\n");
- exit(1);
- }
memset(md, '\0', sizeof *md);
-
-
mob_spawn_dataset(md,mobname,class_);
md->bl.m=m;
md->bl.x=x;
@@ -334,7 +328,6 @@ int mob_spawn_guardian(struct map_session_data *sd,char *mapname,
if(guardian==5) { md->hp=gc->Ghp5; gc->GID5=md->bl.id; }
if(guardian==6) { md->hp=gc->Ghp6; gc->GID6=md->bl.id; }
if(guardian==7) { md->hp=gc->Ghp7; gc->GID7=md->bl.id; }
-
}
}
@@ -760,9 +753,6 @@ static int mob_timer(int tid,unsigned int tick,int id,int data)
nullpo_retr(1, md=(struct mob_data*)bl);
- if(!md->bl.type || md->bl.type!=BL_MOB)
- return 1;
-
if(md->timer != tid){
if(battle_config.error_log)
printf("mob_timer %d != %d\n",md->timer,tid);
@@ -1069,7 +1059,6 @@ int mob_stop_walking(struct mob_data *md,int type)
{
nullpo_retr(0, md);
-
if(md->state.state == MS_WALK || md->state.state == MS_IDLE) {
int dx=0,dy=0;
@@ -1405,6 +1394,18 @@ static int mob_ai_sub_hard_slavemob(struct mob_data *md,unsigned int tick)
if(!mmd || mmd->bl.type!=BL_MOB || mmd->bl.id!=md->master_id)
return 0;
+ // �Ăі߂�
+ if(mmd->recall_flag == 1){
+ if (mmd->recallcount < (mmd->recallmob_count+2) ){
+ mob_warp(md,-1,mmd->bl.x,mmd->bl.y,3);
+ mmd->recallcount += 1;
+ } else{
+ mmd->recall_flag = 0;
+ mmd->recallcount=0;
+ }
+ md->state.master_check = 1;
+ return 0;
+ }
// Since it is in the map on which the master is not, teleport is carried out and it pursues.
if( mmd->bl.m != md->bl.m ){
mob_warp(md,mmd->bl.m,mmd->bl.x,mmd->bl.y,3);
@@ -1598,7 +1599,6 @@ static int mob_ai_sub_hard(struct block_list *bl,va_list ap)
tick=va_arg(ap,unsigned int);
-
if(DIFF_TICK(tick,md->last_thinktime)<MIN_MOBTHINKTIME)
return 0;
md->last_thinktime=tick;
@@ -1898,19 +1898,20 @@ static int mob_ai_hard(int tid,unsigned int tick,int id,int data)
static int mob_ai_sub_lazy(void * key,void * data,va_list app)
{
struct mob_data *md=(struct mob_data *)data;
+ struct mob_data *mmd=NULL;
unsigned int tick;
va_list ap;
nullpo_retr(0, md);
nullpo_retr(0, app);
-
- ap=va_arg(app,va_list);
+ nullpo_retr(0, ap=va_arg(app,va_list));
if(md->bl.type!=BL_MOB)
return 0;
- if(!md->bl.type || md->bl.type!=BL_MOB)
- return 0;
+ if (md->master_id > 0) {
+ mmd = (struct mob_data *)map_id2bl(md->master_id); //������BOSS�̏��
+ }
tick=va_arg(ap,unsigned int);
@@ -1924,6 +1925,12 @@ static int mob_ai_sub_lazy(void * key,void * data,va_list app)
return 0;
}
+ // ��芪�������X�^�[�̏����i�Ăі߂����ꂽ���j
+ if(mmd && md->state.special_mob_ai == 0 && mmd->recall_flag == 1) {
+ mob_ai_sub_hard_slavemob (md,tick);
+ return 0;
+ }
+
if(DIFF_TICK(md->next_walktime,tick)<0 &&
(mob_db[md->class_].mode&1) && mob_can_move(md) ){
@@ -2130,15 +2137,10 @@ int mob_catch_delete(struct mob_data *md,int type)
int mob_timer_delete(int tid, unsigned int tick, int id, int data)
{
- struct block_list *bl=map_id2bl(id);
- struct mob_data *md;
-
- nullpo_retr(0, bl);
+ struct mob_data *md=(struct mob_data *)map_id2bl(id);
+ nullpo_retr(0, md);
- md = (struct mob_data *)bl;
//for Alchemist CANNIBALIZE [Lupus]
-
-
mob_catch_delete(md,3);
return 0;
}
@@ -2476,10 +2478,6 @@ int mob_damage(struct block_list *src,struct mob_data *md,int damage,int type)
// [MouseJstr]
if((map[md->bl.m].flag.pvp == 0) || (battle_config.pvp_exp == 1)) {
-/* if((double)max_hp < tdmg)
- dmg_rate = ((double)max_hp) / tdmg;
- else dmg_rate = 1;*/
-
// �o���l�̕��z
for(i=0;i<DAMAGELOG_SIZE;i++){
int pid,base_exp,job_exp,flag=1,zeny=0;
@@ -2490,7 +2488,6 @@ int mob_damage(struct block_list *src,struct mob_data *md,int damage,int type)
if (battle_config.exp_calc_type == 0) {
// jAthena's exp formula
- // per = ((double)md->dmglog[i].dmg)*(9.+(double)((count > 6)? 6:count))/10./((double)max_hp) * dmg_rate;
per = ((double)md->dmglog[i].dmg)*(9.+(double)((count > 6)? 6:count))/10./tdmg;
temp = (double)mob_db[md->class_].base_exp * per;
base_exp = (temp > 2147483647.)? 0x7fffffff:(int)temp;
@@ -2552,7 +2549,7 @@ int mob_damage(struct block_list *src,struct mob_data *md,int damage,int type)
}
if((pid=tmpsd[i]->status.party_id)>0){ // �p�[�e�B�ɓ����Ă���
- int j=0;
+ int j;
for(j=0;j<pnum;j++) // �����p�[�e�B���X�g�ɂ��邩�ǂ���
if(pt[j].id==pid)
break;
@@ -3006,7 +3003,6 @@ int mob_countslave_sub(struct block_list *bl,va_list ap)
nullpo_retr(0, c=va_arg(ap,int *));
nullpo_retr(0, md = (struct mob_data *)bl);
-
if( md->master_id==id )
(*c)++;
return 0;
@@ -3196,7 +3192,9 @@ int mobskill_castend_id( int tid, unsigned int tick, int id,int data )
md->skilltimer=-1;
//���ق��Ԉُ�Ȃ�
if(md->sc_data){
- if(md->opt1>0 || md->sc_data[SC_DIVINA].timer != -1 || md->sc_data[SC_ROKISWEIL].timer != -1 || md->sc_data[SC_STEELBODY].timer != -1)
+ if(md->opt1>0 || md->sc_data[SC_DIVINA].timer != -1 ||
+ (!(mob_db[md->class_].mode & 0x20) && md->sc_data[SC_ROKISWEIL].timer != -1) ||
+ md->sc_data[SC_STEELBODY].timer != -1)
return 0;
if(md->sc_data[SC_AUTOCOUNTER].timer != -1 && md->skillid != KN_AUTOCOUNTER) //�I�[�g�J�E���^�[
return 0;
@@ -3279,7 +3277,9 @@ int mobskill_castend_pos( int tid, unsigned int tick, int id,int data )
md->skilltimer=-1;
if(md->sc_data){
- if(md->opt1>0 || md->sc_data[SC_DIVINA].timer != -1 || md->sc_data[SC_ROKISWEIL].timer != -1 || md->sc_data[SC_STEELBODY].timer != -1)
+ if(md->opt1>0 || md->sc_data[SC_DIVINA].timer != -1 ||
+ (!(mob_db[md->class_].mode & 0x20) && md->sc_data[SC_ROKISWEIL].timer != -1) ||
+ md->sc_data[SC_STEELBODY].timer != -1)
return 0;
if(md->sc_data[SC_AUTOCOUNTER].timer != -1 && md->skillid != KN_AUTOCOUNTER) //�I�[�g�J�E���^�[
return 0;
@@ -3354,7 +3354,9 @@ int mobskill_use_id(struct mob_data *md,struct block_list *target,int skill_idx)
// ���ق�ُ�
if(md->sc_data){
- if(md->opt1>0 || md->sc_data[SC_DIVINA].timer != -1 || md->sc_data[SC_ROKISWEIL].timer != -1 || md->sc_data[SC_STEELBODY].timer != -1)
+ if(md->opt1>0 || md->sc_data[SC_DIVINA].timer != -1 ||
+ (!(mob_db[md->class_].mode & 0x20) && md->sc_data[SC_ROKISWEIL].timer != -1) ||
+ md->sc_data[SC_STEELBODY].timer != -1)
return 0;
if(md->sc_data[SC_AUTOCOUNTER].timer != -1 && md->skillid != KN_AUTOCOUNTER) //�I�[�g�J�E���^�[
return 0;
@@ -3471,7 +3473,9 @@ int mobskill_use_pos( struct mob_data *md,
//���ق��Ԉُ�Ȃ�
if(md->sc_data){
- if(md->opt1>0 || md->sc_data[SC_DIVINA].timer != -1 || md->sc_data[SC_ROKISWEIL].timer != -1 || md->sc_data[SC_STEELBODY].timer != -1)
+ if(md->opt1>0 || md->sc_data[SC_DIVINA].timer != -1 ||
+ (!(mob_db[md->class_].mode & 0x20) && md->sc_data[SC_ROKISWEIL].timer != -1) ||
+ md->sc_data[SC_STEELBODY].timer != -1)
return 0;
if(md->sc_data[SC_AUTOCOUNTER].timer != -1 && md->skillid != KN_AUTOCOUNTER) //�I�[�g�J�E���^�[
return 0;
diff --git a/src/map/mob.h b/src/map/mob.h
index aa5753902..e5e95879e 100644
--- a/src/map/mob.h
+++ b/src/map/mob.h
@@ -139,6 +139,7 @@ int mobskill_event(struct mob_data *md,int flag);
int mobskill_castend_id( int tid, unsigned int tick, int id,int data );
int mobskill_castend_pos( int tid, unsigned int tick, int id,int data );
int mob_summonslave(struct mob_data *md2,int *value,int amount,int flag);
+int mob_countslave(struct mob_data *md);
int mob_gvmobcheck(struct map_session_data *sd, struct block_list *bl);
void mob_reload(void);
diff --git a/src/map/party.c b/src/map/party.c
index e33dc37cc..17f0cf5eb 100644
--- a/src/map/party.c
+++ b/src/map/party.c
@@ -175,7 +175,7 @@ int party_recv_info(struct party *sp)
for(i=0;i<MAX_PARTY;i++){ // sd�̐ݒ�
struct map_session_data *sd = map_id2sd(p->member[i].account_id);
- p->member[i].sd=(sd!=NULL && sd->status.party_id==p->party_id)?sd:NULL;
+ p->member[i].sd=(sd!=NULL && sd->status.party_id==p->party_id && !sd->state.waitingdisconnect)?sd:NULL;
}
clif_party_info(p,-1);
@@ -419,7 +419,7 @@ int party_recv_movemap(int party_id,int account_id,char *map,int online,int lv)
for(i=0;i<MAX_PARTY;i++){ // sd�Đݒ�
struct map_session_data *sd= map_id2sd(p->member[i].account_id);
- p->member[i].sd=(sd!=NULL && sd->status.party_id==p->party_id)?sd:NULL;
+ p->member[i].sd=(sd!=NULL && sd->status.party_id==p->party_id && !sd->state.waitingdisconnect)?sd:NULL;
}
party_send_xy_clear(p); // ���W�Ēʒm�v��
diff --git a/src/map/pc.c b/src/map/pc.c
index 3dcb08f3b..b9185c8b8 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -714,8 +714,7 @@ int pc_authok(int id, int login_id2, time_t connect_until_time, struct mmo_chars
sd->skilltimerskill[i].timer = -1;
sd->timerskill_count=0;
- for (i=0; i<MAX_SKILL; i++)
- sd->blockskill[i]=0;
+ memset(sd->blockskill,0,sizeof(sd->blockskill));
memset(&sd->dev,0,sizeof(struct square));
for(i = 0; i < 5; i++) {
@@ -2037,25 +2036,24 @@ int pc_skill(struct map_session_data *sd,int id,int level,int flag)
*/
int pc_blockskill_end(int tid,unsigned int tick,int id,int data)
{
- struct map_session_data *sd;
-
- nullpo_retr (-1, sd = map_id2sd(id));
- sd->blockskill[data] = 0;
+ struct map_session_data *sd = map_id2sd(id);
+ if (data <= 0 || data >= MAX_SKILL)
+ return 0;
+ if (sd) sd->blockskill[data] = 0;
return 1;
}
-void pc_blockskill_start (struct map_session_data *sd, int skillid, int tick)
+int pc_blockskill_start (struct map_session_data *sd, int skillid, int tick)
{
- nullpo_retv(sd);
+ nullpo_retr (-1, sd);
if (skillid >= 10000 && skillid < 10015)
skillid -= 9500;
else if (skillid < 1 || skillid > MAX_SKILL)
- return;
+ return -1;
sd->blockskill[skillid] = 1;
- add_timer(gettick()+tick,pc_blockskill_end,sd->bl.id,skillid);
- return;
+ return add_timer(gettick()+tick,pc_blockskill_end,sd->bl.id,skillid);
}
/*==========================================
@@ -2460,6 +2458,7 @@ int pc_useitem(struct map_session_data *sd,int n)
nullpo_retr(1, sd);
if(n >=0 && n < MAX_INVENTORY) {
+ char *script;
sd->itemid = sd->status.inventory[n].nameid;
amount = sd->status.inventory[n].amount;
if(sd->status.inventory[n].nameid <= 0 ||
@@ -2474,12 +2473,10 @@ int pc_useitem(struct map_session_data *sd,int n)
clif_useitemack(sd,n,0,0);
return 1;
}
-
- if(sd->inventory_data[n])
- run_script(sd->inventory_data[n]->use_script,0,sd->bl.id,0);
-
+ script = sd->inventory_data[n]->use_script;
amount = sd->status.inventory[n].amount;
clif_useitemack(sd,n,amount-1,1);
+ run_script(script,0,sd->bl.id,0);
pc_delitem(sd,n,1,1);
}
@@ -2878,40 +2875,53 @@ int pc_steal_coin(struct map_session_data *sd,struct block_list *bl)
//
//
/*==========================================
- * PC�̈ʒu�ݒ�
+ * PC���}�b�v���痣�E����
*------------------------------------------
*/
-int pc_setpos(struct map_session_data *sd,char *mapname_org,int x,int y,int clrtype)
-{
- char mapname[24];
- int m=0,disguise=0;
+int pc_remove_map(struct map_session_data *sd,int clrtype) {
nullpo_retr(0, sd);
- if(sd->chatID) // �`���b�g����o��
+ // map ��ɓo�^����Ă��Ȃ�
+ if(!sd->bl.prev)
+ return 1;
+
+ // �`���b�g����o��
+ if(sd->chatID)
chat_leavechat(sd);
- if(sd->trade_partner) // �����?����
+
+ // ����𒆒f����
+ if(sd->trade_partner)
trade_tradecancel(sd);
+
+ // �q�ɂ��J���Ă�Ȃ�ۑ�����
if(sd->state.storage_flag)
storage_guild_storage_quit(sd,0);
else
- storage_storage_quit(sd); // �q�ɂ��J���Ă�Ȃ�ۑ�����
+ storage_storage_quit(sd);
- if(sd->party_invite>0) // �p?�e�B?�U�����ۂ���
+ // �p�[�e�B���U�����ۂ���
+ if(sd->party_invite>0)
party_reply_invite(sd,sd->party_invite_account,0);
- if(sd->guild_invite>0) // �M���h?�U�����ۂ���
+
+ // �M���h���U�����ۂ���
+ if(sd->guild_invite>0)
guild_reply_invite(sd,sd->guild_invite,0);
- if(sd->guild_alliance>0) // �M���h����?�U�����ۂ���
+
+ // �M���h�������U�����ۂ���
+ if(sd->guild_alliance>0)
guild_reply_reqalliance(sd,sd->guild_alliance_account,0);
- skill_castcancel(&sd->bl,0); // �r����?
- pc_stop_walking(sd,0); // ?�s��?
- pc_stopattack(sd); // �U?��?
+ // check if we've been authenticated [celest]
+ //if (sd->state.auth) {
+ pc_stop_walking(sd,0); // ���s���f
+ pc_stopattack(sd); // �U�����f
+ pc_delinvincibletimer(sd); // ���G�^�C�}�[�폜
+ //}
- if(pc_issit(sd)) {
- pc_setstand(sd);
- skill_gangsterparadise(sd,0);
- }
+ // �u���[�h�X�g�b�v���I��点��
+ if(sd->sc_data[SC_BLADESTOP].timer!=-1)
+ status_change_end(&sd->bl,SC_BLADESTOP,-1);
if (sd->sc_count) {
if(sd->sc_data[SC_TRICKDEAD].timer != -1)
@@ -2933,6 +2943,35 @@ int pc_setpos(struct map_session_data *sd,char *mapname_org,int x,int y,int clrt
}
}
+ // check if we've been authenticated [celest]
+ //if (sd->state.auth)
+ skill_castcancel(&sd->bl,0); // �r�����f
+ skill_gangsterparadise(sd,0); // �M�����O�X�^�[�p���_�C�X�폜
+ skill_unit_move(&sd->bl,gettick(),0); // �X�L�����j�b�g���痣�E
+ skill_cleartimerskill(&sd->bl); // �^�C�}�[�X�L���N���A
+ skill_clear_unitgroup(&sd->bl); // �X�L�����j�b�g�O���[�v�̍폜
+
+ clif_clearchar_area(&sd->bl,clrtype&0xffff);
+ map_delblock(&sd->bl);
+ return 0;
+}
+
+/*==========================================
+ * PC�̈ʒu�ݒ�
+ *------------------------------------------
+ */
+int pc_setpos(struct map_session_data *sd,char *mapname_org,int x,int y,int clrtype)
+{
+ char mapname[24];
+ int m=0,disguise=0;
+
+ nullpo_retr(0, sd);
+
+ if(pc_issit(sd)) {
+ pc_setstand(sd);
+ skill_gangsterparadise(sd,0);
+ }
+
if(sd->status.option&2)
status_change_end(&sd->bl, SC_HIDING, -1);
if(sd->status.option&4)
@@ -2940,11 +2979,6 @@ int pc_setpos(struct map_session_data *sd,char *mapname_org,int x,int y,int clrt
if(sd->status.option&16384)
status_change_end(&sd->bl, SC_CHASEWALK, -1);
- if(sd->status.pet_id > 0 && sd->pd && sd->pet.intimate > 0) {
- pet_stopattack(sd->pd);
- pet_changestate(sd->pd,MS_IDLE,0);
- }
-
if(sd->disguise) { // clear disguises when warping [Valaris]
clif_clearchar(&sd->bl, 9);
disguise=sd->disguise;
@@ -2960,14 +2994,9 @@ int pc_setpos(struct map_session_data *sd,char *mapname_org,int x,int y,int clrt
m=map_mapname2mapid(mapname);
if(m<0){
- if(sd->mapname[0]){
+ //if(sd->mapname[0]){
int ip,port;
if(map_mapname2ipport(mapname,&ip,&port)==0){
- skill_stop_dancing(&sd->bl,1);
- skill_unit_move(&sd->bl,gettick(),0);
- clif_clearchar_area(&sd->bl,clrtype&0xffff);
- skill_gangsterparadise(sd,0);
- map_delblock(&sd->bl);
if(sd->status.pet_id > 0 && sd->pd) {
if(sd->pd->bl.m != m && sd->pet.intimate <= 0) {
pet_remove_map(sd);
@@ -2985,6 +3014,15 @@ int pc_setpos(struct map_session_data *sd,char *mapname_org,int x,int y,int clrt
map_delblock(&sd->pd->bl);
}
}
+
+ 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
+ status_change_clear(&sd->bl,1); // �X�e�[�^�X�ُ����������
+ skill_stop_dancing(&sd->bl,1); // �_���X/���t���f
+ pc_cleareventtimer(sd); // �C�x���g�^�C�}��j������
+ pc_delspiritball(sd,sd->spiritball,1); // �C���폜
+ pc_remove_map(sd,clrtype);
+
memcpy(sd->mapname,mapname,24);
sd->bl.x=x;
sd->bl.y=y;
@@ -2998,7 +3036,7 @@ int pc_setpos(struct map_session_data *sd,char *mapname_org,int x,int y,int clrt
chrif_changemapserver(sd, mapname, x, y, ip, port);
return 0;
}
- }
+ //}
#if 0
clif_authfail_fd(sd->fd,0); // cancel
clif_setwaitclose(sd->fd);
@@ -3019,12 +3057,17 @@ int pc_setpos(struct map_session_data *sd,char *mapname_org,int x,int y,int clrt
} while(map_getcell(m,x,y,CELL_CHKNOPASS));
}
- if(sd->mapname[0] && sd->bl.prev != NULL){
- skill_unit_move(&sd->bl,gettick(),0);
- clif_clearchar_area(&sd->bl,clrtype&0xffff);
- skill_gangsterparadise(sd,0);
- map_delblock(&sd->bl);
- // pet
+ if(m == sd->bl.m) {
+ // �����}�b�v�Ȃ̂Ń_���X���j�b�g�����p��
+ sd->to_x = x;
+ sd->to_y = y;
+ skill_stop_dancing(&sd->bl, 2); //�ړ���Ƀ��j�b�g���ړ����邩�ǂ����̔��f������
+ } else {
+ // �Ⴄ�}�b�v�Ȃ̂Ń_���X���j�b�g�폜
+ skill_stop_dancing(&sd->bl, 1);
+ }
+ if(sd->bl.prev != NULL){
+ pc_remove_map(sd,clrtype);
if(sd->status.pet_id > 0 && sd->pd) {
if(sd->pd->bl.m != m && sd->pet.intimate <= 0) {
pet_remove_map(sd);
@@ -3034,9 +3077,6 @@ int pc_setpos(struct map_session_data *sd,char *mapname_org,int x,int y,int clrt
sd->petDB = NULL;
if(battle_config.pet_status_support)
status_calc_pc(sd,2);
- pc_makesavestatus(sd);
- chrif_save(sd);
- storage_storage_save(sd);
}
else if(sd->pet.intimate > 0) {
pet_stopattack(sd->pd);
@@ -3053,13 +3093,8 @@ int pc_setpos(struct map_session_data *sd,char *mapname_org,int x,int y,int clrt
memcpy(sd->mapname,mapname,24);
sd->bl.m = m;
- sd->to_x = x;
- sd->to_y = y;
-
- // moved and changed dance effect stopping
-
- sd->bl.x = x;
- sd->bl.y = y;
+ sd->bl.x = x;
+ sd->bl.y = y;
if(sd->status.pet_id > 0 && sd->pd && sd->pet.intimate > 0) {
sd->pd->bl.m = m;
diff --git a/src/map/pc.h b/src/map/pc.h
index 1e5b3408f..b1db3a254 100644
--- a/src/map/pc.h
+++ b/src/map/pc.h
@@ -65,6 +65,7 @@ int pc_setsavepoint(struct map_session_data*,char*,int,int);
int pc_randomwarp(struct map_session_data *sd,int type);
int pc_memo(struct map_session_data *sd,int i);
int pc_randomwalk(struct map_session_data*,int tick);
+int pc_remove_map(struct map_session_data *sd,int clrtype);
int pc_checkadditem(struct map_session_data*,int,int);
int pc_inventoryblank(struct map_session_data*);
@@ -92,7 +93,7 @@ int pc_bonus3(struct map_session_data *sd,int,int,int,int);
int pc_bonus4(struct map_session_data *sd,int,int,int,int,int);
int pc_skill(struct map_session_data*,int,int,int);
-void pc_blockskill_start (struct map_session_data*,int,int); // [celest]
+int pc_blockskill_start (struct map_session_data*,int,int); // [celest]
int pc_insert_card(struct map_session_data *sd,int idx_card,int idx_equip);
@@ -202,6 +203,7 @@ int pc_delspiritball(struct map_session_data *sd,int,int);
int pc_eventtimer(int tid,unsigned int tick,int id,int data); // for npc_dequeue
+int pc_readdb(void);
int do_init_pc(void);
void do_final_pc(void);
diff --git a/src/map/pet.c b/src/map/pet.c
index 87257f6be..351782e7f 100644
--- a/src/map/pet.c
+++ b/src/map/pet.c
@@ -816,7 +816,7 @@ int pet_recv_petdata(int account_id,struct s_pet *p,int flag)
pet_birth_process(sd);
else {
pet_data_init(sd);
- if(sd->bl.prev != NULL) {
+ if(sd->pd && sd->bl.prev != NULL) {
map_addblock(&sd->pd->bl);
clif_spawnpet(sd->pd);
clif_send_petdata(sd,0,0);
diff --git a/src/map/pet.h b/src/map/pet.h
index 6f532b140..4d81583b1 100644
--- a/src/map/pet.h
+++ b/src/map/pet.h
@@ -61,6 +61,7 @@ int pet_mag_timer(int tid,unsigned int tick,int id,int data); // [Valaris]
int pet_heal_timer(int tid,unsigned int tick,int id,int data); // [Valaris]
int pet_skillattack_timer(int tid,unsigned int tick,int id,int data); // [Valaris]
+int read_petdb();
int do_init_pet(void);
int do_final_pet(void);
diff --git a/src/map/skill.c b/src/map/skill.c
index 8420f0ac5..40626fa57 100644
--- a/src/map/skill.c
+++ b/src/map/skill.c
@@ -2757,20 +2757,16 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s
* �X�L���g�p�i�r�������AID�w��x���n�j
*------------------------------------------
*/
-int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag )
+int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, int skillid, int skilllv, unsigned int tick, int flag)
{
- struct map_session_data *sd=NULL;
- struct map_session_data *dstsd=NULL;
- struct mob_data *md=NULL;
- struct mob_data *dstmd=NULL;
- int i,abra_skillid=0,abra_skilllv;
- int sc_def_vit,sc_def_mdef;
- int sc_dex,sc_luk;
- //�N���X�`�F���W�p�{�X�����X�^?ID
- int changeclass[]={1038,1039,1046,1059,1086,1087,1112,1115
- ,1157,1159,1190,1272,1312,1373,1492};
- int poringclass[]={1002};
-
+ struct map_session_data *sd = NULL;
+ struct map_session_data *dstsd = NULL;
+ struct mob_data *md = NULL;
+ struct mob_data *dstmd = NULL;
+ int i;
+ int sc_def_vit, sc_def_mdef;
+ int sc_dex, sc_luk;
+
if(skillid < 0)
{ // remove the debug print when this case is finished
printf("skill_castend_damage_id: skillid=%i\ncall: %p %p %i %i %i %i",skillid,
@@ -2782,23 +2778,24 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
nullpo_retr(1, src);
nullpo_retr(1, bl);
- if(src->type==BL_PC)
- sd=(struct map_session_data *)src;
- else if(src->type==BL_MOB)
- md=(struct mob_data *)src;
+ if (src->type == BL_PC) {
+ nullpo_retr (1, sd = (struct map_session_data *)src);
+ } else if (src->type == BL_MOB) {
+ nullpo_retr (1, md = (struct mob_data *)src);
+ }
- sc_dex=status_get_mdef(bl);
- sc_luk=status_get_luk(bl);
- sc_def_vit = status_get_sc_def_vit(bl);
+ sc_dex = status_get_mdef (bl);
+ sc_luk = status_get_luk (bl);
+ sc_def_vit = status_get_sc_def_vit (bl);
sc_def_mdef = status_get_sc_def_mdef (bl);
- if(bl->type==BL_PC){
- nullpo_retr(1, dstsd=(struct map_session_data *)bl);
- }else if(bl->type==BL_MOB){
- nullpo_retr(1, dstmd=(struct mob_data *)bl);
+ if (bl->type == BL_PC){
+ nullpo_retr (1, dstsd = (struct map_session_data *)bl);
+ } else if (bl->type == BL_MOB){
+ nullpo_retr (1, dstmd = (struct mob_data *)bl);
}
- if(bl == NULL || bl->prev == NULL)
+ if(bl->prev == NULL)
return 1;
if(sd && pc_isdead(sd))
return 1;
@@ -2814,44 +2811,42 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
{
case AL_HEAL: /* �q?�� */
{
- int heal=skill_calc_heal( src, skilllv );
+ int heal = skill_calc_heal(src, skilllv);
int heal_get_jobexp;
int skill;
- struct pc_base_job s_class;
-
- if( dstsd && dstsd->special_state.no_magic_damage )
+
+ if (skilllv > 10)
+ heal = 9999; //9999�q�[��
+ if (dstsd && dstsd->special_state.no_magic_damage)
heal=0; /* ?��峃J?�h�i�q?���ʂO�j */
- if (sd){
- s_class = pc_calc_base_job(sd->status.class_);
- if((skill=pc_checkskill(sd,HP_MEDITATIO))>0) // ���f�B�e�C�e�B�I
- heal += heal*skill*2/100;
- if(sd && dstsd && sd->status.partner_id == dstsd->status.char_id && s_class.job == 23 && sd->status.sex == 0) //������?�ۂ�PC�A?�ۂ������̃p?�g�i?�A�������X�p�m�r�A���������Ȃ�
+ if (sd) {
+ if ((skill = pc_checkskill(sd, HP_MEDITATIO)) > 0) // ���f�B�e�C�e�B�I
+ heal += heal * skill * 2 / 100;
+ if (sd && dstsd && sd->status.partner_id == dstsd->status.char_id &&
+ pc_calc_base_job2(sd->status.class_) == 23 && sd->status.sex == 0) //������?�ۂ�PC�A?�ۂ������̃p?�g�i?�A�������X�p�m�r�A���������Ȃ�
heal = heal*2; //�X�p�m�r�̉ł��U�߂Ƀq?�������2�{�ɂȂ�
}
-
- clif_skill_nodamage(src,bl,skillid,heal,1);
+ clif_skill_nodamage (src, bl, skillid, heal, 1);
heal_get_jobexp = battle_heal(NULL,bl,heal,0,0);
// JOB??�l�l��
- if(src->type == BL_PC && bl->type==BL_PC && heal > 0 && src != bl && battle_config.heal_exp > 0){
+ if(sd && dstsd && heal > 0 && sd != dstsd && battle_config.heal_exp > 0){
heal_get_jobexp = heal_get_jobexp * battle_config.heal_exp / 100;
- if(heal_get_jobexp <= 0)
+ if (heal_get_jobexp <= 0)
heal_get_jobexp = 1;
- pc_gainexp((struct map_session_data *)src,0,heal_get_jobexp);
+ pc_gainexp (sd, 0, heal_get_jobexp);
}
}
break;
case ALL_RESURRECTION: /* ���U���N�V���� */
- if(bl->type==BL_PC){
- int per=0;
- struct map_session_data *tsd = (struct map_session_data*)bl;
- nullpo_retr(1, tsd);
- if( (map[bl->m].flag.pvp) && tsd->pvp_point<0 )
+ if(dstsd) {
+ int per = 0;
+ if (map[bl->m].flag.pvp && dstsd->pvp_point < 0)
break; /* PVP�ŕ����s�”\?�� */
- if(pc_isdead(tsd)){ /* ���S���� */
+ if (pc_isdead(dstsd)) { /* ���S���� */
clif_skill_nodamage(src,bl,skillid,skilllv,1);
switch(skilllv){
case 1: per=10; break;
@@ -2859,60 +2854,58 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
case 3: per=50; break;
case 4: per=80; break;
}
- tsd->status.hp=tsd->status.max_hp*per/100;
- if(tsd->status.hp<=0) tsd->status.hp=1;
- if(tsd->special_state.restart_full_recover ){ /* �I�V���X�J?�h */
- tsd->status.hp=tsd->status.max_hp;
- tsd->status.sp=tsd->status.max_sp;
+ dstsd->status.hp = dstsd->status.max_hp * per / 100;
+ if (dstsd->status.hp <= 0) dstsd->status.hp = 1;
+ if (dstsd->special_state.restart_full_recover) { /* �I�V���X�J?�h */
+ dstsd->status.hp = dstsd->status.max_hp;
+ dstsd->status.sp = dstsd->status.max_sp;
}
- pc_setstand(tsd);
+ pc_setstand(dstsd);
if(battle_config.pc_invincible_time > 0)
- pc_setinvincibletimer(tsd,battle_config.pc_invincible_time);
- clif_updatestatus(tsd,SP_HP);
- clif_resurrection(&tsd->bl,1);
- if(src != bl && sd && battle_config.resurrection_exp > 0) {
+ pc_setinvincibletimer(dstsd, battle_config.pc_invincible_time);
+ clif_updatestatus(dstsd, SP_HP);
+ clif_resurrection(bl, 1);
+ if(sd && sd != dstsd && battle_config.resurrection_exp > 0) {
int exp = 0,jexp = 0;
- int lv = tsd->status.base_level - sd->status.base_level, jlv = tsd->status.job_level - sd->status.job_level;
+ int lv = dstsd->status.base_level - sd->status.base_level, jlv = dstsd->status.job_level - sd->status.job_level;
if(lv > 0) {
- exp = (int)((double)tsd->status.base_exp * (double)lv * (double)battle_config.resurrection_exp / 1000000.);
- if(exp < 1) exp = 1;
+ exp = (int)((double)dstsd->status.base_exp * (double)lv * (double)battle_config.resurrection_exp / 1000000.);
+ if (exp < 1) exp = 1;
}
if(jlv > 0) {
- jexp = (int)((double)tsd->status.job_exp * (double)lv * (double)battle_config.resurrection_exp / 1000000.);
- if(jexp < 1) jexp = 1;
+ jexp = (int)((double)dstsd->status.job_exp * (double)lv * (double)battle_config.resurrection_exp / 1000000.);
+ if (jexp < 1) jexp = 1;
}
if(exp > 0 || jexp > 0)
- pc_gainexp(sd,exp,jexp);
+ pc_gainexp (sd, exp, jexp);
}
}
}
break;
case AL_DECAGI: /* ���x���� */
- if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
+ if (dstsd && dstsd->special_state.no_magic_damage)
break;
- if( rand()%100 < (50+skilllv*3+(status_get_lv(src)+status_get_int(src)/5)-sc_def_mdef) ) {
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0);
+ if (rand() % 100 < (50 + skilllv * 3 + (status_get_lv(src) + status_get_int(src) / 5) - sc_def_mdef)) {
+ 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 AL_CRUCIS:
- if(flag&1) {
- int race = status_get_race(bl),ele = status_get_elem_type(bl);
- if(battle_check_target(src,bl,BCT_ENEMY) && (race == 6 || battle_check_undead(race,ele))) {
- int slv=status_get_lv(src),tlv=status_get_lv(bl),rate;
- rate = 25 + skilllv*2 + slv - tlv;
- if(rand()%100 < rate)
+ if (flag & 1) {
+ int race = status_get_race (bl), ele = status_get_elem_type (bl);
+ if (battle_check_target (src, bl, BCT_ENEMY) && (race == 6 || battle_check_undead (race, ele))) {
+ int slv = status_get_lv (src),tlv = status_get_lv (bl);
+ int rate = 25 + skilllv*2 + slv - tlv;
+ if (rand()%100 < rate)
status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,0,0);
}
- }
- else {
- int range = 15;
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ } else {
+ clif_skill_nodamage(src, bl, skillid, skilllv, 1);
map_foreachinarea(skill_area_sub,
- src->m,src->x-range,src->y-range,src->x+range,src->y+range,0,
- src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
+ src->m, src->x-15, src->y-15, src->x+15, src->y+15, 0,
+ src, skillid, skilllv, tick, flag|BCT_ENEMY|1,
skill_castend_nodamage_id);
}
break;
@@ -2920,78 +2913,90 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
case PR_LEXDIVINA: /* ���b�N�X�f�B�r?�i */
{
struct status_change *sc_data = status_get_sc_data(bl);
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
+ clif_skill_nodamage (src, bl, skillid, skilllv, 1);
+ if (dstsd && dstsd->special_state.no_magic_damage)
break;
- if(sc_data && sc_data[SC_DIVINA].timer != -1)
- status_change_end(bl,SC_DIVINA,-1);
- else if( rand()%100 < sc_def_vit ) {
+ if (sc_data && sc_data[SC_DIVINA].timer != -1)
+ status_change_end(bl,SC_DIVINA, -1);
+ else if (rand() % 100 < sc_def_vit) {
status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0);
}
}
break;
+
case SA_ABRACADABRA:
- //require 1 yellow gemstone even with mistress card or Into the Abyss
- if ((i=pc_search_inventory(sd, 715)) < 0 ) { //bug fixed by Lupus (item pos can be 0, too!)
- clif_skill_fail(sd,sd->skillid,0,0);
- break;
+ {
+ int skill, abra_skillid = 0, abra_skilllv;
+ //require 1 yellow gemstone even with mistress card or Into the Abyss
+ if ((i = pc_search_inventory(sd, 715)) < 0 ) { //bug fixed by Lupus (item pos can be 0, too!)
+ clif_skill_fail(sd,sd->skillid,0,0);
+ break;
+ }
+ pc_delitem(sd, i, 1, 0);
+ do {
+ abra_skillid = skill_abra_dataset(skilllv);
+ } while (abra_skillid == 0);
+ skill = pc_checkskill(sd,SA_ABRACADABRA);
+ abra_skilllv = skill_get_max(abra_skillid) > skill ? skill : skill_get_max(abra_skillid);
+ clif_skill_nodamage (src, bl, skillid, skilllv, 1);
+ sd->skillitem = abra_skillid;
+ sd->skillitemlv = abra_skilllv;
+ clif_item_skill (sd, abra_skillid, abra_skilllv, "Abracadabra");
}
- //pc_delitem(sd, pc_search_inventory(sd, 715), 1, 0);
- pc_delitem(sd, i, 1, 0);
- //
- do{
- abra_skillid=skill_abra_dataset(skilllv);
- }while(abra_skillid == 0);
- abra_skilllv=skill_get_max(abra_skillid)>pc_checkskill(sd,SA_ABRACADABRA)?pc_checkskill(sd,SA_ABRACADABRA):skill_get_max(abra_skillid);
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- sd->skillitem=abra_skillid;
- sd->skillitemlv=abra_skilllv;
- clif_item_skill(sd,abra_skillid,abra_skilllv,"�A�u���J�_�u��");
break;
+
case SA_COMA:
clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
- break;
- if(dstsd){
- dstsd->status.hp=1;
- dstsd->status.sp=1;
- clif_updatestatus(dstsd,SP_HP);
- clif_updatestatus(dstsd,SP_SP);
+ if (dstsd) {
+ if (dstsd->special_state.no_magic_damage)
+ break;
+ dstsd->status.hp = 1;
+ dstsd->status.sp = 1;
+ clif_updatestatus(dstsd, SP_HP);
+ clif_updatestatus(dstsd, SP_SP);
}
- if(dstmd) dstmd->hp=1;
+ if(dstmd) dstmd->hp = 1;
break;
case SA_FULLRECOVERY:
clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
- break;
- if(dstsd) pc_heal(dstsd,dstsd->status.max_hp,dstsd->status.max_sp);
- if(dstmd) dstmd->hp=status_get_max_hp(&dstmd->bl);
+ if (dstsd) {
+ if (dstsd->special_state.no_magic_damage)
+ break;
+ pc_heal (dstsd, dstsd->status.max_hp, dstsd->status.max_sp);
+ }
+ if (dstmd) dstmd->hp = status_get_max_hp(bl);
break;
case SA_SUMMONMONSTER:
clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if (sd) mob_once_spawn(sd,map[sd->bl.m].name,sd->bl.x,sd->bl.y,"--ja--",-1,1,"");
+ if (sd) mob_once_spawn(sd,map[src->m].name,src->x,src->y,"--ja--",-1,1,"");
break;
case SA_LEVELUP:
clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if (sd && pc_nextbaseexp(sd)) pc_gainexp(sd,pc_nextbaseexp(sd)*10/100,0);
+ if (sd && pc_nextbaseexp(sd)) pc_gainexp(sd, pc_nextbaseexp(sd) * 10 / 100, 0);
break;
-
case SA_INSTANTDEATH:
clif_skill_nodamage(src,bl,skillid,skilllv,1);
if (sd) pc_damage(NULL,sd,sd->status.max_hp);
break;
-
case SA_QUESTION:
case SA_GRAVITY:
clif_skill_nodamage(src,bl,skillid,skilllv,1);
break;
case SA_CLASSCHANGE:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(dstmd) mob_class_change(dstmd,changeclass);
+ {
+ //�N���X�`�F���W�p�{�X�����X�^?ID
+ int changeclass[]={1038,1039,1046,1059,1086,1087,1112,1115
+ ,1157,1159,1190,1272,1312,1373,1492};
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ if(dstmd) mob_class_change(dstmd,changeclass);
+ }
break;
case SA_MONOCELL:
- clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(dstmd) mob_class_change(dstmd,poringclass);
+ {
+ int poringclass[]={1002};
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ if(dstmd) mob_class_change(dstmd,poringclass);
+ }
break;
case SA_DEATH:
clif_skill_nodamage(src,bl,skillid,skilllv,1);
@@ -3008,15 +3013,16 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
break;
case SA_TAMINGMONSTER:
clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if (dstmd){
- for(i=0;i<MAX_PET_DB;i++){
- if(dstmd->class_ == pet_db[i].class_){
- pet_catch_process1(sd,dstmd->class_);
+ if (dstmd) {
+ for (i = 0; i < MAX_PET_DB; i++) {
+ if (dstmd->class_ == pet_db[i].class_) {
+ pet_catch_process1 (sd, dstmd->class_);
break;
}
}
}
break;
+
case AL_INCAGI: /* ���x?�� */
case AL_BLESSING: /* �u���b�V���O */
case PR_SLOWPOISON:
@@ -3025,23 +3031,22 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
case PR_SUFFRAGIUM: /* �T�t���M�E�� */
case PR_BENEDICTIO: /* ��?�~�� */
case CR_PROVIDENCE: /* �v�����B�f���X */
- if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage ){
+ if (dstsd && dstsd->special_state.no_magic_damage)
clif_skill_nodamage(src,bl,skillid,skilllv,1);
- }else{
+ else {
status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
clif_skill_nodamage(src,bl,skillid,skilllv,1);
}
break;
case CG_MARIONETTE: /* �}���I�l�b�g�R���g��?�� */
- if(sd && dstsd){
+ if (sd && dstsd){
struct status_change *sc_data = status_get_sc_data(src);
struct status_change *tsc_data = status_get_sc_data(bl);
int sc = SkillStatusChangeTable[skillid];
int sc2 = SC_MARIONETTE2;
- if((dstsd->bl.type!=BL_PC)
- || (sd->bl.id == dstsd->bl.id)
+ if ((sd == dstsd)
|| (!sd->status.party_id)
|| (sd->status.party_id != dstsd->status.party_id)) {
clif_skill_fail(sd,skillid,0,0);
@@ -3049,12 +3054,12 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
return 1;
}
if(sc_data && tsc_data){
- if(sc_data[sc].timer == -1 && tsc_data[sc2].timer == -1) {
+ if (sc_data[sc].timer == -1 && tsc_data[sc2].timer == -1) {
status_change_start (src,sc,skilllv,0,bl->id,0,skill_get_time(skillid,skilllv),0);
status_change_start (bl,sc2,skilllv,0,src->id,0,skill_get_time(skillid,skilllv),0);
}
else if (sc_data[sc].timer != -1 && tsc_data[sc2].timer != -1 &&
- sc_data[sc].val3 == bl->id && tsc_data[sc2].val3 == src->id) {
+ sc_data[sc].val3 == bl->id && tsc_data[sc2].val3 == src->id) {
status_change_end(src, sc, -1);
status_change_end(bl, sc2, -1);
}
@@ -3072,16 +3077,18 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
case SA_FROSTWEAPON:
case SA_LIGHTNINGLOADER:
case SA_SEISMICWEAPON:
- if(bl->type==BL_PC) {
- struct map_session_data *sd2 = (struct map_session_data *)bl;
- if (sd2->special_state.no_magic_damage) {
+ if (dstsd) {
+ if (dstsd->special_state.no_magic_damage) {
clif_skill_nodamage(src,bl,skillid,skilllv,0);
break;
}
- if(sd2->status.weapon==0 || (sd && sd->status.party_id > 0 && sd->status.party_id != sd2->status.party_id) ||
- sd2->sc_data[SC_FLAMELAUNCHER].timer!=-1 || sd2->sc_data[SC_FROSTWEAPON].timer!=-1 ||
- sd2->sc_data[SC_LIGHTNINGLOADER].timer!=-1 || sd2->sc_data[SC_SEISMICWEAPON].timer!=-1 ||
- sd2->sc_data[SC_ENCPOISON].timer!=-1) {
+ if(dstsd->status.weapon == 0 ||
+ (sd && sd->status.party_id > 0 && sd->status.party_id != dstsd->status.party_id) ||
+ dstsd->sc_data[SC_FLAMELAUNCHER].timer != -1 ||
+ dstsd->sc_data[SC_FROSTWEAPON].timer != -1 ||
+ dstsd->sc_data[SC_LIGHTNINGLOADER].timer != -1 ||
+ dstsd->sc_data[SC_SEISMICWEAPON].timer != -1 ||
+ dstsd->sc_data[SC_ENCPOISON].timer != -1) {
if (sd) clif_skill_fail(sd,skillid,0,0);
clif_skill_nodamage(src,bl,skillid,skilllv,0);
break;
@@ -3090,14 +3097,12 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
if(skilllv < 5 && rand()%100 > (60+skilllv*10) ) { //fixed by Lupus (4 -> 5) or else it has 100% success even at lv4
if (sd) clif_skill_fail(sd,skillid,0,0);
clif_skill_nodamage(src,bl,skillid,skilllv,0);
- if(bl->type==BL_PC && battle_config.equipment_breaking) {
- struct map_session_data *sd2 = (struct map_session_data *)bl;
- if(sd && sd != sd2) clif_displaymessage(sd->fd,"You broke target's weapon");
- pc_breakweapon(sd2);
+ if(dstsd && battle_config.equipment_breaking) {
+ if(sd && sd != dstsd) clif_displaymessage(sd->fd,"You broke target's weapon");
+ pc_breakweapon(dstsd);
}
break;
- }
- else {
+ } else {
status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
clif_skill_nodamage(src,bl,skillid,skilllv,1);
}
@@ -3105,18 +3110,20 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
case PR_ASPERSIO: /* �A�X�y���V�I */
clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
+ if (dstsd && dstsd->special_state.no_magic_damage)
break;
- if(bl->type==BL_MOB)
+ if (dstmd)
break;
status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
break;
+
case PR_KYRIE: /* �L���G�G���C�\�� */
clif_skill_nodamage(bl,bl,skillid,skilllv,1);
- if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
+ if (dstsd && dstsd->special_state.no_magic_damage)
break;
status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
break;
+
case KN_AUTOCOUNTER: /* �I?�g�J�E���^? */
case KN_TWOHANDQUICKEN: /* �c?�n���h�N�C�b�P�� */
case CR_SPEARQUICKEN: /* �X�s�A�N�C�b�P�� */
@@ -3146,6 +3153,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 SM_ENDURE: /* �C���f���A */
clif_skill_nodamage(src,bl,skillid,skilllv,1);
status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
@@ -3156,26 +3164,25 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
case SM_AUTOBERSERK: // Celest
{
struct status_change *tsc_data = status_get_sc_data(bl);
- int sc=SkillStatusChangeTable[skillid];
+ int sc = SkillStatusChangeTable[skillid];
clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if( tsc_data ){
- if( tsc_data[sc].timer==-1 )
- status_change_start(bl,sc,skilllv,0,0,0,0,0);
- else
- status_change_end(bl, sc, -1);
- }
+ if (tsc_data && tsc_data[sc].timer != -1)
+ status_change_end(bl, sc, -1);
+ else
+ status_change_start(bl,sc,skilllv,0,0,0,0,0);
}
break;
case AS_ENCHANTPOISON: // Prevent spamming [Valaris]
- if(bl->type==BL_PC) {
- struct map_session_data *sd2=(struct map_session_data *)bl;
- if(sd2->sc_data[SC_FLAMELAUNCHER].timer!=-1 || sd2->sc_data[SC_FROSTWEAPON].timer!=-1 ||
- sd2->sc_data[SC_LIGHTNINGLOADER].timer!=-1 || sd2->sc_data[SC_SEISMICWEAPON].timer!=-1 ||
- sd2->sc_data[SC_ENCPOISON].timer!=-1) {
- clif_skill_nodamage(src,bl,skillid,skilllv,0);
- clif_skill_fail(sd,skillid,0,0);
- break;
+ if (dstsd) {
+ if(dstsd->sc_data[SC_FLAMELAUNCHER].timer != -1 ||
+ dstsd->sc_data[SC_FROSTWEAPON].timer != -1 ||
+ dstsd->sc_data[SC_LIGHTNINGLOADER].timer != -1 ||
+ dstsd->sc_data[SC_SEISMICWEAPON].timer != -1 ||
+ dstsd->sc_data[SC_ENCPOISON].timer != -1) {
+ clif_skill_nodamage(src,bl,skillid,skilllv,0);
+ clif_skill_fail(sd,skillid,0,0);
+ break;
}
}
clif_skill_nodamage(src,bl,skillid,skilllv,1);
@@ -3214,8 +3221,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
struct status_change *sc_data = status_get_sc_data(bl);
/* MVPmob�ƕs���ɂ�?���Ȃ� */
- if((bl->type==BL_MOB && status_get_mode(bl)&0x20) || battle_check_undead(status_get_race(bl),status_get_elem_type(bl))) //�s���ɂ�?���Ȃ�
- {
+ if((dstmd && status_get_mode(bl)&0x20) || battle_check_undead(status_get_race(bl),status_get_elem_type(bl))) { //�s���ɂ�?���Ȃ�
map_freeblock_unlock();
return 1;
}
@@ -3240,8 +3246,6 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
if(dstmd) {
int range = skill_get_range(skillid,skilllv);
- if(range < 0)
- range = status_get_range(src) - (range + 1);
dstmd->state.provoke_flag = src->id;
mob_target(dstmd,src,range);
}
@@ -3251,27 +3255,27 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
case CR_DEVOTION: /* �f�B�{?�V���� */
if(sd && dstsd){
//?����{�q�̏ꍇ�̌��̐E�Ƃ��Z�o����
- struct pc_base_job dst_s_class = pc_calc_base_job(dstsd->status.class_);
-
- int lv = sd->status.base_level-dstsd->status.base_level;
- lv = (lv<0)?-lv:lv;
- if((dstsd->bl.type!=BL_PC) // �����PC����Ȃ��Ƃ���
- ||(sd->bl.id == dstsd->bl.id) // ���肪�����͂���
- ||(lv > battle_config.devotion_level_difference) // ���x�����}10�܂�
- ||(!sd->status.party_id && !sd->status.guild_id) // PT�ɂ��M���h�ɂ���?�����͂���
- ||((sd->status.party_id != dstsd->status.party_id) // �����p?�e�B?���A
- &&(sd->status.guild_id != dstsd->status.guild_id)) // �����M���h����Ȃ��Ƃ���
- ||(dst_s_class.job==14||dst_s_class.job==21)){ // �N���Z����
+ int s_class = pc_calc_base_job2 (dstsd->status.class_);
+
+ int lv = sd->status.base_level - dstsd->status.base_level;
+ if (lv < 0) lv = -lv;
+ if ((sd == dstsd) // �����PC����Ȃ��Ƃ���
+ || (sd->bl.id == dstsd->bl.id) // ���肪�����͂���
+ || (lv > battle_config.devotion_level_difference) // ���x�����}10�܂�
+ || (!sd->status.party_id && !sd->status.guild_id) // PT�ɂ��M���h�ɂ���?�����͂���
+ || ((sd->status.party_id != dstsd->status.party_id) // �����p?�e�B?���A
+ &&(sd->status.guild_id != dstsd->status.guild_id)) // �����M���h����Ȃ��Ƃ���
+ || (s_class == 14 || s_class == 21)) { // �N���Z����
clif_skill_fail(sd,skillid,0,0);
map_freeblock_unlock();
return 1;
}
- for(i=0;i<skilllv;i++){
- if(!sd->dev.val1[i]){ // �󂫂�������������
+ for (i = 0; i < skilllv; i++) {
+ if (!sd->dev.val1[i]) { // �󂫂�������������
sd->dev.val1[i] = bl->id;
sd->dev.val2[i] = bl->id;
break;
- }else if(i==skilllv-1){ // �󂫂��Ȃ�����
+ } else if (i == skilllv - 1) { // �󂫂��Ȃ�����
clif_skill_fail(sd,skillid,0,0);
map_freeblock_unlock();
return 1;
@@ -3281,30 +3285,34 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
clif_devotion(sd,bl->id);
status_change_start(bl,SkillStatusChangeTable[skillid],src->id,1,0,0,1000*(15+15*skilllv),0 );
}
- else clif_skill_fail(sd,skillid,0,0);
+ else clif_skill_fail(sd,skillid,0,0);
break;
+
case MO_CALLSPIRITS: // ?��
if(sd) {
clif_skill_nodamage(src,bl,skillid,skilllv,1);
pc_addspiritball(sd,skill_get_time(skillid,skilllv),skilllv);
}
break;
+
case CH_SOULCOLLECT: // ��?��
if(sd) {
clif_skill_nodamage(src,bl,skillid,skilllv,1);
- for(i=0;i<5;i++)
+ for (i = 0; i < 5; i++)
pc_addspiritball(sd,skill_get_time(skillid,skilllv),5);
}
break;
+
case MO_BLADESTOP: // ���n���
clif_skill_nodamage(src,bl,skillid,skilllv,1);
status_change_start(src,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
break;
+
case MO_ABSORBSPIRITS: // ?�D
i=0;
- if(dstsd) {
- if((sd && sd == dstsd) || map[src->m].flag.pvp || map[src->m].flag.gvg) {
- if(dstsd->spiritball > 0) {
+ if (dstsd) {
+ if ((sd && sd == dstsd) || map[src->m].flag.pvp || map[src->m].flag.gvg) {
+ if (dstsd->spiritball > 0) {
clif_skill_nodamage(src,bl,skillid,skilllv,1);
i = dstsd->spiritball * 7;
pc_delspiritball(dstsd,dstsd->spiritball,0);
@@ -3314,14 +3322,14 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
i = sd->status.max_sp - sd->status.sp;
}
}
- } else if (dstmd){ //?�ۂ������X�^?�̏ꍇ
+ } else if (dstmd) { //?�ۂ������X�^?�̏ꍇ
//20%�̊m����?�ۂ�Lv*2��SP���񕜂���B���������Ƃ��̓^?�Q�b�g(��?�D?)��????!!
- if(rand()%100<20){
- i=2*mob_db[dstmd->class_].lv;
+ if(rand() % 100 < 20) {
+ i = 2 * mob_db[dstmd->class_].lv;
mob_target(dstmd,src,0);
}
}
- if(i && sd){
+ if (i && sd){
sd->status.sp += i;
clif_heal(sd->fd,SP_SP,i);
} else clif_skill_nodamage(src,bl,skillid,skilllv,0);
@@ -3361,11 +3369,10 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
break;
case BS_HAMMERFALL: /* �n���}?�t�H?�� */
clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_weapon_damage )
+ if(dstsd && dstsd->special_state.no_weapon_damage)
break;
- if( rand()%100 < (20+ 10*skilllv)*sc_def_vit/100 ) {
+ if(rand() % 100 < (20 + 10 * skilllv) * sc_def_vit / 100 )
status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
- }
break;
case RG_RAID: /* �T�v���C�Y�A�^�b�N */
@@ -3440,30 +3447,29 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
case PR_MAGNIFICAT: /* �}�O�j�t�B�J?�g */
case PR_GLORIA: /* �O�����A */
case SN_WINDWALK: /* �E�C���h�E�H?�N */
- if(sd == NULL || sd->status.party_id==0 || (flag&1) ){
+ if (sd == NULL || sd->status.party_id == 0 || (flag & 1)) {
/* �•ʂ�?�� */
clif_skill_nodamage(bl,bl,skillid,skilllv,1);
- if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
+ if(dstsd && dstsd->special_state.no_magic_damage)
break;
status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0);
- }
- else{
+ } else if (sd) {
/* �p?�e�B�S?�ւ�?�� */
- party_foreachsamemap(skill_area_sub,
+ party_foreachsamemap (skill_area_sub,
sd,1,
src,skillid,skilllv,tick, flag|BCT_PARTY|1,
skill_castend_nodamage_id);
}
break;
+
case BS_ADRENALINE: /* �A�h���i�������b�V�� */
case BS_WEAPONPERFECT: /* �E�F�|���p?�t�F�N�V���� */
case BS_OVERTHRUST: /* �I?�o?�g���X�g */
- if(sd == NULL || sd->status.party_id==0 || (flag&1) ){
+ if (sd == NULL || sd->status.party_id == 0 || (flag & 1)) {
/* �•ʂ�?�� */
clif_skill_nodamage(bl,bl,skillid,skilllv,1);
status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,(src == bl)? 1:0,0,0,skill_get_time(skillid,skilllv),0);
- }
- else{
+ } else if (sd) {
/* �p?�e�B�S?�ւ�?�� */
party_foreachsamemap(skill_area_sub,
sd,1,
@@ -3479,30 +3485,24 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
case CR_AUTOGUARD: /* �I?�g�K?�h */
{
struct status_change *tsc_data = status_get_sc_data(bl);
- int sc=SkillStatusChangeTable[skillid];
+ int sc = SkillStatusChangeTable[skillid];
clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if( tsc_data ){
- if( tsc_data[sc].timer==-1 )
- /* �t������ */
- status_change_start(bl,sc,skilllv,0,0,0,skill_get_time(skillid,skilllv),0);
- else
- /* �������� */
- status_change_end(bl, sc, -1);
- }
+ if (tsc_data && tsc_data[sc].timer != -1)
+ status_change_end(bl, sc, -1);
+ else
+ status_change_start(bl,sc,skilllv,0,0,0,skill_get_time(skillid,skilllv),0);
}
break;
case TF_HIDING: /* �n�C�f�B���O */
{
struct status_change *tsc_data = status_get_sc_data(bl);
- int sc=SkillStatusChangeTable[skillid];
+ int sc = SkillStatusChangeTable[skillid];
clif_skill_nodamage(src,bl,skillid,-1,1);
- if(tsc_data && tsc_data[sc].timer!=-1 )
- /* �������� */
+ if (tsc_data && tsc_data[sc].timer != -1)
status_change_end(bl, sc, -1);
else
- /* �t������ */
- status_change_start(bl,sc,skilllv,0,0,0,skill_get_time(skillid,skilllv),0);
+ status_change_start(bl,sc,skilllv,0,0,0,skill_get_time(skillid,skilllv),0);
}
break;
@@ -3604,7 +3604,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
break;
case RG_STEALCOIN: // �X�e�B?���R�C��
- if(sd) {
+ if(sd) {
if(pc_steal_coin(sd,bl)) {
int range = skill_get_range(skillid,skilllv);
if(range < 0)
@@ -3622,12 +3622,12 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
struct status_change *sc_data = status_get_sc_data(bl);
// Level 6-10 doesn't consume a red gem if it fails [celest]
int i, gem_flag = 1;
- if (bl->type==BL_MOB && status_get_mode(bl)&0x20) {
+ if (dstmd && status_get_mode(bl)&0x20) {
clif_skill_fail(sd,sd->skillid,0,0);
break;
}
clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
+ if(dstsd && dstsd->special_state.no_magic_damage )
break;
if (sc_data && sc_data[SC_STONE].timer != -1) {
status_change_end(bl,SC_STONE,-1);
@@ -3701,7 +3701,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
break;
case WZ_ESTIMATION: /* �����X�^?��� */
- if(src->type==BL_PC){
+ if(sd) {
clif_skill_nodamage(src,bl,skillid,skilllv,1);
clif_skill_estimation((struct map_session_data *)src,bl);
}
@@ -3730,20 +3730,20 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
break;
case AL_TELEPORT: /* �e���|?�g */
- if( sd ){
- if(map[sd->bl.m].flag.noteleport){ /* �e���|�֎~ */
+ if(sd) {
+ if (map[sd->bl.m].flag.noteleport) { /* �e���|�֎~ */
clif_skill_teleportmessage(sd,0);
break;
}
clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if( sd->skilllv==1 )
+ if(sd->skilllv == 1)
clif_skill_warppoint(sd,sd->skillid,"Random","","","");
- else{
+ else {
clif_skill_warppoint(sd,sd->skillid,"Random",
sd->status.save_point.map,"","");
}
- }else if( bl->type==BL_MOB )
- mob_warp((struct mob_data *)bl,-1,-1,-1,3);
+ } else if(dstmd)
+ mob_warp(dstmd,-1,-1,-1,3);
break;
case AL_HOLYWATER: /* �A�N�A�x�l�f�B�N�^ */
@@ -3827,7 +3827,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
strip_fix = status_get_dex(src) - status_get_dex(bl);
if(strip_fix < 0)
strip_fix=0;
- strip_per = 5+2*skilllv+strip_fix/5;
+ strip_per = 5+5*skilllv+strip_fix/5;
if (rand()%100 >= strip_per)
break;
@@ -3858,7 +3858,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
strip_fix = status_get_dex(src) - status_get_dex(bl);
if(strip_fix < 0)
strip_fix = 0;
- strip_per = 5+2*skilllv+strip_fix/5;
+ strip_per = 5+5*skilllv+strip_fix/5;
if (rand()%100 >= strip_per)
break;
strip_time = skill_get_time(skillid,skilllv)+strip_fix/2;
@@ -3967,7 +3967,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
{
int i;
clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
+ if(dstsd && dstsd->special_state.no_magic_damage )
break;
for(i=0;i<136;i++){
if(i==SC_RIDING || i== SC_FALCON || i==SC_HALLUCINATION || i==SC_WEIGHT50
@@ -3983,12 +3983,12 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
case TF_BACKSLIDING: /* �o�b�N�X�e�b�v */
battle_stopwalking(src,1);
skill_blown(src,bl,skill_get_blewcount(skillid,skilllv)|0x10000);
- if(src->type == BL_MOB)
- clif_fixmobpos((struct mob_data *)src);
- else if(src->type == BL_PET)
- clif_fixpetpos((struct pet_data *)src);
- else if(src->type == BL_PC)
+ if (sd)
clif_fixpos(src);
+ else if (md)
+ clif_fixmobpos(md);
+ else if (src->type == BL_PET)
+ clif_fixpetpos((struct pet_data *)src);
skill_addtimerskill(src,tick + 200,src->id,0,0,skillid,skilllv,0,flag);
break;
@@ -4067,7 +4067,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
}
break;
case SA_MAGICROD:
- if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
+ if (dstsd && dstsd->special_state.no_magic_damage )
break;
status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
break;
@@ -4133,7 +4133,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
case NPC_HALLUCINATION:
clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
+ if(dstsd && dstsd->special_state.no_magic_damage )
break;
status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
break;
@@ -4144,9 +4144,9 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
int skill_time = skill_get_time(skillid,skilllv);
clif_skill_nodamage(src,bl,skillid,skilllv,1);
status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_time,0 );
- if (src->type == BL_MOB)
- mob_changestate((struct mob_data *)src,MS_DELAY,skill_time);
- else if (src->type == BL_PC)
+ if (md)
+ mob_changestate(md,MS_DELAY,skill_time);
+ else if (sd)
sd->attackabletime = sd->canmove_tick = tick + skill_time;
}
break;
@@ -4155,7 +4155,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
{
int sc_def = 100 - status_get_mdef(bl);
clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
+ if(dstsd && dstsd->special_state.no_magic_damage )
break;
if(status_get_elem_type(bl) == 7 || status_get_race(bl) == 6)
break;
@@ -4176,10 +4176,11 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
break;
case NPC_LICK:
clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_weapon_damage )
- break;
- if(dstsd)
+ if (dstsd) {
+ if (dstsd->special_state.no_weapon_damage )
+ break;
pc_heal(dstsd,0,-100);
+ }
if(rand()%100 < (skilllv*5)*sc_def_vit/100)
status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
break;
@@ -4200,6 +4201,57 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
mob_summonslave(md,mob_db[md->class_].skill[md->skillidx].val,skilllv,(skillid==NPC_SUMMONSLAVE)?1:0);
break;
+ case NPC_RECALL: //��芪���Ăі߂�
+ if(md) {
+ int mobcount;
+ md->recallcount = 0;//������
+ md->recall_flag = 0;
+ mobcount = mob_countslave(md);
+ if(mobcount > 0) {
+ md->recall_flag = 1; //mob.c��[��芪�������X�^�[�̏���]�ŗ��p
+ md->recallmob_count = mobcount;
+ }
+ }
+ break;
+
+ case NPC_RUNAWAY: //���
+ if(md) {
+ int check;
+ int dist = skilllv;//��ނ��鋗��
+ check = md->dir; //�������ǂ̕����Ɍ����Ă邩�`�F�b�N
+ md->attacked_id = 0;
+ md->target_id = 0;
+ md->state.targettype = NONE_ATTACKABLE;
+ md->state.skillstate = MSS_IDLE;
+ switch (check) {
+ case 0: //�����̌����Ă�����Ƌt�Ɉړ�����
+ mob_walktoxy(md,md->bl.x,md->bl.y-dist,0);//�����āA�ړ�����
+ break;
+ case 1:
+ mob_walktoxy(md,md->bl.x-dist,md->bl.y-dist,0);
+ break;
+ case 2:
+ mob_walktoxy(md,md->bl.x+dist,md->bl.y,0);
+ break;
+ case 3:
+ mob_walktoxy(md,md->bl.x+dist,md->bl.y+dist,0);
+ break;
+ case 4:
+ mob_walktoxy(md,md->bl.x,md->bl.y+dist,0);
+ break;
+ case 5:
+ mob_walktoxy(md,md->bl.x-dist,md->bl.y+dist,0);
+ break;
+ case 6:
+ mob_walktoxy(md,md->bl.x-dist,md->bl.y,0);
+ break;
+ case 7:
+ mob_walktoxy(md,md->bl.x-dist,md->bl.y-dist,0);
+ break;
+ }
+ }
+ break;
+
case NPC_TRANSFORMATION:
case NPC_METAMORPHOSIS:
if(md)
@@ -4218,25 +4270,25 @@ 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 && battle_config.equipment_breaking)
+ if(dstsd && battle_config.equipment_breaking)
pc_breakweapon(dstsd);
break;
case NPC_BREAKARMOR:
clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(bl->type == BL_PC && battle_config.equipment_breaking)
+ if(dstsd && battle_config.equipment_breaking)
pc_breakarmor(dstsd);
break;
case NPC_BREAKHELM:
clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(bl->type == BL_PC && battle_config.equipment_breaking)
+ if(dstsd && battle_config.equipment_breaking)
pc_breakhelm(dstsd);
break;
case NPC_BREAKSHIELD:
clif_skill_nodamage(src,bl,skillid,skilllv,1);
- if(bl->type == BL_PC && battle_config.equipment_breaking)
+ if(dstsd && battle_config.equipment_breaking)
pc_breakshield(dstsd);
break;
@@ -4384,7 +4436,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
struct status_change *sc_data = status_get_sc_data(bl);
/* MVPmob�ƕs���ɂ�?���Ȃ� */
- if((bl->type==BL_MOB && status_get_mode(bl)&0x20) || battle_check_undead(status_get_race(bl),status_get_elem_type(bl))) //�s���ɂ�?���Ȃ�
+ if((dstmd && status_get_mode(bl)&0x20) || battle_check_undead(status_get_race(bl),status_get_elem_type(bl))) //�s���ɂ�?���Ȃ�
{
map_freeblock_unlock();
return 1;
@@ -4408,12 +4460,8 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
status_change_end(bl,SC_SLEEP,-1);
}
- if(bl->type==BL_MOB) {
- int range = skill_get_range(skillid,skilllv);
- if(range < 0)
- range = status_get_range(src) - (range + 1);
- mob_target((struct mob_data *)bl,src,range);
- }
+ if(dstmd)
+ mob_target(dstmd,src,skill_get_range(skillid,skilllv));
}
break;
@@ -4814,13 +4862,20 @@ int skill_castend_pos2( struct block_list *src, int x,int y,int skillid,int skil
break;
case BS_HAMMERFALL: /* �n���}?�t�H?�� */
- skill_area_temp[1]=src->id;
- skill_area_temp[2]=x;
- skill_area_temp[3]=y;
- map_foreachinarea(skill_area_sub,
- src->m,x-2,y-2,x+2,y+2,0,
- src,skillid,skilllv,tick, flag|BCT_ENEMY|2,
- skill_castend_nodamage_id);
+ {
+ int r = 2;
+ if (skilllv > 5) {
+ r = 14;
+ skilllv = 5; // �X�^�����オ�肷���邽�ߌv�Z��Lv5�ŌŒ�
+ }
+ skill_area_temp[1] = src->id;
+ skill_area_temp[2] = x;
+ skill_area_temp[3] = y;
+ map_foreachinarea (skill_area_sub,
+ src->m, x-r, y-r, x+r, y+r, 0,
+ src, skillid, skilllv, tick, flag|BCT_ENEMY|2,
+ skill_castend_nodamage_id);
+ }
break;
case HT_DETECTING: /* �f�B�e�N�e�B���O */
@@ -4933,49 +4988,39 @@ int skill_castend_pos2( struct block_list *src, int x,int y,int skillid,int skil
pc_blockskill_start (sd, MO_EXTREMITYFIST, 2000);
break;
case AM_CANNIBALIZE: // �o�C�I�v�����g
- if(sd){
- int mx,my,amount=6-skilllv,id=0;
+ if(sd) {
+ int id;
int summons[5] = { 1020, 1068, 1118, 1500, 1368 };
-
struct mob_data *md;
- for (i=0; i<amount; i++) { //Amount: 1 lev = 1 mob, 2=2, 3, 4, 5 [Lupus]
- mx = x;
- my = y;
- while (i && mx == x ) {
- mx += (rand()%(1+amount) - (1+amount)/2);
- }
- while (i && my == y) {
- my += (rand()%(1+amount) - (1+amount)/2);
- }
- id=mob_once_spawn(sd,"this",mx,my,"--ja--", summons[skilllv-1] ,1,"");
+ // Correct info, don't change any of this! [celest]
+ id = mob_once_spawn (sd, "this", x, y, "--ja--", summons[skilllv-1] ,1,"");
- if( (md=(struct mob_data *)map_id2bl(id)) !=NULL ){
- md->master_id=sd->bl.id;
- //md->hp=2210+skilllv*200; commented out, we use REAL hp of the mobs [Lupus]
- md->state.special_mob_ai=1;
- md->deletetimer=add_timer(gettick()+skill_get_time(skillid,skilllv),mob_timer_delete,id,0);
- }
- }
- //block skill
- //i can't check if the summoned mobs are dead.. to be able summon next... so i just disable skill [Lupus]
- pc_blockskill_start (sd, AM_CANNIBALIZE, skill_get_time(skillid,skilllv));
+ if( (md=(struct mob_data *)map_id2bl(id)) !=NULL ){
+ md->master_id = sd->bl.id;
+ // different levels of HP according to skill level
+ md->hp = 1500 + skilllv * 200 + sd->status.base_level * 10;
+ md->state.special_mob_ai = 1;
+ //��ړ��ŃA�N�e�B�u�Ŕ�������[0x0:��ړ� 0x1:�ړ� 0x4:ACT 0x8:��ACT 0x40:������ 0x80:�����L]
+ md->mode = 0x0 + 0x4 + 0x80;
+ md->deletetimer = add_timer (gettick() + skill_get_time(skillid,skilllv), mob_timer_delete, id, 0);
+ }
+ // To-do: ���҂���郂���X�^�[�ɂ͏��҂����v���[���[�̖��O���t���܂�
+ // (attach name of player?)
clif_skill_poseffect(src,skillid,skilllv,x,y,tick);
}
break;
case AM_SPHEREMINE: // �X�t�B�A?�}�C��
if(sd){
- int mx,my,id=0;
+ int id;
struct mob_data *md;
- mx = x;// + (rand()%10 - 5);
- my = y;// + (rand()%10 - 5);
- id=mob_once_spawn(sd,"this",mx,my,"--ja--",1142,1,"");
+ id = mob_once_spawn(sd, "this", x, y, "--ja--", 1142, 1, "");
if( (md=(struct mob_data *)map_id2bl(id)) !=NULL ){
- md->master_id=sd->bl.id;
- md->hp=2000+skilllv*400;
- md->state.special_mob_ai=2;
- md->deletetimer=add_timer(gettick()+skill_get_time(skillid,skilllv),mob_timer_delete,id,0);
+ md->master_id = sd->bl.id;
+ md->hp = 2000 + skilllv * 400;
+ md->state.special_mob_ai = 2;
+ md->deletetimer = add_timer (gettick() + skill_get_time(skillid,skilllv), mob_timer_delete, id, 0);
}
clif_skill_poseffect(src,skillid,skilllv,x,y,tick);
}
@@ -5172,6 +5217,14 @@ struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid,
if(skilllv >= 6)
range=2;
break;
+ case WZ_METEOR:
+ if (skilllv > 10) //�L�͈̓��e�I
+ range = 10;
+ break;
+ case WZ_VERMILION:
+ if (skilllv > 10) //�L�͈�LOV
+ range = 25;
+ break;
case HT_SANDMAN: /* �T���h�}�� */
case HT_CLAYMORETRAP: /* �N���C���A?�g���b�v */
@@ -5783,7 +5836,13 @@ int skill_unit_onout(struct skill_unit *src,struct block_list *bl,unsigned int t
case 0xac: /* �n�~���O */
case 0xae: /* �K�^�̃L�X */
case 0xaf: /* �T?�r�X�t�H?��? */
- status_change_start(bl,SkillStatusChangeTable[sg->skill_id],sg->skill_lv,0,0,0,20000,0 );
+ if (sg->src_id==bl->id) {
+ status_change_end(bl,type,-1);
+ break;
+ }
+ if (sc_data[type].timer!=-1 && sc_data[type].val4==(int)src) {
+ sc_data[type].timer = add_timer(20000+tick, status_change_timer, bl->id, type);
+ }
break;
case 0xb4: // Basilica
@@ -5833,6 +5892,7 @@ int skill_unit_effect(struct block_list *bl,va_list ap)
struct skill_unit_group *group;
int flag;
unsigned int tick;
+ static int called = 0;
nullpo_retr(0, bl);
nullpo_retr(0, ap);
@@ -5853,8 +5913,11 @@ int skill_unit_effect(struct block_list *bl,va_list ap)
else {
skill_unit_onout(unit,bl,tick);
unit = map_find_skill_unit_oncell(bl,bl->x,bl->y,group->skill_id,unit);
- if (unit)
+ if (unit && called == 0) {
+ called = 1;
skill_unit_onplace(unit,bl,tick);
+ called = 0;
+ }
}
return 0;
@@ -9059,6 +9122,23 @@ void skill_init_unit_layout()
memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy));
break;
}
+ case PA_GOSPEL:
+ {
+ static const int dx[] = {
+ -1, 0, 1,-1, 0, 1,-3,-2,-1, 0,
+ 1, 2, 3,-3,-2,-1, 0, 1, 2, 3,
+ -3,-2,-1, 0, 1, 2, 3,-1, 0, 1,
+ -1, 0, 1};
+ static const int dy[] = {
+ -3,-3,-3,-2,-2,-2,-1,-1,-1,-1,
+ -1,-1,-1, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
+ 3, 3, 3};
+ skill_unit_layout[pos].count = 33;
+ memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx));
+ memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy));
+ break;
+ }
default:
printf("unknown unit layout at skill %d\n",i);
break;
diff --git a/src/map/skill.h b/src/map/skill.h
index 4c0d0a8f7..91fe376b4 100644
--- a/src/map/skill.h
+++ b/src/map/skill.h
@@ -573,9 +573,13 @@ enum {
NPC_BREAKHELM,
NPC_BREAKSHIELD,
NPC_UNDEADATTACK,
- NPC_EXPLOSIONSPIRITS = 349,
+
+ NPC_RUNAWAY = 348,
+ NPC_EXPLOSIONSPIRITS,
NPC_INCAGI,
+ NPC_RECALL = 354,
+
LK_AURABLADE = 355,
LK_PARRYING,
LK_CONCENTRATION,
diff --git a/src/map/status.c b/src/map/status.c
index bc059e442..65f9e0cd4 100644
--- a/src/map/status.c
+++ b/src/map/status.c
@@ -3189,18 +3189,18 @@ int status_change_start(struct block_list *bl,int type,int val1,int val2,int val
return 0;
if(bl->type == BL_PC)
if(pc_checkskill(sd,BS_HILTBINDING)>0)
- tick *= 1.1;
+ tick += tick / 10;
calc_flag = 1;
break;
case SC_WEAPONPERFECTION: /* �E�F�|���p?�t�F�N�V���� */
if(bl->type == BL_PC)
if(pc_checkskill(sd,BS_HILTBINDING)>0)
- tick *= 1.1;
+ tick += tick / 10;
break;
case SC_OVERTHRUST: /* �I?�o?�X���X�g */
if(bl->type == BL_PC)
if(pc_checkskill(sd,BS_HILTBINDING)>0)
- tick *= 1.1;
+ tick += tick / 10;
*opt3 |= 2;
break;
case SC_MAXIMIZEPOWER: /* �}�L�V�}�C�Y�p��?(SP��1���鎞��,val2�ɂ�) */
@@ -3563,6 +3563,11 @@ int status_change_start(struct block_list *bl,int type,int val1,int val2,int val
tick = 1000;
break;
case SC_SILENCE: /* ��?�i���b�N�X�f�r?�i�j */
+ if (sc_data && sc_data[SC_GOSPEL].timer!=-1) {
+ skill_delunitgroup((struct skill_unit_group *)sc_data[SC_GOSPEL].val3);
+ status_change_end(bl,SC_GOSPEL,-1);
+ break;
+ }
if(!(flag&2)) {
int sc_def = 100 - status_get_vit(bl);
tick = tick * sc_def / 100;
diff --git a/src/map/status.h b/src/map/status.h
index a23394d6a..6c026081e 100644
--- a/src/map/status.h
+++ b/src/map/status.h
@@ -259,6 +259,7 @@ int status_getrefinebonus(int lv,int type);
int status_percentrefinery(struct map_session_data *sd,struct item *item);
extern int percentrefinery[5][10];
+int status_readdb(void);
int do_init_status(void);
#endif