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