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