hxp
4 天以前 8e76a6859474df07c12e0b4ff0ea3bfd321675eb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
¥@ƒic@s‹ddlZddlZddlZddlZddlZddlZddlZddlZddlZddl    Z    ddl
Z
ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZd„Zd„Zd„Zd„Zd„Zd„Zd„Z d    „Z!d
„Z"d „Z#d „Z$d „Z%d„Z&d„Z'd„Z(d„Z)d„Z*d„Z+d„Z,d„Z-d„Z.d„Z/d„Z0d„Z1d„Z2d„Z3e4d„Z5d„Z6d„Z7d„Z8d „Z9e:d!„Z;e:d"„Z<e:d#„Z=d$„Z>d%„Z?d&„Z@d'„ZAd(„ZBe4d)„ZCd*„ZDd+„ZEd,„ZFd-„ZGd.„ZHd/fd0„ƒYZId1„ZJd2„ZKd3„ZLd4„ZMd5„ZNd6„ZOd7„ZPd8„ZQd9„ZRd:„ZSd;„ZTd<„ZUd=„ZVd>„ZWd?„ZXd@„ZYdA„ZZdB„Z[dC„Z\dD„Z]dE„Z^e_dF„Z`dG„ZadH„ZbdI„ZcdJ„ZddK„ZedL„ZfdM„ZgdN„ZhdO„ZidP„ZjdQ„ZkdR„ZldS„ZmdT„ZndU„ZodV„ZpdW„ZqdX„ZrdY„ZsdZ„Ztd[„Zud\„Zvd]„ZwdS(^iÿÿÿÿNcCsO|jƒ}|j||jƒ||tj|tj|jƒ|jƒƒdS(N(tGetGameObjTypetAddHurttGetIDt ShareDefinetDef_PerPointValuetGetHPtGetHPEx(ttagObjthurtListthurtTypet    hurtValuet
tagObjType((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyR<s  cCs4|jƒ}|j|||tj|tjƒdS(N(tGetPlayerHurtListt AddHurtValueRR(tdefendertattackIDtattackHurtTypetvaluetdefendHurtList((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyR Cs $c    Cs¦|s
dS|jƒtjkr#dStj}tjƒjƒ}||jƒ|j    ƒf}||krri||<n||}||f}|j
|dƒ|||<dS(Ni( Rt IPY_GameWorldtgotNPCt
PyGameDatatg_teamPlayerHurtValuet    GameWorldt GetGameWorldt    GetLineIDRtGetNPCIDtget(    RtteamIDtplayerIDRtteamPlayerHurtDicttlineIDtkeythurtDictthurtKey((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytAddTeamPlayerHurtValueHs      
 cCs¡tj}|jƒ}|sdS|jƒtjkr8dStjƒjƒ}||j    ƒ|j
ƒf}||krudS||}||j ƒf}|j |dƒS(Ni( RRt    GetTeamIDRRRRRRRRt GetPlayerIDR(t    curPlayerRRRRR R!R"((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytGetTeamPlayerHurtValueZs      
cCs$tj}|jƒ}|sdS|jƒtjkr8dStjƒjƒ}||j    ƒ|j
ƒf}||krudS|j ƒ}d}d}||}    xW|    j ƒD]I\}}
|\} } | |krÎq¤n||
7}| |kr¤|
}q¤q¤W|dks    |dkrd} n|d|} | S(Nigð?( RRR$RRRRRRRRR%titems(R&RRRRR RtplayerHurtValuet teamHurtValueR!R
t
hurtTeamIDt hurtPlayerIDthurtPer((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytGetTeamPlayerHurtPerks2       
 
      cCsotj}|jƒtjkr"dStjƒjƒ}||jƒ|j    ƒf}||krk|j
|ƒndS(N( RRRRRRRRRRtpop(RRRR ((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytClearTeamPlayerHurtValueŽs     cCs£|dks|dkrtStjtjg}tj|jƒ|jƒƒ|ksvtj|jƒ|jƒƒ|krztSt    ||ƒs›|j
ƒdkrŸtSt S(Ni( tNonetTrueRt    gatFreePKt gatFamilyPKtGameMaptGetAreaTypeByMapPostGetPosXtGetPosYtIsMaliciousAttackPlayert
GetPKValuetFalse(R&t    tagPlayertlegalityAreaList((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytGetIsPKLegality s$$!cCsCt||ƒrdStj||ƒ|j|jƒ|jƒƒdS(N(R>t PlayerControltAddPlayerPKValuetGameServer_AddEnemyRtGetName(R&t curTagPlayerttick((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyt
AddPKValue¾s
cCs½tj||ƒtj|d|jƒgƒt|||ƒtj|||ƒtj    |||ƒrhdSt
|||ƒt ||ƒt j ƒjƒtjkr¹tj|tjdƒndS(Nt PK_lhs_318691i(t PlayerStatetSetPKStateTickR?t
NotifyCodeRBt__GiveKill_Player_ValuePrizet    NPCCommontOnPlayerKillNPCPlayertFBLogictDoFBOnKill_PlayerREt__DoKillPlayerNotifyRtGetMapt GetMapFBTypeRtfbtNulltNomalDictSetPropertytChConfigtDef_PDict_IsAddReviveTired(R&RRD((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytOnPlayerKillPlayerÒs c    CsÝ|jƒ}|dkrdS|jƒ}|jƒ}|jƒ}|jƒ}|jƒ}|jƒ}tjƒjƒt    j
krƒdSg}    tj ƒ}
t j |ƒ} t j |ƒ} tjƒjƒ} |jƒdkr|jƒ}|jƒ}d}||||||||| g    }n!d}||||||| g}|
r_|    jt j|||ƒƒnt j|||ƒ|dkr½|jƒ}|jtj|jƒƒd}|jtj|jƒ|ƒ|jtj|jƒdƒtjdƒ}t|jƒƒ}d}x$|D]}||kr(Pn|}qW||kr½||}|||||g}|
r¤|    jt jd||ƒƒ| | kr·t j|||ƒq·qºt jd||ƒq½n|    rÙt j | g|    ƒndS(Nit PK_pan_671654t PK_pan_318691itFamilyKilledNotify(!t GetFamilyIDtGetFamilyMemberLVRBtGetMapIDR7R8RRPRQRRRt IsCrossServerR?tGetPlayerServerGroupIDRRt GetFamilyNametappendtGetCrossFamilyNotifyInfot FamilyNotifyt GetDictByKeyRTtDef_PlayerKey_KillPlayerCntR%tSetDictt IpyGameDataPYtGetFuncEvalCfgtsortedtkeystGetCrossWorldNotifyInfoRIt WorldNotifyt CrossNotify(tattackerRt defFamilyIDtdefFamilyMemberLvtdefNametatkNametdefMapIDtdefPosXtdefPosYtcrossNotifyListt isCrossServertatkServerGroupIDtdefServerGroupIDRt atkFamilyNametatkFamilyMemberLvt
notifyCodet    paramListt defFamilyNametkillCnttkillPlayerNotifyDicttkillKeyst    notifyKeyt
killCntKeyt
notifyMarkt msgParamList((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyROôsb           $     
 
 cCs&tj|ƒr"tj||ƒndS(N(RTt
IsGameBossRGtSetBossStateTick(tcurNPCRRD((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytOnNPCHitPlayer;scCs‚|jƒ|jƒkrdSt||ƒs>t|||ƒnt|||ƒt|||ƒtj||ƒtj||ƒdS(N(RR>tAddMaliciousAttackPlayertUpdMaliciousAttackTicktAddPlayerHitPlayerHurtRGRH(RmRRD((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytOnPlayerHitPlayerFscCsE|jƒ}|jƒtjkr%dSt||jƒtjdƒdS(Ni(R t GetHurtCountRTtDef_PlayerHurtListCountR R%tDef_NPCHurtTypePlayer(RmRRDtdefPlayerHurtList((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyR‹es
 cCsK|s tjSt|ƒ\}}t|ƒ\}}|rD|rDtjStjS(N(RTtDef_BattleRelationType_CommtGetAttackPlayertDef_BattleRelationType_PVPtDef_BattleRelationType_PVE(RmRt attackPlayert    attackNPCtdefenderPlayert defenderNPC((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytGetBattleRelationTypers cCs¯tj|ƒ}|tjtjgkr+tS|tjkr›|jƒtjtj    gkr›tj|ƒtjkr›|j
ƒt j kr˜t |ƒr˜tSq›n||kr«tStS(N(t SkillCommontGetSkillBattleTypeRTR‘t!Def_BattleRelationType_CommNoBossR2R“t GetSkillTypetDef_SkillType_AtktDef_SkillType_PassiveRRt    gotPlayertIsPVPNPCR;(RmRtcurSkilltbattleRelationTypetskillBattleType((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytCheckBattleRelationType€s!
 cCs5|s
tS|jƒtjko4|jƒtjgkS(N(R;RRRtGetTypeRTtntPriWoodPilePVP(tobj((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyR¡•scCs_|dkr9|jƒd}|tjkr2tjStjS|jƒtjkrUtjS|jƒS(Ni
(R1t GetHurtTypeRtghtMagtghtPhyRR (tattacktattackUseSkilltght((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyt GetBattleTypeŸs cCs|j|ƒ|jtƒdS(N(tSetLastBattleTicktSetBattleStateR2(RRD((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytSetPlayerBattleState·s  c        Cs-|jƒtjkr)t||ƒ r)dS|jƒtjkrW|jƒtjkrWdSx‰td|jƒƒD]r}|j    |ƒ}t
|ƒs”qmn|j ƒ rºt ||dƒ rºqmntj|ƒ}|j||ttƒqmW|jƒ}|jƒ}|dkr)tj|ƒ}|j||ƒndS(Ni(RRR tCheckPlayerAttackMode_PlayerRR¦tntFairytrangetGetSummonCounttGetSummonNPCAttGetNPC_Has_Attackt GetOrgSpeedtCheckNPCAttackDistR1RKt
NPCControltAddObjToAngryListR2R;t    GetPetMgrt GetFightPet(    tcurObjR&t
angryValuetit curTagSummont summonControltpetMgrt fightPetObjt
petControl((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytSummonAddAngryByOwnerÇs&%     cCs|jƒp|jƒS(N(t    GetMinAtkt    GetMaxAtk(R‡((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyR¸ìscCsd|tjkrdStj}||jƒkrLtjd||jƒƒdStj|||ƒdS(Ns7Íæ¼Ò¹¥»÷ʧ°ÜϵͳÌáʾÕÒ²»µ½¶ÔÓ¦µÄÌáʾmark,´«ÈëµÄÔ­Òò£º%s(    RTtDef_PASysMessage_NonetDef_MessageDicRiRtErrLogR%R?RI(R&tmessaget
messageDic((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytPlayerAttackFailSysMessanage÷s    cCstS(N(R2(R&RC((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyR³scCs&|jƒtjddƒkr"tStS(NtPKConfigi(tGetLVRft
GetFuncCfgR2R;(R&((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyt GetIsNewGuyscCs5tjƒjƒ}|tjkr%tStj||ƒS(N(RRPRQRRRR;RMtCheckPlayersRelationInFB_IsNone(R&RCtmapType((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyRÔ+scCstj||ƒS(N(RMt!CheckPlayersRelationInFB_IsFriend(R&RC((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyRÖ8scCstj||ƒS(N(RMtDoCanAttackTeamer(R&RC((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytPlayerCanAttackTeamerInFBGscCsM|dkrtjdƒdS|jƒ}|tjkr
|jƒtjkrctj|||ƒnt    j
|ƒdkr”|j t j |jƒƒn|jƒ}|dkrÌt||jƒt j|ƒtSt||jƒt j|ƒt||jƒ|jƒ|ƒn?|tjkr8t||jƒt j|ƒntjd|ƒtS(NsNPCAddObjInHurtList NoFindObjis'NPCAddObjInHurtList UnKnow ObjType = %s(R1RRÌRRR RRMtDoFB_Player_HurtNPCtGameObjRReRTtDef_PlayerKey_LastHurtR%tGetTeamR RR2R$tDef_NPCHurtTypeTeamR#RtDef_NPCHurtTypeNPC(R¿t    curTagObjtcurTaglNPCHPBeforethurtHPtisBouncet
curObjTypetcurTeam((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytNPCAddObjInHurtListYs&     "cCstj|||ƒdS(N(RMt OnPVPDamage(R&t damageValueR<t    damageMsg((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyRæ~scCsb|jƒ s|jƒ rtS|jƒtjksH|jƒtjkrLtS|jƒ|jƒkS(N(t
GetVisibleR;t GetSightLevelRTtSightLevel_PublicR2(RmR((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytCheckSightLevel„s
*c
Cs£t||ƒstS|jƒs#tSt||ƒs6tS|jƒ}|jƒ}|tjkr‚|tjkr‚t||ƒstSn†|tjkr¹|tjkr¹t||tƒstSnO|tjkr|tjkr|j    ƒtj
krt||tƒstSqn|tjkr5|j ƒt j t jgksb|tjkrh|j ƒt j t jgkrhtnt}| r‰t||ƒ r‰tStj||ƒsŸtStS(N(tCheckIsAvailableTagR;t GetCanAttackRìRRR RtCheckCanAttackFamilyOwnerNPCtGetGameNPCObjTypet
gnotSummonR¦RTtntPriWoodPilePVER§R2tCheckCanAtkByAreaRMtCheckCanAttackTagObjInFB(RmRt
atkObjTypet
defObjTypet
isWoodPile((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytCheckCanAttackTag”s2   
-9c    CsG|jƒtjkrtS|jƒ}tjdƒ}||krDtS||\}}t|ƒ\}}|sptS|dkr‚|nd}||jƒko¥|knr®tS|dkrC|dkrî|dkrît
j |d||gƒqC|dkrt
j |d|dgƒqC|dkrCt
j |d|dgƒqCnt S(    s Åжϵ±Ç°µÈ¼¶¿É·ñ¹¥»÷¸ÃNPC tAttackNPCLVLimitiiŸ†tGeRen_liubo_689354tGeRen_liubo_198823itGeRen_liubo_437659N( RRRR2Rt ReadChConfigtGetEvalChConfigR’RÑR1R?RIR;(    RmRtnpcIDtattackLVLimitDicttminLVtmaxLVt    atkPlayert
npcObjTypet
judgeMaxLV((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytCheckCanAttackNPCByLVÔs*  "    cCs´|jƒtjkrtStj|ƒtjkr5tSt|ƒ\}}|sQtSd}t    |ƒrld}n|j
ƒsd}n|r°|dkr¬|r¬t j ||ƒntStS(s ÅжϿɷñ¹¥»÷ÏÉÃ˹éÊôµÄNPC ttFairyGrabBossNotAtktFairyGrabBossNoFairyN(RRRR2RKtGetDropOwnerTypeRTtDropOwnerType_FamilyR’RÓRZR1R?RIR;(RmRtisNotifyRRtatkLimitNotifyMark((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyRïùs"          c Csã|jƒtjkrtStj|ƒs,tS|jƒ}tjdƒ}t    j
||ƒ}|dkritSt |ƒ\}}|s…tStjddiƒ}||krß||\}    }
t j||    ƒsßtj||
ƒdSntS(s Åжϵ±ÈÕ»÷ɱ¸ÃNPC´ÎÊýÊÇ·ñÒÑÂú tKillBossCntLimitiN(RRRR2RTR…RRfRgRtGetDictValueByKeyR1R’t GameFuncCommt GetFuncCanUseR?RI( RmRR RÿtkillBossCntLimitDicttindexRRt funcInfoDicttfuncIDt funcSysMark((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytCheckKillNPCByCnts&    c    CsÊ|jƒtjkrtStj|ƒs,tStjdƒ\}}|jƒ}||kr]tSt    |ƒ\}}|sytS|j
tj dƒ}||krÆ|dkrÂ|rÂt j|dƒqÂntStS(s Åжϵ±ÈÕ¹¥»÷¸ÃNPC´ÎÊýÊÇ·ñÒÑÂú tAttackBossCntLimititGeRen_liubo_759061N(RRRR2RTR…RýRþRR’tNomalDictGetPropertytDef_PDict_WorldBoss_HurtCntR1R?RIR;(    RmRR tlimitBossIDListtlimitCntRÿRRt hasAttackCnt((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytCheckAttackNPCByCnt<s$    cCs¨|jƒ}|tjkr%|dfS|jƒ}|tjkr¤tj|ƒ}|r¤|jƒ}|r¡tj|ƒ}|rž|jƒtjkrž||fSq¡q¤ndS(sè »ñÈ¡¹¥»÷ÕßËùÊôÍæ¼ÒʵÀý
    @return:
             µ±Êµ¼Ê¹¥»÷ÕßÎªÍæ¼Òʱ£¬·µ»Ø [curPlayer, None] 
             µ±Êµ¼Ê¹¥»÷ÕßÊÇÆÕͨNPCʱ£¬·µ»Ø [None, None]
             µ±Êµ¼Ê¹¥»÷ÕßÊdzèÎï»òÕÙ»½ÊÞʱ£¬·µ»Ø [Ö÷ÈËcurPlayer, npcObjType]
    N(NN(    RRR R1RðRñRt GetObjDetailtGetOwner(tatkObjRõRt curNPCDetailt curNPCOwnert summonOwner((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyR’Zs 
  cCsœ|jtjƒ}|jtjƒ}|r:||kr:tStj|jƒ|jƒƒ}tj|jƒ|jƒƒ}|tj    ks”|tj    kr˜t
StS(N( RcRTtDef_PlayerKey_MirrorBattleIDR2R5R6R7R8RtgatSafeR;(R¿Rt curBattleIDt tagBattleIDtareaTypet tagAreaType((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyRóxscCst|dks|jƒdkr"tStj|ƒdksLtj|ƒdkrPtS|jƒs`tS|jƒsptStS(Ni(R1RR;RÚRRéR2(RmR((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyRí’s*  cCsO|dks|jƒdkr"tStj|ƒdkr;tS|jƒsKtStS(Ni(R1RR;RÚRRéR2(R¿((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytCheckObjCanDoLogic§s cCsdt||ƒsG|j|jƒ|jƒ|jƒ|jƒtjƒtS|j    ƒt
j kr`tSt S(N( RøtNotify_AttackFailRRR7R8RtafrNullR;tGetPlayerActionRTtDef_PlayerCanAttackStateR2(R&R((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytCheckPlayerCanAttackTag»s                
  cCs    | s| rtS|jƒtjkr+tS|jƒ}|jƒ}ttj    |||j
ƒ|j ƒƒtj    |j
ƒ|j ƒ|j
ƒ|j ƒƒƒ}|s¤tS|j ƒ}|dkrÀtS|t j|||tjƒ7}|sõ|tj7}n||krtStS(Ni(R;RRR R2tGetAttackTargetPosXtGetAttackTargetPosYtminRtGetDistR7R8t
GetAtkDisttPassiveBuffEffMngt!GetPassiveSkillValueByTriggerTypeRTtTriggerType_SkillDisttDef_PlayerAttackDistZoom(R&tcurTagtuseSkilltpreciseAtkDictt atkStartPosXt atkStartPosYtdistt    skillDist((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytCheckPlayerAttackDistæs&  $3   cCsCt||ƒstSt|||ƒs)tStj||ƒr?tStS(N(RøR;RºRt    IsSameObjR2(R‡Rtskill((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytCheckNPCCanAttackTag scCstS(N(R2(R‡R;RD((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyRº!scCsdS(N((RC((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytSuperAttackedBuff5scCs—|dks|jƒdkr"tS|jƒtjkr;tStj||ƒsQtStj    |ƒdkrjtSt
|||ƒs€tSt ||ƒr“tSt S(Ni( R1RR;RRR Rt IsSameCountryRÚRRBR³R2(R&R;RD((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytCheckSkill_ReBorn@scCsÝ|dks|jƒdkr"tStj||ƒr8tS|jƒtjkrQtSt    j
|ƒdkrjtSt |||ƒs€tSt ||ƒr“tS|j ƒ}|j ƒ}|dksÃ|dkrÇtS|jƒ|jƒkS(Ni(R1RR;RRCR2RRR RÚRRBR³RÜR$(R&R;RDt
curTagTeamt curPlayerTeam((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytCheckSkill_Teambs"  tHurtTypecBseZdZdZd„ZRS(icCs(d|_d|_d|_d|_dS(Ni(tHurtHPRLtLostHPt
RealHurtHP(tself((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyt__init__–s            (t__name__t
__module__RMRLRQ(((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyRLŽscCs||@S(N((t happenStatetcmpType((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytIsHappenStateByType¢scCsìtj}itddgtj6tddgtj6tddgtj6}tjtjg}|sj||fStjtjg}    g}
ittj6ttj6} g} x |
D]˜} t}x‰| D]}||ks¼|| kràq¼n|| kròq¼n| j|ƒ|r q¼n| |||||ƒ}|r¼|||<t    }q¼q¼Wq©Wxš|    D]’}||ksL|| krpqLn|| kr¸| j|ƒ| |||||ƒ}|r¸|||<q¸n||drL|tjkrL|}qLqLW||fS(s´ »ñÈ¡É˺¦ÀàÐͽá¹û 
    Ö§³Ö¶àÖÖÉ˺¦ÀàÐÍͬʱ´¥·¢, Æ®×Ö±íÏÖÒÔ×îÖÕ±íÏÖÉ˺¦ÀàÐÍΪÖ÷
    @return: ×îÖÕ±íÏÖÉ˺¦ÀàÐÍ, {É˺¦ÀàÐÍ:[ÊÇ·ñ´¥·¢, É˺¦¼ÆËãÖµ, ´¥·¢Ê±·ÀÊØ·½µÄÉ˺¦¼õÃâÖµ], ...}
    i(
RTtDef_HurtType_NormalR;tDef_HurtType_SuperHittDef_HurtType_ParrytDef_HurtType_ThumpHitt__HurtTypeHappen_SuperHitt__HurtTypeHappen_ParryR`R2(R"tdefObjRõRöRTR¢R    thurtTypeResultDictt calcTypeListt priorityListt    mutexListt
happenFunct hadCheckListtmutexHurtTypeListt curMHHappenthTypetresult((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytCalcHurtTypeResult¨sN    
 
 
 
    cCsÛt|tjƒr.t|jƒtj|ƒfS|jƒ}tj|ƒ}t    t
j dƒƒ}|t j |||tjƒ7}|t j|||tjƒ7}|dkr¬dStj|ƒr×t|jƒtj|ƒfSdS(sk ÅжÏÉ˺¦ÀàÐÍÊÇ·ñ·¢Éú - ±©»÷
    @return: ÊÇ·ñ´¥·¢, ´¥·¢Ê±É˺¦¼ÆËã¹Ì¶¨Öµ, ´¥·¢Ê±·ÀÊØ·½µÄÉ˺¦¼õÃâ¹Ì¶¨Öµ
    tCalcSuperHitRateiN(RVRTtDef_Skill_HappenState_SuperHitR2t GetSuperHitRÚtGetSuperHitReducetGetSuperHitRatetGetSuperHitRateReducetevalRýt GetChConfigR7t GetValueByPassiveBuffTriggerTypet TriggerType_Buff_AddSuperHitRateR8Rt    CanHappen(R"R]RTR¢t aSuperHitRatetdSuperHitRateReducet superHitRate((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyR[òs    cCsdS(si ÅжÏÉ˺¦ÀàÐÍÊÇ·ñ·¢Éú - ·ÀÊØ·½µÖÓù
    @return: ÊÇ·ñ´¥·¢, ´¥·¢Ê±É˺¦¼ÆËãÖµ, ´¥·¢Ê±·ÀÊØ·½µÄÉ˺¦¼õÃâÖµ
    N((R"R]RTR¢((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyR\s    cCs2tj||dtjƒ}|r.t|dfSdS(Ni(R7R8R1RTtTriggerType_IsDealyR2(R"R]RTR¢tdeadlyHitValue((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyt__HurtTypeHappen_Deadlys cCs¿t|tjƒr8tt|jƒdƒtj|ƒfSd}|tj    |||tj
ƒ7}|tj |||tj
ƒ7}|dkrŒdSt j |ƒr»t|jƒdtj|ƒfSdS(Ngø?ii(RVRTtDef_Skill_HappenState_ThumpHitR2tintRkRÚRlR7R8tTriggerType_AddThumpHitRateRqRRs(R"R]RTR¢t thumpHitRate((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyt__HurtTypeHappen_ThumpHits&    cCs«|s
|S|jƒtjkr#|S|jƒ}d}d}|tj||ƒ7}|jƒtjkr{tj||ƒ}n|s‡|r§||}td||ƒ}n|S(Ni(RRR tGetSkillTypeIDRštGetSkillAddPerByIDtGetSkillReducePerByIDtmax(R"R]R¢tskillPert skillTypeIDtaddPert    reducePert addSkillPer((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytChangeSkillHurtPer+s  
cCs>t|||ƒ}|s"||fS|jdƒ|jdƒfS(Nii(tGetCanChangeSkillHurtEffecttGetEffectValue(R&R]R¢Rƒt
skillValuet
findEffect((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytChangeSkillHurtTs
cCs‚|s
dS|jƒtjkr#dS|jƒtjkrQ|jƒtjkrQdS|jƒtjkrjdStj    ƒj
ƒtj kr­tj    ƒj ƒt jddƒkr­dSt|tjtjgƒ\}}|sØdS|tjkrF|jƒtjkrdStj    ƒj
ƒtj kr~tj    ƒj ƒt jddƒkr~dSn8|tjkr~|jdƒtj|ƒ@dkr~dSn|S(NtSkillXPAddByFBiii(RRRR¦t    ntMonstert    GetIsBossRTtDef_NPCType_Ogre_SuperRRPRQRRR\RfRgtGetSkillEffectByEffectIDstDef_Skill_Effect_AttackReplacet)Def_Skill_Effect_AttackReplaceByNPCSeriesRŠRKt GetNPCSeries(RmR]R¢RŒteffectID((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyR‰_s2*$ $"cCsdx]td|jƒƒD]F}|j|ƒ}|jƒ}|sCqn||krUqn||fSWdS(Ni(Ni(RµtGetEffectCountt    GetEffectt GetEffectIDR1(R¢t effectIDListRÁt    curEffectt curEffectID((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyR’…s   cCs_|s
|S|jƒtjkr#|S|jƒ}|tjkr[tj|ƒ}|sW|S|S|S(N(RRRR¦tntElfRKtGetSummonOwnerDetel(RmtnpcTypetowner((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytElfChangeAttackeršs cCs|s
tS|jƒ}|tjkr)tS|jƒ}|tjkrHtS|tjkrŒtj    |ƒ}|sptS|jƒtjkrŒtSntS(N(
R;RRR R2Rðt
gnotNormalRñRKRž(tgameObjtobjTypet
objNPCTypeR ((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytCheckIsPlayerOnwer®s  cCs|S(N((R"R]R
R¢RD((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyt CalcAtkProDefÅscCst|jƒtjkrdS|rA|jƒtjtjgkrAdS|jtjƒrWdS|j    tj|j
ƒƒdS(N( RRR t GetFuncTypeRTtDef_SkillFuncType_FbSkillt Def_SkillFuncType_TurnNormaSkillRctDef_PlayerKey_FirstDefenderReR(RmR]R¢((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytSetFirstDefenderÉscCs0|jƒtjkrdS|jtjdƒdS(Ni(RRR ReRTR«(Rm((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytClearFirstDefenderØscCs|jtjƒS(N(RcRTR«(Rm((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytGetFirstDefenderIDßsc
Cs˜t|ƒ}t|||ƒtƒ}|jƒ}tj|ƒ}    tj|ƒ}
tj|||t    j
ƒr¦t    j } tj|ƒ} | |_ | |_| |_ d} n…tj|||t    jƒrýt    j} tj|ƒ} | |_ | |_| |_ d} n.|dkr8t|ƒt    j} } | |jt    jƒ7} n‹tj||ƒrœtj|jƒ|ƒrœtj|jƒ|ƒ\}} t||jƒdƒ} n't||||||d|ƒ\} } t|||| | dƒt||| ||ƒ} | |_ | |_| |_ t|
td|    | ƒƒ} t| ƒ} |tj krõtj|ƒ}tj!|| t"ƒtj#|||t    j$|ƒ}|rÈtj|ƒ|t    j%}||krÇ| |krÇ|} n||krÜ|} ntj!|| t"ƒqÈnÓ|tj&kr³|j'ƒtj(krqÈ|j)ƒt    j*krit|    ttj|ƒd| ƒƒ} tj!|| ƒqÈ|j+ƒ}t,j-d|ƒ}|r t.|||ƒqÈtj!|| ƒnt/j0d|ƒ|Stj|ƒdkr!tj1|||t    j2ƒ}|r!t3j4|dt|| ƒƒq!n|    tj|ƒ}||_5|tj kr_t6j7||ƒnt||||j5|jdƒt8|||||ƒ|S(    NiiÈt    orgAtkObjs¹«Ê½²ãit NPCTimeLostHPs,¼ÆËãÉËѪֵʱ,·ÀÊØ·½ÀàÐÍ´íÎó£ºdefObjType = %ss×îÖÕ¿ÛѪ(9R¡R¬RLRRÚRtGetMaxHPR7R8RTtTriggerType_ZhongjiZhanshatDef_HurtType_ZhognjiZhanshaRMROtTriggerType_AttackKilltDef_HurtType_ZhanshaR{RWRctDef_PlayerKey_MoreHurtValuet
SkillShelltIsPlayerUseSkilltisClientHurtValueRtGetClientHurtByObjR4RÉt
CalcHurtHPt WriteHurtLogtCalcHurtHPWithBuffR‚RR tSetHPR;tOnObjsPassiveSkillLockHPtTriggerType_LockHPtDef_MaxRateValueRRðtgnotPetR¦tntHelpBattleRobotRRftGetIpyGameDataNotLogtUpdateTimeMonsterHPRRÌRqtTriggerType_ChangeHurtToHPRšt
SkillAddHPRNRMt
OnFBLostHPtAttackEventTrigger(RmR]R¢t atkSkillValuet atkSkillPerRDR"tresultHurtTypeRötdHPtdMaxHPR    R
tremainHPt clientValuetcurHPt    lockHPPertlockHPRÿttimeLostHPIpyDatat    changePert    lostValue((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyt    GetHurtHPïsŠ                                               *'                      % #    c Csk|jtjƒ}|jtj|ƒ| s<||dkrEd}n
||}|dkr_dS|jƒ}|jƒ}|jƒ}|jƒ}|jƒ}    |j    ƒ}
|j
ƒ} |j ƒ} |jtj ƒ|jtj ƒtj} |jtjƒ}|jtjƒ}| s#||dkrœ|jtj|ƒd}d}x¸t|jƒƒD]¤}|j|ƒ}|dkr|qUn|jƒsŽqUn|jƒ}|tjkr¯qUn|d7}|    rUtj|jƒ|ƒ}||sædn tj|ƒ7}qUqUWt|dƒ}t||ƒ} |
r7| |
kr7|
} n|rR||krR|}n|jtj | tjƒ|jtj | tjƒ|jtj|ƒn|}|dkrÉ|d|}||7}n|    r| r| r| r| |    t | ƒ| }||7}ntdt||dƒƒ}t!t"j#|ƒtdt"j$|ƒ|ƒƒ}t"j%||dt&ƒdS(    s¡
    NPC×ÜѪÁ¿ = µ¥ÈËÿÃëµôѪÁ¿*ÀíÂÛ»÷ɱËùÐèʱ¼ä
         µôѪֵ = µ¥ÈËÿÃëµôѪÁ¿+min(µ±Ç°ÈËÊý, ×î´óÈËÊý)*¸½¼ÓµôѪÁ¿+(ÓÐЧսÁ¦-±ê×¼Õ½Á¦)/xÕ½Á¦*xÕ½Á¦¸½¼ÓµôѪ
    iÐièiNi¸ ig@@tisByTime('RcRTtDef_NPC_Dict_TimeLostHPTickRetGetLostHPPerSecondtGetMaxPlayerCounttGetLostHPPerSecondExtGetFightPowerMinByLVtGetFightPowerMintGetFightPowerMaxtGetEveryFightPowertGetEveryFightPowerLostHPExt!Def_NPC_Dict_TimeLostHPFightPowert#Def_NPC_Dict_TimeLostHPFightPowerExRt"Def_NPC_Dict_TimeLostHPPlayerCountt&Def_NPC_Dict_TimeLostHPPlayerCountTicktxrangetGetInSightObjCounttGetInSightObjByIndexR1RéRRR RtGetObjRR?t GetFightPowerR‚R{tfloatR4RÚR±RR¾R2(R‡tipyDataRDtlastLostHPTicktpassTicktlostHPPerSecondtmaxPlayerCounttlostHPPerSecondExtfightPowerMinByLVt fightPowerMint fightPowerMaxteveryFightPowerteveryFightPowerLostHPExt effFightPowerteffPlayerCounttrefreshPlayerCountTicktfightPowerTotalRÁtseeObjt
seeObjTypet    seePlayerthurtValuePerSecondtplayerCountHurtExtfightPowerHurtExt lostHPTotalRÏ((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyRÅ`sp    
 
&           .c CsKt|||||ƒ}|jƒ}tj|tjƒ\}}}|rët||jdƒtj    ƒ}    |    rë||    8}t
j ||ƒd}
|
rè|
j t |
jƒ|    |
jƒƒƒ|
jƒ|
jƒkrå|
jdƒqåqèqëntj|tjƒ\}}}|r‡||jdƒtj    }    |    r‡||    8}t
j ||ƒd}
|
r„|
jt t|
jƒ|    ƒtjƒƒq„q‡ntt|ƒdƒ}tj||dtjƒ} |jtj|tjƒ|jtj|tjƒ| tj||dtjƒ7} t|ttj    | dƒdtj    ƒ}t|||ƒ}|S(Niigð?(R§t GetBuffStatet    BuffSkilltFindBuffEffectPlusByEffectIDRTtDef_Skill_Effect_AbsorbShieldR{RŠRRÁRšt FindBuffByIDt    SetValue1R4t    GetValue1tGetValuet SetRemainTimet!Def_Skill_Effect_AbsorbShieldXMZJtSetValuetDef_UpperLimit_DWordR‚R7RqR1tTriggerType_ReduceHurtHPPerRetDef_PlayerKey_curHurtValueRtDef_PlayerKey_curHurtValueExR8tCalcBloodShield( R"R]R
R¢RDt buffManagerR›t    plusValuetskillIDt absortValuetfindBuffR†((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyR½Ás8  
&
2+c CsŠtjƒjtjƒ}|s"dS|dkr^|s8dS|jƒtjkrQdSd|}n|rp|jƒnd}|rˆ|jƒnd}|r |j    ƒnd}    |r¸|j
ƒnd}
|rÐ|j ƒnd} |rè|j ƒnd} |r$|jƒtjkr$| j dƒj dƒ} n|rZ|jƒtjkrZ| j dƒj dƒ} ntjd||| || |    |
||f    ƒdS(NisÍæ¼ÒiRtutf8tgbksH¹¥»÷É˺¦-%s£º(%s %s)¹¥»÷(%s %s), ¼¼ÄÜID:(%s %s), É˺¦Öµ:%s, É˺¦ÀàÐÍ:%s (RRtGetGameWorldDictByKeyRtDef_Notify_WorldKey_HurtLogRRR Rt
GetSkillIDt GetSkillNameRBtdecodetencodetDebugLog( RmR]R¢R
R    tmsgtlogLevelt
attackerIDt
defenderIDRt    skillNamet attackerNamet defenderName((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyR¼ýs,      cCs6tj||ƒtj||dtjƒtj|ƒS(N(RÚtSetBloodShiledHurtR7RqR1RTtTriggerType_BloodShieldtGetBloodShiledHurt(R"R]R
((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyRscD Ks
d}d}    |jddƒr0|jddƒn|}
|
jƒtjkr·|
jƒtjkr·|
jtj    ƒ} | dkr·t
j |
ƒ} | s dtj fS| dtj }    q·n|jƒ} |jƒ}t||ƒ}|rê|n tj|ƒ}|tj|||tjƒ7}|jƒ}|jƒ}tj|ƒ}tj|ƒ}|tj||dtjƒ7}|r|jƒnd}d}d}|jtjƒ}t}tj|ƒröt}tj dƒt!tj"|ƒt#j$ddƒdƒ}n|s+t%|tj&ƒr+t}tj d|ƒq+nt'j(}| r tj)|||tj*ƒ r |jtj+ƒ}t,t#j-d    dƒƒ}tj.|ƒr dtj fSnt/||| |||ƒ\}}|tj0\}}} |sR|tj1\}}} d}!|!tj|||tj2ƒ7}!|!tj)|||tj2ƒ7}!||!tj tj }n\d}"|"tj|||tj3ƒ7}"|"tj)|||tj3ƒ7}"||"tj tj }|tj4d}#tj||dtj5ƒräd|fSt6|||||ƒ\}}t7||||ƒ}|tj|||tj8ƒ7}|tj)|||tj8ƒ7}|tj|||tj9ƒ7}|tj)|||tj9ƒ7}|tj)|||tj:ƒ7}tj|||tj;ƒ}$||$7}|tj1krC|tj|||tj<ƒ7}|tj)|||tj<ƒ7}tj=|||tj>|ƒn1|tj0krt|tj|||tj?ƒ7}nt@j@ƒ}%|jAƒ|    }&|jBƒ}'|'tj|||tjCƒ7}'|jDƒ}(|jEƒ})d}*tjF|ƒ}+|+tj|||tjGƒ7}+| tjHkrÁ|jIƒ},|jJƒ}-d}.d}/d}0d}1|1tj|||tjKƒ7}1d}2|2tj|||tjLƒ7}2|2tj)|||tjLƒ7}2d}3tMjN|ƒ}4nˆd},t
jJ|ƒ}-| tjkr |jƒtjOkr |-|jJƒ7}-nd}0d}1d}.d}/t
jP|ƒ}2d}3t
jQ|ƒ}4d}5tjR|ƒ}6|6tj|||tjSƒ7}6|tjHkrád}7d}8d}9d}:|:tj||dtjTƒ7}:d};d}<tMjN|ƒ}=n3d}7d}8d}9d}:d};d}<t
jQ|ƒ}=d}>d}?|tjUkr2n|d
:}|*d
:}*|5d
:}5|+d
:}+|6d
:}6tj d |||||&|(tjV|ƒfƒd |krð|jd dƒ}@|jddƒ}A|jd dƒ}Bt,t#j-ddƒƒ}CnÑ|s"    t,t#j-ddƒƒ}Ctj d|CƒnŸtjW|ƒr]    t,t#j-ddƒƒ}Ctj d|Cƒndtj|ƒr˜    t,t#j-ddƒƒ}Ctj d|Cƒn)t,t#j-ddƒƒ}Ctj d|Cƒ|dkrà    tX|C|ƒ}CntX|Cƒ}C|tjYkr
|$dkr
|CtjZfS|C|fS(NiR¯igð?s        XP±ØÃüÖÐtAngerXPis        ¼¼ÄܱØÃüÖÐ: skillID=%stMissCfggˆÃ@sLÉËѪ¼ÆËã: atkID=%s,defID=%s,skillID=%s,atkSkillPer=%s,aAtk=%s,dDef=%s,dHP=%sthurtFormulaKeyt    burnValuetburnPert
DOTFormulat HurtFormulais    ÆÕ¹¥É˺¦=%ss    ÆÕ¹¥¼¼ÄÜÉ˺¦=%ss    Å­Æø¼¼ÄÜÉ˺¦=%sis    ÆäËûÉ˺¦=%s([RR1RRRRðRñRcRTtDef_GameObjKey_InheritOwnerRKRžtDef_HurtType_MissRÁR¯R·tGetHappenStateR7R8tTriggerType_HappenStateRRÚtGetMissDefRatet GetMissRatetTriggerType_MissPerRtDef_Obj_Dict_TurnFightPosInfoR;Ršt isAngerSkillR2RRR‚tGetXPRfRÒRVtDef_Skill_HappenState_HitOntmathtpowRqtTriggerType_Buff_MustBeHittDef_Obj_Dict_TurnMissNumRotGetFuncCompileCfgRsRhRZRXtTriggerType_SuperHitPertTriggerType_AddThumpHitPerRYtTriggerType_OneDamageRRˆtTriggerType_SkillValuetTriggerType_AttackAddSkillPertTriggerType_BeAttackAddSkillPert"TriggerType_AttackAddSkillPerYinjitTriggerType_SuperHitSkillPertOnPassiveBuffTriggertTriggerType_SuperHitSubLayertTriggerType_ThumpSkillValuetrandomRÉt    GetIceAtktTriggerType_AddIceAtktGetDeft    GetIceDeftGetFinalHurtPertTriggerType_AttackAddFinalPerR tGetIgnoreDefRatetGetSkillAtkRatetTriggerType_AddPVPDamagePertTriggerType_AttackAddFinalValueR?RêRÂt GetFinalHurttGetSuppressFightPowertGetFinalHurtReducePertTriggerType_dFinalHurtReducePertTriggerType_DamageReducePVPRªRtisTurnNormalSkillR{RWtDef_HurtType_Yinji(DR"R]R¢RÊRËRDRTtatkwargst
multiValuet summonAtkPert summonAtkObjtsummonAtkPerValuet ownerAtkObjRõRötatkTypetatkIDtdefIDtaHittdMissRt    atkIsBosst angerOverflowtturnFightPosInfotmustHitR=tmissNumtmissRateR    R^t
isSuperHitt    aSuperHittdSuperHitReducet superHitPertthumpPert dDamChanceDeftatkSkillPerYinjitrandtaAtktaIceAtktdDeftdIceDeft aNormalAtkPert aFinalHurtPertaIgnoreDefRatet aSkillAtkRatet
aDamagePVPt
aDamagePVEtaNPCHurtAddPert aDamagePerPVPt
aFinalHurttaOnlyFinalHurtt aFightPowertdNormalAtkDefPertdFinalHurtReducePertdIgnoreDefRateReducetdSkillAtkRateReducetdDamagePVPReducetdDamagePerPVPReducetdFinalHurtReducet
dBeHurtPert dFightPowert
aPMHurtPert dPMHurtReducet
aBurnValuetaBurnPerR,R
((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyR»(s6**       +     !
 
"      $
 
 
 
 
    &    cCsd}tjd|ƒ}d}||krDt|d|dƒ}nt|d|dƒ}d}x$|D]}||j|dƒ7}qhW||S(Nit
RealmGroupiiÿÿÿÿ(RfRgRµR(taRealmLVtdRealmLVt    gridIndextsuppressRealmHurtPertsuppressRealmDictt
plus_minust suppressListtrealmLV((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytGetRealmHurtPer)s  cCs«|tjkrXt|ƒ\}}|r6|jƒ}qdtj|ƒ}|dkrddSn |jƒ}|tjkr•tj|ƒ}|dkr¡dSn |jƒ}||fS(Ni(ii(ii(RRR’tGetOfficialRankRKt
GetRealmLV(R"R]RõRöt ownerPlayerRR”R•((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytGetPVERealmLVs<s    cCs«t|||j|j|ƒt|||||ƒ|jƒtjkr§tj||j    ƒ|jƒtj
kr‹|j t j |jƒƒq§|j t j|jƒƒndS(N(t CalcBounceHPRNRLt CalcSuckBloodRRR RÚtSetLastHurtValueRORReRTtDef_PlayerKey_LastHurtNPCObjIDRtDef_PlayerKey_LastAttackerObjID(R"R]R¢RÌRD((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyRÉYscCsµ|jƒ}|tjkrdS|tjkr’|jtjƒrDdS|jƒtjkr]dS|jƒtj    krvdS|jƒtj
kr’dSn|j ƒ}|tj kr±dSdS(NtPtRobott    HelpRobottPettE( RRR RRcRTtDef_Obj_Dict_LineupPlayerIDR¦tntRobotRÃR§RðRÂ(R¨R¤((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytGetObjAtkStateMarkos   cCs:t}t|ƒst|ƒr,|s(dSdS|s6dSdS(NsPVE_%ssPetVE_%ssPVP_%ssPetVP_%s(R;t IsPVENPCObj(R"R]tisPet((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyt GetAtkState‡scCsy|jƒ}|tjkrtS|jƒ}|tjkr>tS|tjkrutjtj|ƒ}|dkrutSnt
S(N( RRR R;RðRÂRñRKtGetSummonNPCOwnerR1R2(R¨R¤tnpcOwner_Player((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyR®’s   c    CsÄ|jƒsdS|jƒ}|tjkr/dS|jƒ}t||||ƒ\}}|tjkrçtj|ƒrç||krçtj    d|ƒ}    tj    d|ƒ}
|    r¶|    j
ƒnd} |
rÎ|
j
ƒnd} | | krçdSnt j |ƒdkrdS|j ƒ} | tj|ddtjƒ7} | tj|||tjƒ7} || ttjƒ}t|tj|ddtjƒƒ}t|tj|ddtjƒƒ}|dkr»dS|t j |ƒkrÖ|nt j |ƒd}t|||ƒ}tt j |ƒ|dƒ}|jƒ}|tjkr]|jƒtjkrJq§t j||ƒnJ|tjkr§t j||tƒ|tjkr§t|||dƒq§nt||d|tj ƒdS(NtRealmiisPlayer bounce Player(!RîRRR R RRTR…RfRÄt
GetLvLargeRÚRtGetDamageBackRateR7R8R1tTriggerType_BounceHPPerRqt!TriggerType_BounceHPPerByAttackerRëRÁR{tTriggerType_BounceHPRR‚RðRÂR¾R;Ræt ChangeHPViewtDef_HurtType_BounceHurt(R"R]R
R    R¢RöRõR”R•t aRealmIpyDatat dRealmIpyDatat aRealmLVLarget dRealmLVLargetdefObj_DamageBackRatetbounceHPt    realSubHPRÏ((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyR¡¨sL   *  %% . c
Csò|jƒtjkrdS|j|j}}|s6dStjƒjƒ}||jt    j
ƒt    j t    j
krrdS|j t    j
|ƒd}|jƒtj krÈtj|ƒdkrÈ||jƒ7}nd}tj|||t    jƒ}    |    tj|||t    jƒ7}    |t    jkr9|    tj|||t    jƒ7}    n1|t    jkrj|    tj|||t    jƒ7}    n|t||    dt    jƒ7}||7}|dkr£dStj|ttj|ƒtj|ƒ|ƒtƒt|dd|t    j!ƒdS(Nigð?("RRR RORLRRtGetTickt GetTickByTypeRTtTYPE_Player_Tick_SuckBloodtTYPE_Player_Tick_Timet SetTickByTypeRRÚRt GetKillBackHPR7RqtTriggerType_Buff_SuckBloodPerR8RXt TriggerType_SuperHitSuckBloodPerRZt TriggerType_ThumpHitSuckBloodPerR{RÁR¾R4R±R;R¹R1tDef_HurtTYpe_Recovery(
R"R]R¢RÌRDR
R    tsuckHPt    atkBackHPt atkBackHPPer((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyR¢ös6*""
 2cCso|s
tS|jƒ}|tjkr8|jƒtjkS|tjkrZ|jƒtjkSt    j
d|ƒt S(Ns###GetIsDead = %s ( R2RRR R/tpaDieRt GetCurActiontlaNPCDieRtLogR;(ttagett    tagetType((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyt    GetIsDead+    s cCs<|jƒ}|tjkrtS|jƒtj|jƒkS(N(R%Rtg_maliciousAttackDictR;Ri(R&R<R((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyR9:    s cCsŒ|jƒ}|jƒ}i}|tjkr=tj|}n||krqtjƒ}||_tj||ƒn|||<|tj|<dS(N(R%RRÖtChPyNetSendPackttagMCAddMaliciousAtkPlayert AtkPlayerIDt NetPackCommont SendFakePack(Rt    defPlayerRDt atkPlayerIDt defPlayerIDtdefMaliciousAttackPlayerDicttaddAtkPlayerPack((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyR‰A    s        
 cCsV|jƒ}|tjkrdStj|}|jƒ}||krHdS|||<dS(N(R%RRÖ(RRÜRDRÝtmaliciousAtkPlayerDictRÞ((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyRŠU    s    
cCsÄ|jƒ}|tjkrdStjddƒd}tj|}xb|jƒD]T\}}|||krqqOn|j|ƒtjƒ}||_    t
j ||ƒqOW|sÀtjj|ƒndS(NRÐiiè( R%RRÖRfRÒR(R/R×ttagMCDelMaliciousAtkPlayerRÙRÚRÛ(R&RDRt
defendTimeRßRÝtatkTicktdelAtkPlayerPack((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytProcessMaliciousAttackPlayerc    s        cCst||ƒrtjtjfStj|jƒ|jƒƒ}tj|jƒ|jƒƒ}|tj    ksy|tj    kr‰tj
tj fS||kr¥tjtj fS|j ƒtjkrÊtjtjfSt|ƒrætjtjfSt|ƒrtjtjfSt||ƒr!tjtjfS|jƒ}|tjkrLtj
tjfS|tjkr»t||ƒrztj
tjfSt||ƒr™tj
tjfSt||ƒr„tj
tjfSnÉ|tjkrìt ||ƒr„tj
tj!fSn˜|tj"krrt||ƒrtj
tjfS|j#tj$ƒ}|j#tj%ƒ}|tj&ks_||j'ƒkr„tj
tjfSn|tj(kr„n|tj)krä|j*ƒt+j,ƒkr»tj
tj-fS|j*ƒ rät.ƒrätj
tj/fSnt0||ƒrtj
tjfStjtjfS(s*
    PKģʽ
        0    ºÍƽģʽ    IPY_GameWorld.amPeace            ¶ÔËùÓÐÍæ¼Ò¶¼ÊÇÓѺ㬶ñÒâ¹¥»÷×Ô¼ºµÄÍæ¼Ò³ýÍâ
        1    È«Ìåģʽ    IPY_GameWorld.amAll              ¶ÔËùÓÐÍæ¼Ò¶¼Êǵжԣ¬¼Ò×åÇøÓòͬÃËÍæ¼Ò³ýÍâ  
        2    ·ÀÎÀģʽ    IPY_GameWorld.amCountry          ±¾·þÍæ¼ÒÓѺã¬Ëû·þÍæ¼Ò¶¼ÊǵжÔ
        5    Ç¿ÖÆÄ£Ê½    IPY_GameWorld.amFamily           ¶ÓÓÑ¡¢ÏÉÃ˳ÉÔ±¡¢Í¬ÕóÓªÓѺã¬ÆäËûÍæ¼ÒµÐ¶Ô
        7    Ëø¶¨µ¥Ò»Ä¿±êģʽ IPY_GameWorld.amContest       Ö»¶ÔÑ¡ÖÐÄ¿±êÓÐÉ˺¦, Ä¿Ç°Ö»ÓÃÓÚ²¿·ÖBOSSÕù¶áµØÍ¼
        
    ³¡¾°ÇøÓò
        ÆÕÍ¨ÇøÓò    IPY_GameWorld.gatNormal    ¿É¸ù¾Ý²»Í¬PKģʽPK£¬»÷É±Íæ¼ÒÓгͷ£
        °²È«ÇøÓò    IPY_GameWorld.gatSafe      ²»ÄÜPK
        ×ÔÓÉÇøÓò    IPY_GameWorld.gatFreePK    ¿É¸ù¾Ý²»Í¬PKģʽPK£¬»÷É±Íæ¼ÒÎ޳ͷ£
        
    ¼ò»¯¹ØÏµÅжÏÂß¼­£º ¿É·ñ¹¥»÷È«Óɹ¥»÷ģʽ¾ö¶¨£¬²ß»®Í¨¹ýµØÍ¼Ä¬ÈÏģʽ¼°¿ÉÇл»Ä£Ê½¿ØÖÆPK¹ØÏµ
    
    Ç±¹æÔò:
        °²È«ÇøÓò²»¿É¹¥»÷
        ÆÕÍ¨ÇøÓòÖÐPKÖµ´ïµ½ÉÏÏÞ²»Äܹ¥»÷±ðÈË
        Ë«·½²»Í¬ÔÚÍ¬Ò»ÇøÓò²»¿É¹¥»÷
        ²»¿É¹¥»÷´ò×øÖеÄÍæ¼Ò
        ¶ñÒâ¹¥»÷×Ô¼ºµÄÍæ¼ÒÎÞÂÛʲôÇé¿ö϶¼¿É·´»÷£¬²»ÓÃÇл»Ä£Ê½
    (1RÔRTtType_Relation_NoneRÊR5R6R7R8RR'tType_Relation_FriendtDef_PASysMessage_IsSafeAreatDef_PASysMessage_CurAreaNotPKR/tpaSittDef_PASysMessage_SitNotPKRÓtDef_PASysMessage_NewGuyt Def_PASysMessage_NotAttackNewGuyR9tType_Relation_Enemyt GetAttackModetamPeacetDef_PASysMessage_AttackModetamFamilyt CanAlikeTeamtDef_PASysMessage_NotAttackTeamtCanAlikeFamilyt Def_PASysMessage_NotAttackFamilytCanAlikeFactiont!Def_PASysMessage_NotAttackFactiont    amCountryt IsSameServert Def_PASysMessage_NotAttackServert    amContestRctDef_PlayerKey_SelectObjTypetDef_PlayerKey_SelectObjIDR R%tamAllt    gatNormalR:R?t GetMaxPKValuetDef_PASysMessage_AttackNotPKtIsPKProtectTimetDef_PASysMessage_PKProtectTimeRÖ(R&R<tcurPlayerAreaTypettagPlayerAreaTypetcurPlayerAttackModet selectObjTypet selectObjID((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytGetPlayersRelation‚    s\    !c CsÅtjddƒ}|stS|\}}|\}}|\}}tjƒ}|j|j|j}}    }
tj||    |
||dƒ} tj||    |
||dƒ} || ks½|| krÁt    StS(NRÐii(
RfRgR;RtGetCurrentTimetyeartmonthtdaytdatetimeR2( tpkProtecTimeListt    startTimetendTimet    startHourt startMinutetendHourt    endMinutetcurTimetcurYeartcurMonthtcurDayt startDateTimet endDateTime((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyRï    s    cCstS(N(R2(R&RC((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyRû
scCs.|jƒ}|jƒ}|o-|o-||kS(N(t
GetFaction(R&RCt
curFactiont
tagFaction((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyRø
s  cCs.|jƒ}|jƒ}|o-|o-||kS(N(RZ(R&RCt curFamilyIDt tagFamilyID((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyRö
s  cCs.|jƒ}|jƒ}|o-|o-||kS(N(R$(R&RCtcurPlayerTeamIDt curTagTeamID((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyRô
s  cCs„tj|ƒdkrdS|jƒtjkrKtj|ƒ}|jƒdStj||||ƒsgdSt    j
|ƒ}|j ƒdS(Ni( RÚRRRR R?tSetDeadtChNPCt OnCheckCanDieRKR»t    SetKilled(R"t curObjDetelR¢RDt playerControlt
npcControl((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytDoLogic_ObjDead'
s
 
cCs÷tjƒjƒ}tjƒjƒ}|tjkrDtjdƒdS|jƒ}d}|jƒ}|j    ƒ}t
j |ƒ}    |jƒ}
d} |jƒ} |j    ƒ} t
j |ƒ}|j t |tjtjƒƒ|j t| tjdƒƒdS(Ns;    __GiveKill_Player_ValuePrize ¸±±¾µØÍ¼É±È˲»¸ø½±Àø£¡£¡£¡i(RRPRQR\RRRRRÑtGetInfamyValueR:R?RêtSetInfamyValueR4RTtDef_KillValue_NotorietyR R‚tDef_BeKilledValue_Notoriety(R&RRDRÕtmapIDtattackLVtattackPrestigetattackNotorietyt attackPkValuetattackFightPowertdefendLVtdefendPrestigetdefendNotorietyt defendPkValuetdefendFightPower((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyRJB
s&        cCsš|jƒtjkr1|jƒtjkr1tSntjƒj    |j
ƒ|j ƒ|j
ƒ|j ƒƒ}|jƒtj kr–| r–t j|dƒn|S(NtPK_liubo_827276(RRRRRTtDef_NPCType_Boss_BlueR2RRPt    CanLineToR7R8R R?RI(RmRt    canLineTo((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pytCanAttackByPathe
sc        Cs,d\}}|r.|jƒ|jƒ}}ntjƒj|jƒƒ}|rìtjƒ}|jƒ|_|jƒ|_    ||_
|t j |_ |t j |_||_||_||_|jƒ|_|jƒ|_|j|ƒdS|j||t j |t j ||||jƒ|jƒƒdS(Ni(ii(RRt
TurnAttacktGetTurnFightMgrt getTurnFightt    GetTFGUIDt ChNetSendPackttagObjPropertyRefreshViewtObjIDtObjTypetSkillIDRRt    DiffValuet DiffValueExt
AttackTypetSrcObjIDt
SrcObjTypeRtHPRtHPExt
addBatPackR¹(    R¿tsrcObjRtchangeHPt    changTypetsrcIDtsrcTypet    turnFightt
clientPack((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyR¹v
s*                   (xRLRRTRR?RKRšRMRýR5R7RRR·RfRRÚRRGR×RÚR&RERARR<RR R#R'R.R0R>RERVRORˆRŒR‹R™R¥R¡R¯R²RÇR¸RÏR³RÓRÔRÖRØR;RåRæRìRøRR2RïRRR’RóRíR,R1RBRERºRFRHRKRLRVRhR[R\RyR~RˆRR‰R’R¡R¦R§R¬R­R®R×RÅR½R¼RR1R»RœR RÉR­R°R®R¡R¢RÕR9R‰RŠRæR RRûRøRöRôR,RJR@R¹(((swD:\SG_ServerCode\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\Attack\AttackLogic\AttackCommon.pyt<module>sê                                              #                "    G                          
            %                               %            @    %  '                     + '                 "    ,        J                     )         &                                q    a    <          ÿ                             N    5                        m                                            #