Sqr/character/atmage/magicshield/ap_magicshield.nut

347 lines
9.8 KiB
Plaintext
Raw Normal View History

2024-03-18 21:37:40 +08:00
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);
}