347 lines
9.8 KiB
Plaintext
347 lines
9.8 KiB
Plaintext
ATMAGE_MAGIC_ANI_TYPE_BACK <- 0;
|
||
ATMAGE_MAGIC_ANI_TYPE_FRONT <- 1;
|
||
ATMAGE_MAGIC_ANI_TYPE_CIRCLE <- 2;
|
||
|
||
VAR_MAGIC_SHIELD_BACK_ANI <- 0;
|
||
VAR_MAGIC_SHIELD_FRONT_ANI <- 1;
|
||
VAR_MAGIC_SHIELD_ICE_HIT_COUNT <- 2; // 热楼撩 尔?虞桧 虞击热 毡朝 苹遴? ?热.
|
||
|
||
function sq_AddFunctionName(appendage)
|
||
{
|
||
appendage.sq_AddFunctionName("proc", "proc_appendage_MagicShield")
|
||
appendage.sq_AddFunctionName("onStart", "onStart_appendage_MagicShield")
|
||
appendage.sq_AddFunctionName("onEnd", "onEnd_appendage_MagicShield")
|
||
appendage.sq_AddFunctionName("onDamageParent", "onDamageParent_appendage_MagicShield")
|
||
appendage.sq_AddFunctionName("drawAppend", "drawAppend_appendage_MagicShield")
|
||
appendage.sq_AddFunctionName("getImmuneTypeDamageRate", "getImmuneTypeDamageRate_appendage_MagicShield")
|
||
}
|
||
|
||
function sq_AddEffect(appendage)
|
||
{
|
||
}
|
||
|
||
|
||
function drawAppend_appendage_MagicShield(appendage, isOver, x, y, isFlip)
|
||
{
|
||
if (!appendage) {
|
||
return;
|
||
}
|
||
|
||
local obj = appendage.getParent();
|
||
|
||
if (!obj) {
|
||
appendage.setValid(false);
|
||
return;
|
||
}
|
||
local var = appendage.getVar();
|
||
local backAni = var.getAnimation(VAR_MAGIC_SHIELD_BACK_ANI);
|
||
local frontAni = var.getAnimation(VAR_MAGIC_SHIELD_FRONT_ANI);
|
||
|
||
if (frontAni && isOver) {
|
||
sq_AnimationProc(frontAni);
|
||
sq_drawCurrentFrame(frontAni, x, y, isFlip);
|
||
}
|
||
else if (backAni && !isOver) {
|
||
sq_AnimationProc(backAni);
|
||
sq_drawCurrentFrame(backAni, x, y, isFlip);
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
function getImmuneTypeDamageRate_appendage_MagicShield(appendage, damageRate, attacker)
|
||
{
|
||
if (!appendage)
|
||
return damageRate;
|
||
|
||
local parentObj = appendage.getParent();
|
||
parentObj = sq_GetCNRDObjectToSQRCharacter(parentObj);
|
||
|
||
if (!parentObj) {
|
||
appendage.setValid(false);
|
||
return damageRate;
|
||
}
|
||
|
||
local var = appendage.getVar();
|
||
if (!var)
|
||
return damageRate;
|
||
|
||
|
||
|
||
local type = parentObj.getThrowElement();
|
||
|
||
|
||
// 热楼撩 : 等嘐虽 橾姜 ?热 谏瞪 寞横
|
||
if (type == ENUM_ELEMENT_WATER)
|
||
return 0;
|
||
|
||
local type = parentObj.getThrowElement();
|
||
// 溯涟樯?煎 等嘐虽徽桧 亵姜脾.
|
||
local skill_level = parentObj.sq_GetSkillLevel(SKILL_MAGIC_SHIELD);
|
||
local decreaseRate = parentObj.sq_GetLevelData(SKILL_MAGIC_SHIELD, 1, skill_level); // 1. 等嘐虽 马模徽(%)
|
||
damageRate = damageRate - decreaseRate;
|
||
return damageRate;
|
||
}
|
||
|
||
|
||
function removeMagicShield(obj)
|
||
{
|
||
CNSquirrelAppendage.sq_RemoveAppendage(obj, "Character/ATMage/MagicShield/ap_MagicShield.nut");
|
||
}
|
||
|
||
|
||
// 等嘐虽卫 籀葬.
|
||
// 鼠楼撩 : 嫡朝 等嘐虽 橾姜 % 马模
|
||
// ?楼撩 : ?问卫 瞳缣啪 ?楼撩 等嘐虽
|
||
// 热楼撩 : 等嘐虽 橾姜 ?热 谏瞪 寞横
|
||
// 赀楼撩 : ?问卫 橾姜卫除 瞳 唳霜
|
||
// 檩楼撩 : ?问卫 奢问濠 菩?
|
||
|
||
function onDamageParent_appendage_MagicShield(appendage ,attacker, boundingBox, isStuck)
|
||
{
|
||
if (!appendage) {
|
||
return;
|
||
}
|
||
|
||
local parentObj = appendage.getParent();
|
||
parentObj = sq_GetCNRDObjectToSQRCharacter(parentObj);
|
||
|
||
if (!parentObj) {
|
||
appendage.setValid(false);
|
||
return;
|
||
}
|
||
|
||
local var = appendage.getVar();
|
||
if (!var)
|
||
return;
|
||
|
||
local type = parentObj.getThrowElement();
|
||
|
||
local circleObj = sq_AddDrawOnlyAniFromParent(parentObj, getMagicShieldAniPath(ATMAGE_MAGIC_ANI_TYPE_CIRCLE, type) ,0,-1,0);
|
||
if (circleObj) {
|
||
circleObj.setCurrentDirection(sq_GetOppositeDirection(attacker.getDirection()));
|
||
var.push_obj_vector(circleObj);
|
||
}
|
||
|
||
if (isStuck)
|
||
return;
|
||
|
||
local skill_level = sq_GetSkillLevel(parentObj, SKILL_MAGIC_SHIELD);
|
||
|
||
// ?楼撩 : ?问卫 瞳缣啪 ?楼撩 等嘐虽
|
||
if (type == ENUM_ELEMENT_FIRE)
|
||
{
|
||
local sqrChr = sq_GetCNRDObjectToSQRCharacter(parentObj);
|
||
if (sqrChr)
|
||
{
|
||
if (!(parentObj.sq_GetTeam() == attacker.getTeam()))
|
||
{
|
||
local fireDamage = sqrChr.sq_GetPowerWithPassive(SKILL_MAGIC_SHIELD, STATE_MAGIC_SHIELD, 2,-1,1.0);
|
||
local ap = sq_getNewAttackInfoPacket();
|
||
ap.power = fireDamage;
|
||
ap.element = ENUM_ELEMENT_FIRE;
|
||
ap.useWeapon = false;
|
||
ap.eType = ATTACKTYPE_MAGICAL;
|
||
if (parentObj.isMyControlObject())
|
||
sq_SendHitObjectPacketByAttackInfo(parentObj, attacker, ap);
|
||
}
|
||
}
|
||
}
|
||
// 热楼撩 : 等嘐虽 橾姜 ?热 谏瞪 寞横
|
||
if (type == ENUM_ELEMENT_WATER)
|
||
{
|
||
if (!attacker.isObjectType(0x0821))
|
||
{
|
||
if (!(parentObj.sq_GetTeam() == attacker.getTeam()))
|
||
{
|
||
local currentIceGuardCount = var.getInt(VAR_MAGIC_SHIELD_ICE_HIT_COUNT); // 热楼撩 尔? ?热
|
||
currentIceGuardCount--;
|
||
|
||
if (currentIceGuardCount <= 0)
|
||
appendage.setValid(false);
|
||
|
||
var.setInt(VAR_MAGIC_SHIELD_ICE_HIT_COUNT,currentIceGuardCount);
|
||
}
|
||
}
|
||
}
|
||
// 赀楼撩 : ?问卫 橾姜卫除 瞳 唳霜
|
||
else if (type == ENUM_ELEMENT_LIGHT)
|
||
{
|
||
if (!(parentObj.sq_GetTeam() == attacker.getTeam()))
|
||
{
|
||
local stunTime = sq_GetLevelData(parentObj, SKILL_MAGIC_SHIELD, 4, skill_level); // 4. 瞳 唳霜 卫除
|
||
|
||
local ap = sq_getNewAttackInfoPacket();
|
||
ap.hitStunTimeAttackerDamager = stunTime;
|
||
sq_SendHitObjectPacketByAttackInfo(parentObj, attacker, ap);
|
||
}
|
||
}
|
||
// 檩楼撩 : ?问卫 奢问濠 菩?
|
||
else if (type == ENUM_ELEMENT_DARK)
|
||
{
|
||
if (!(parentObj.sq_GetTeam() == attacker.getTeam()))
|
||
{
|
||
local prob = sq_GetLevelData(parentObj, SKILL_MAGIC_SHIELD, 5, skill_level)/10.0; // 5. 菩? ?睦 (0.1%)
|
||
local level = sq_GetLevelData(parentObj, SKILL_MAGIC_SHIELD, 6, skill_level); // 6. 菩? 溯涟
|
||
local time = sq_GetLevelData(parentObj, SKILL_MAGIC_SHIELD, 7, skill_level); // 7. 虽楼卫除
|
||
|
||
sq_sendSetActiveStatusPacket(attacker, parentObj, ACTIVESTATUS_SLOW, prob.tofloat(), level, false, time); // ?睦, 溯涟, 鬼薯, 卫除
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
function getMagicShieldAniPath(aniType, elementType)
|
||
{
|
||
local commonPath = "Character/Mage/Effect/Animation/ATMagicShield/";
|
||
local aniName = "00_shield_"; //ATMAGE_MAGIC_ANI_TYPE_BACK
|
||
local typeName = "none"; // ENUM_ELEMENT_NONE
|
||
|
||
if (aniType == ATMAGE_MAGIC_ANI_TYPE_FRONT)
|
||
aniName = "01_shield_";
|
||
else if (aniType == ATMAGE_MAGIC_ANI_TYPE_CIRCLE)
|
||
aniName = "02_shield_";
|
||
|
||
if (elementType == ENUM_ELEMENT_WATER)
|
||
typeName = "ice";
|
||
else if (elementType == ENUM_ELEMENT_FIRE)
|
||
typeName = "fire";
|
||
else if (elementType == ENUM_ELEMENT_DARK)
|
||
typeName = "dark";
|
||
else if (elementType == ENUM_ELEMENT_LIGHT)
|
||
typeName = "light";
|
||
|
||
return commonPath + aniName + typeName + "_dodge.ani";
|
||
}
|
||
|
||
function setMagicShieldType(appendage, obj, type)
|
||
{
|
||
local parentObj = sq_GetCNRDObjectToSQRCharacter(obj);
|
||
|
||
if (!parentObj) {
|
||
appendage.setValid(false);
|
||
return;
|
||
}
|
||
local var = appendage.getVar();
|
||
|
||
local currentAniFrameIndex = 0; // 晦襄 楼撩 桧?? 拥栖谛 褐叙 桧?? 拥栖谛 翕晦?蒂 嫔?.
|
||
local backAni = var.getAnimation(VAR_MAGIC_SHIELD_BACK_ANI);
|
||
local frontAni = var.getAnimation(VAR_MAGIC_SHIELD_FRONT_ANI);
|
||
|
||
if (backAni && frontAni) {
|
||
currentAniFrameIndex = sq_GetAnimationFrameIndex(backAni);
|
||
sq_DeleteAni(backAni);
|
||
sq_DeleteAni(frontAni);
|
||
}
|
||
|
||
backAni = sq_CreateAnimation("", getMagicShieldAniPath(ATMAGE_MAGIC_ANI_TYPE_BACK, type));
|
||
frontAni = sq_CreateAnimation("", getMagicShieldAniPath(ATMAGE_MAGIC_ANI_TYPE_FRONT, type));
|
||
|
||
sq_SetAnimationFrameIndex( backAni, currentAniFrameIndex); // ?溯歜 翕晦?
|
||
sq_SetAnimationFrameIndex( frontAni, currentAniFrameIndex);
|
||
|
||
var.setAnimation(VAR_MAGIC_SHIELD_BACK_ANI,backAni); // 渗热 荡潍 : 嫔纂 翕晦?辨
|
||
var.setAnimation(VAR_MAGIC_SHIELD_FRONT_ANI,frontAni);
|
||
}
|
||
|
||
function setMagicShieldTime(obj,time)
|
||
{
|
||
local appendage = CNSquirrelAppendage.sq_GetAppendage(obj, "Character/ATMage/MagicShield/ap_MagicShield.nut");
|
||
|
||
if (!appendage)
|
||
return;
|
||
|
||
appendage.sq_SetValidTime(time);
|
||
}
|
||
|
||
function proc_appendage_MagicShield(appendage)
|
||
{
|
||
if (!appendage) {
|
||
return;
|
||
}
|
||
|
||
local parentObj = appendage.getParent();
|
||
parentObj = sq_GetCNRDObjectToSQRCharacter(parentObj);
|
||
|
||
if (!parentObj) {
|
||
appendage.setValid(false);
|
||
return;
|
||
}
|
||
|
||
local var = appendage.getVar();
|
||
local objectsSize = var.get_obj_vector_size();
|
||
for (local i=0;i<objectsSize;++i)
|
||
{
|
||
local circle = var.get_obj_vector(i);
|
||
if (circle)
|
||
sq_SetCurrentPos(circle, parentObj.getXPos(), parentObj.getYPos()+1, parentObj.getZPos());
|
||
}
|
||
}
|
||
|
||
|
||
|
||
function onStart_appendage_MagicShield(appendage)
|
||
{
|
||
if (!appendage) {
|
||
return;
|
||
}
|
||
|
||
local parentObj = appendage.getParent();
|
||
parentObj = sq_GetCNRDObjectToSQRCharacter(parentObj);
|
||
|
||
if (!parentObj) {
|
||
appendage.setValid(false);
|
||
return;
|
||
}
|
||
|
||
//渗热 蟾晦?
|
||
local var = appendage.getVar();
|
||
local skill_level = sq_GetSkillLevel(parentObj, SKILL_MAGIC_SHIELD);
|
||
local maxIceGuardHit = sq_GetLevelData(parentObj, SKILL_MAGIC_SHIELD, 3, skill_level); // 3. 热楼撩 等嘐虽 ?热 ?热
|
||
var.setInt(VAR_MAGIC_SHIELD_ICE_HIT_COUNT, maxIceGuardHit);
|
||
|
||
// 罹晦缣怃 议葛搅 楼撩击 嫡嬴谛怃 楼撩 高击 虽姜?邀.
|
||
local elementalType = parentObj.getThrowElement();
|
||
setMagicShieldType(appendage, parentObj, elementalType);
|
||
|
||
// 卫除击 虽姜
|
||
local skill_level = sq_GetSkillLevel(parentObj,SKILL_MAGIC_SHIELD);
|
||
local time = sq_GetLevelData(parentObj, SKILL_MAGIC_SHIELD, 0, skill_level); // 0. 虽楼卫除
|
||
|
||
setMagicShieldTime(parentObj,time);
|
||
parentObj.sq_PlaySound("ESHIELD_LOOP",SKILL_MAGIC_SHIELD);
|
||
}
|
||
|
||
|
||
|
||
function onEnd_appendage_MagicShield(appendage)
|
||
{
|
||
if (!appendage) {
|
||
return;
|
||
}
|
||
|
||
local parentObj = appendage.getParent();
|
||
parentObj = sq_GetCNRDObjectToSQRCharacter(parentObj);
|
||
if (!parentObj) {
|
||
appendage.setValid(false);
|
||
return;
|
||
}
|
||
|
||
local var = appendage.getVar();
|
||
local backAni = var.getAnimation(VAR_MAGIC_SHIELD_BACK_ANI);
|
||
local frontAni = var.getAnimation(VAR_MAGIC_SHIELD_FRONT_ANI);
|
||
|
||
if (backAni && frontAni) {
|
||
sq_DeleteAni(backAni);
|
||
sq_DeleteAni(frontAni);
|
||
}
|
||
|
||
var.clear_obj_vector();
|
||
parentObj.stopSound(SKILL_MAGIC_SHIELD);
|
||
}
|
||
|
||
|
||
|
||
|
||
|