Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions doc/pandas_mapflags.txt
Original file line number Diff line number Diff line change
Expand Up @@ -302,3 +302,11 @@
因为生命体的十进制掩码是 8 而魔物的十进制掩码是 2, 直接相加填写 10

--------------------------------------------------------------
*DamageType <限制单位掩码>

单位掩码:
0: 无限制
1: 武器无法攻击
2: 魔法无法攻击
4: 特殊技能无法攻击

4 changes: 4 additions & 0 deletions src/config/pandas.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1694,6 +1694,10 @@
// 是否启用 noattack2 地图标记 [HongShin]
// 该标记用于禁止此地图上指定单位进行普通攻击 (支持掩码指定多种类型的单位)
#define Pandas_MapFlag_NoAttack2

// 是否启用 damagetype 地图标记 [维护者昵称]
// TODO: 请在此填写此地图标记的说明
#define Pandas_MapFlag_DamageType
// PYHELP - MAPFLAG - INSERT POINT - <Section 1>
#endif // Pandas_Mapflags

Expand Down
11 changes: 11 additions & 0 deletions src/map/atcommand.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4770,6 +4770,13 @@ ACMD_FUNC(mapinfo) {
strcat(atcmd_output, mes);
}
#endif // Pandas_MapFlag_NoAttack2
#ifdef Pandas_MapFlag_DamageType
if (map_getmapflag(m_id, MF_DAMAGETYPE)) {
char mes[256] = { 0 };
snprintf(mes, sizeof(mes), " DamageType: %d |", map_getmapflag_param(m_id, MF_DAMAGETYPE, 0));
strcat(atcmd_output, mes);
}
#endif // Pandas_MapFlag_DamageType
// PYHELP - MAPFLAG - INSERT POINT - <Section 8>
clif_displaymessage(fd, atcmd_output);
#endif // Pandas_Mapflags
Expand Down Expand Up @@ -8999,6 +9006,10 @@ ACMD_FUNC(mapflag) {
disabled_mf.insert(disabled_mf.begin(), MF_NOATTACK2);
#endif // Pandas_MapFlag_NoAttack2

#ifdef Pandas_MapFlag_DamageType
disabled_mf.insert(disabled_mf.begin(), MF_DAMAGETYPE);
#endif // Pandas_MapFlag_DamageType

// PYHELP - MAPFLAG - INSERT POINT - <Section 4>

if (flag > 0 && util::vector_exists(disabled_mf, mapflag)) {
Expand Down
10 changes: 9 additions & 1 deletion src/map/battle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8965,7 +8965,15 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
}

wd = battle_calc_attack(BF_WEAPON, src, target, 0, 0, flag);

#ifdef Pandas_MapFlag_DamageType
if (src && map_getmapflag(src->m, MF_DAMAGETYPE)) {
uint16 val = (uint16)map_getmapflag_param(src->m, MF_DAMAGETYPE, 0);
if (BF_WEAPON & val) {
damage = 0;
return wd.dmg_lv;
}
}
#endif // Pandas_MapFlag_DamageType
if (sd && wd.damage + wd.damage2 > 0 && battle_vellum_damage(sd, target, &wd))
vellum_damage = true;

Expand Down
19 changes: 19 additions & 0 deletions src/map/map.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5112,6 +5112,11 @@ int map_getmapflag_sub(int16 m, enum e_mapflag mapflag, union u_mapflag_args *ar
return map_getmapflag_param(m, mapflag, args, 0);
#endif // Pandas_MapFlag_NoAttack2

#ifdef Pandas_MapFlag_DamageType
case MF_DAMAGETYPE:
return map_getmapflag_param(m, mapflag, args, 0);
#endif // Pandas_MapFlag_DamageType

// PYHELP - MAPFLAG - INSERT POINT - <Section 5>
default:
return mapdata->flag[mapflag];
Expand Down Expand Up @@ -5516,6 +5521,20 @@ bool map_setmapflag_sub(int16 m, enum e_mapflag mapflag, bool status, union u_ma
mapdata->flag[mapflag] = status;
break;
#endif // Pandas_MapFlag_NoAttack2
#ifdef Pandas_MapFlag_DamageType
case MF_DAMAGETYPE:
if (!status)
map_setmapflag_param(m, mapflag, 0);
else {
nullpo_retr(false, args);
if (args) {
map_setmapflag_param(m, mapflag, args->flag_val);
status = !(args->flag_val == 0);
}
}
mapdata->flag[mapflag] = status;
break;
#endif // Pandas_MapFlag_DamageType
// PYHELP - MAPFLAG - INSERT POINT - <Section 6>
default:
mapdata->flag[mapflag] = status;
Expand Down
3 changes: 3 additions & 0 deletions src/map/map.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -799,6 +799,9 @@ enum e_mapflag : int16 {
#ifdef Pandas_MapFlag_NoAttack2
MF_NOATTACK2,
#endif // Pandas_MapFlag_NoAttack2
#ifdef Pandas_MapFlag_DamageType
MF_DAMAGETYPE,
#endif // Pandas_MapFlag_DamageType
// PYHELP - MAPFLAG - INSERT POINT - <Section 2>
MF_MAX
};
Expand Down
13 changes: 13 additions & 0 deletions src/map/npc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6201,6 +6201,19 @@ static const char* npc_parse_mapflag(char* w1, char* w2, char* w3, char* w4, con
}
#endif // Pandas_MapFlag_NoAttack2

#ifdef Pandas_MapFlag_DamageType
case MF_DAMAGETYPE: {
// 若脚本中 mapflag 指定的数值无效或为默认值: 0, 则立刻关闭这个地图标记
union u_mapflag_args args = {};

if (sscanf(w4, "%11d", &args.flag_val) < 1 || args.flag_val == 0 || !state)
map_setmapflag(m, mapflag, false);
else
map_setmapflag_sub(m, mapflag, true, &args);
break;
}
#endif // Pandas_MapFlag_DamageType

// PYHELP - MAPFLAG - INSERT POINT - <Section 7>

// All others do not need special treatment
Expand Down
4 changes: 4 additions & 0 deletions src/map/script_constants.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -884,6 +884,10 @@
export_constant(MF_NOATTACK2);
#endif // Pandas_MapFlag_NoAttack2

#ifdef Pandas_MapFlag_DamageType
export_constant(MF_DAMAGETYPE);
#endif // Pandas_MapFlag_DamageType

// PYHELP - MAPFLAG - INSERT POINT - <Section 3>

/* setcell types */
Expand Down
9 changes: 8 additions & 1 deletion src/map/skill.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3635,7 +3635,14 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
#endif

dmg = battle_calc_attack(attack_type,src,bl,skill_id,skill_lv,flag&0xFFF);

#ifdef Pandas_MapFlag_DamageType
if (src && map_getmapflag(src->m, MF_DAMAGETYPE)) {
uint16 val = (uint16)map_getmapflag_param(src->m, MF_DAMAGETYPE, 0);
if (attack_type & val) {
return 0;
}
}
#endif // Pandas_MapFlag_DamageType
//If the damage source is a unit, the damage is not delayed
if (src != dsrc && skill_id != GS_GROUNDDRIFT)
dmg.amotion = 0;
Expand Down