Sqr/character/atmage/magicshield/ap_magicshield.nut

347 lines
9.8 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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);
}