358 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			358 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
|  | 
 | |||
|  | BrokenArrow_START_X <- 0 | |||
|  | BrokenArrow_START_Y <- 1 | |||
|  | BrokenArrow_START_Z <- 2 | |||
|  | 
 | |||
|  | BrokenArrow_MOV_X <- 3 | |||
|  | BrokenArrow_MOV_Y <- 4 | |||
|  | BrokenArrow_MOV_Z <- 5 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | function setCustomData_po_ATBrokenArrow(obj, reciveData) | |||
|  | { | |||
|  | 	if(!obj) return; | |||
|  | 	 | |||
|  | 	 | |||
|  | 	local xLen = reciveData.readDword(); | |||
|  | 	local yLen = reciveData.readDword(); | |||
|  | 	local zLen = reciveData.readDword(); | |||
|  | 	local attackRate = reciveData.readDword(); | |||
|  | 	local expTime = reciveData.readDword(); | |||
|  | 	local stunTime = reciveData.readDword(); | |||
|  | 	local angle = reciveData.readFloat() * 100; | |||
|  | 	 | |||
|  | 	local x = sq_GetXPos(obj); | |||
|  | 	local y = sq_GetYPos(obj); | |||
|  | 	local z = sq_GetZPos(obj); | |||
|  | 		 | |||
|  | 	obj.getVar("dis").clear_vector(); | |||
|  | 	 | |||
|  | 	obj.getVar("dis").push_vector(x); | |||
|  | 	obj.getVar("dis").push_vector(y); | |||
|  | 	obj.getVar("dis").push_vector(z); | |||
|  | 	 | |||
|  | 	obj.getVar("dis").push_vector(xLen); | |||
|  | 	obj.getVar("dis").push_vector(yLen); | |||
|  | 	obj.getVar("dis").push_vector(zLen); | |||
|  | 
 | |||
|  | 	obj.getVar("state").clear_vector(); // state vector | |||
|  | 	obj.getVar("state").push_vector(BrokenArrow_state_0); | |||
|  | 
 | |||
|  | 	local expT = expTime; // 唳霜卫除 | |||
|  | 
 | |||
|  | 	obj.getVar("fire").clear_vector(); // state vector | |||
|  | 	obj.getVar("fire").push_vector(expT); | |||
|  | 	 | |||
|  | 	local current100Angle = angle.tointeger(); | |||
|  | 	obj.getVar("angle").clear_vector(); | |||
|  | 	obj.getVar("angle").push_vector(current100Angle); | |||
|  | 	 | |||
|  | 	local pIntVec = sq_GetGlobalIntVector(); | |||
|  | 	sq_IntVectorClear(pIntVec); | |||
|  | 	sq_IntVectorPush(pIntVec, 0); | |||
|  | 	 | |||
|  | 	//sq_SetAttackInfoForceHitStunTime( | |||
|  | 	 | |||
|  | 	local atk = sq_GetCurrentAttackInfo(obj); | |||
|  | 	 | |||
|  | 	if(atk) | |||
|  | 	{ | |||
|  | 		sq_SetCurrentAttackBonusRate(atk, attackRate); | |||
|  | 		sq_SetAttackInfoForceHitStunTime(atk, stunTime); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	 | |||
|  | 	 | |||
|  | 	if(obj.isMyControlObject()) | |||
|  | 	{ | |||
|  | 		obj.addSetStatePacket(BrokenArrow_state_0, pIntVec, STATE_PRIORITY_AUTO, false, ""); | |||
|  | 	} | |||
|  | 
 | |||
|  | } | |||
|  | 
 | |||
|  | function setState_po_ATBrokenArrow(obj, state, datas) | |||
|  | { | |||
|  | 	if(!obj) return; | |||
|  | 	 | |||
|  | 	local passiveState = state; | |||
|  | 	 | |||
|  | 	obj.getVar("state").set_vector(0, passiveState); | |||
|  | 
 | |||
|  | 	if(passiveState == BrokenArrow_state_0) | |||
|  | 	{ | |||
|  | 		obj.sq_PlaySound("BARROW_SHOT"); | |||
|  | 	} | |||
|  | 	else if(passiveState == BrokenArrow_state_1) | |||
|  | 	{ | |||
|  | 		local ani = obj.getCustomAnimation(0); | |||
|  | 		obj.setCurrentAnimation(ani); | |||
|  | 	} | |||
|  | 	else if(passiveState == BrokenArrow_state_2) | |||
|  | 	{ | |||
|  | 		local ani = obj.getCustomAnimation(1); | |||
|  | 		obj.setCurrentAnimation(ani); | |||
|  | 	} | |||
|  | 	 | |||
|  | 	local current100Angle = obj.getVar("angle").get_vector(0); | |||
|  | 	 | |||
|  | 	if(current100Angle != -100) | |||
|  | 	{ | |||
|  | 		local pAni = obj.getCurrentAnimation(); | |||
|  | 		local angle = current100Angle.tofloat() / 100.0; | |||
|  | 		print(" set angle:" + angle); | |||
|  | 		//sq_SetfRotateAngle(pAni, angle); | |||
|  | 		//sq_SetfRotateAngle(pAni, 5.0); | |||
|  | 		//obj.void CNRDObject::setCustomRotate(bool isApply, float rotateAnlge) | |||
|  | 		obj.setCustomRotate(true, angle); | |||
|  | 
 | |||
|  | 	} | |||
|  | 	 | |||
|  | } | |||
|  | 
 | |||
|  | function procAppend_po_ATBrokenArrow(obj) | |||
|  | { | |||
|  | 
 | |||
|  | 	if(!obj) return; | |||
|  | 	 | |||
|  | //BrokenArrow_START_X <- 0 | |||
|  | //BrokenArrow_START_Y <- 1 | |||
|  | //BrokenArrow_START_Z <- 2 | |||
|  | // | |||
|  | //BrokenArrow_MOV_X <- 3 | |||
|  | //BrokenArrow_MOV_Y <- 4 | |||
|  | //BrokenArrow_MOV_Z <- 5 | |||
|  | 	local passiveState = obj.getVar("state").get_vector(0); | |||
|  | 	 | |||
|  | //BrokenArrow_state_0 <- 10 | |||
|  | //BrokenArrow_state_1 <- 11 | |||
|  | 	local pAni = obj.getCurrentAnimation(); | |||
|  | 	local currentT = sq_GetCurrentTime(pAni); | |||
|  | 
 | |||
|  | 	if(passiveState == 0) | |||
|  | 	{ | |||
|  | 		return; | |||
|  | 	}	 | |||
|  | 
 | |||
|  | 	if(passiveState == BrokenArrow_state_0) | |||
|  | 	{ | |||
|  | 
 | |||
|  | 		local fireT = 200; | |||
|  | 		local srcX = obj.getVar("dis").get_vector(BrokenArrow_START_X); // 卫蒙x | |||
|  | 		local srcY = obj.getVar("dis").get_vector(BrokenArrow_START_Y); // 卫蒙y | |||
|  | 		local srcZ = obj.getVar("dis").get_vector(BrokenArrow_START_Z); // 卫蒙z | |||
|  | 		    	 | |||
|  | 		local dis_x_len = obj.getVar("dis").get_vector(BrokenArrow_MOV_X); // 识 桧翕剪葬 | |||
|  | 		local dis_y_len = obj.getVar("dis").get_vector(BrokenArrow_MOV_Y); // y蹴 桧翕剪葬 | |||
|  | 		local endZ = obj.getVar("dis").get_vector(BrokenArrow_MOV_Z); // z蹴 桧翕剪葬 | |||
|  | 		 | |||
|  | 		local v = sq_GetUniformVelocity(0, dis_x_len, currentT, fireT); | |||
|  | 		local my = sq_GetUniformVelocity(0, dis_y_len, currentT, fireT); | |||
|  | 		local mz = sq_GetUniformVelocity(srcZ, endZ, currentT, fireT); | |||
|  | 		 | |||
|  | 		local dstX = sq_GetDistancePos(srcX, obj.getDirection(), v); | |||
|  | 		local dstY = srcY + my; | |||
|  | 		  | |||
|  | 		sq_setCurrentAxisPos(obj, 0, dstX); | |||
|  | 		sq_setCurrentAxisPos(obj, 1, dstY); | |||
|  | 		sq_setCurrentAxisPos(obj, 2, mz); | |||
|  | 
 | |||
|  | 		if(currentT >= fireT) | |||
|  | 		{ | |||
|  | 			if(obj.isMyControlObject()) | |||
|  | 			{ | |||
|  | 				sq_SendDestroyPacketPassiveObject(obj); | |||
|  | 			} | |||
|  | 		} | |||
|  | 	} | |||
|  | 	else if(passiveState == BrokenArrow_state_1) | |||
|  | 	{ | |||
|  | 		local fireT = obj.getVar("fire").get_vector(0); | |||
|  | 
 | |||
|  | 
 | |||
|  | 		if(obj.isMyControlObject()) | |||
|  | 		{ | |||
|  | 				 | |||
|  | 			local moveParent = sq_GetMoveParent(obj); | |||
|  | 			 | |||
|  | 			local changeState = false; | |||
|  | 			 | |||
|  | 			if(!moveParent) | |||
|  | 				changeState = true; | |||
|  | 				 | |||
|  | 			if(moveParent) | |||
|  | 			{ | |||
|  | 				local isSmashing = false; // ?溥纂朝 挡暮樯虽 | |||
|  | 				local parentState = obj.sq_GetParentState(); | |||
|  | 				local subState = obj.sq_GetParentSkillSubState(); | |||
|  | 				 | |||
|  | 				if(parentState == STATE_BROKENARROW && subState >= SUB_STATE_BROKENARROW_3) | |||
|  | 					isSmashing = true; | |||
|  | 					 | |||
|  | 				if(moveParent.getState() == STATE_DOWN && isSmashing == true) | |||
|  | 				{ | |||
|  | 					changeState = true; | |||
|  | 				} | |||
|  | 			} | |||
|  | 			 | |||
|  | 			if(currentT >= fireT) | |||
|  | 				changeState = true; | |||
|  | 			 | |||
|  | 			if(changeState == true) | |||
|  | 			{ | |||
|  | 				if(obj.isMyControlObject()) | |||
|  | 				{ | |||
|  | 					local pIntVec = sq_GetGlobalIntVector(); | |||
|  | 				 | |||
|  | 					sq_IntVectorClear(pIntVec); | |||
|  | 					sq_IntVectorPush(pIntVec, 0); | |||
|  | 
 | |||
|  | 					obj.addSetStatePacket(BrokenArrow_state_2, pIntVec, STATE_PRIORITY_AUTO, false, ""); | |||
|  | 				} | |||
|  | 			} | |||
|  | 		} | |||
|  | 	} | |||
|  | 	else if(passiveState == BrokenArrow_state_2) | |||
|  | 	{ | |||
|  | 		local isEnd = sq_IsEnd(pAni); | |||
|  | 		 | |||
|  | 		if(isEnd == true) | |||
|  | 		{ | |||
|  | 			if(obj.isMyControlObject()) | |||
|  | 			{ | |||
|  | 				sq_SendDestroyPacketPassiveObject(obj); | |||
|  | 			} | |||
|  | 		} | |||
|  | 	} | |||
|  | 	 | |||
|  | } | |||
|  | 
 | |||
|  | function onChangeSkillEffect_po_ATBrokenArrow(obj, skillIndex, reciveData) | |||
|  | { | |||
|  | 
 | |||
|  | 	if(!obj) return; | |||
|  | 
 | |||
|  | } | |||
|  | 
 | |||
|  | function onDestroyObject_po_ATBrokenArrow(obj, object) | |||
|  | { | |||
|  | 	if(!obj) return; | |||
|  | 
 | |||
|  | } | |||
|  | 
 | |||
|  | function onKeyFrameFlag_po_ATBrokenArrow(obj, flagIndex) | |||
|  | { | |||
|  | 
 | |||
|  | } | |||
|  | 
 | |||
|  | function onEndCurrentAni_po_ATBrokenArrow(obj) | |||
|  | { | |||
|  | 
 | |||
|  | 	if(!obj) return; | |||
|  | 
 | |||
|  | } | |||
|  | 
 | |||
|  | function onAttack_po_ATBrokenArrow(obj, damager, boundingBox, isStuck) | |||
|  | { | |||
|  | 	if(!obj) | |||
|  | 		return 0; | |||
|  | 	 | |||
|  | 	local pChr = obj.getTopCharacter(); | |||
|  | 	 | |||
|  | 	if(!pChr) | |||
|  | 		return 0; | |||
|  | 
 | |||
|  | 	// ?髦缣 蜃懊击 阳 ?髦 ?瞳		 | |||
|  | 	 | |||
|  | 	local x = sq_GetXPos(pChr); | |||
|  | 	local y = sq_GetYPos(pChr); | |||
|  | 	local z = sq_GetZPos(pChr); | |||
|  | 	 | |||
|  | 	local damagerX = sq_GetXPos(damager); | |||
|  | 	local damagerY = sq_GetYPos(damager); | |||
|  | 	local damagerZ = sq_GetZPos(damager); | |||
|  | 	 | |||
|  | 	local direction = ENUM_DIRECTION_LEFT; | |||
|  | 	 | |||
|  | 	if(x < damagerX) | |||
|  | 	{ | |||
|  | 		direction = ENUM_DIRECTION_RIGHT; | |||
|  | 	} | |||
|  | 	 | |||
|  | 	//local appendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj,  | |||
|  | 	//SKILL_BROKENARROW, true, "Character/ATMage/BrokenArrow/ap_ATBrokenArrow.nut", true); | |||
|  | 	// | |||
|  | 	 | |||
|  | 	//local ani = sq_CreateAnimation("", "PassiveObject/Character/Mage/Animation/ATBrokenArrow/hiteffect/00_arrow_normal.ani");	 | |||
|  | 	//local arrowObj = sq_CreatePooledObject(ani,true); | |||
|  | 	//sq_AddObjectTarget(obj, arrowObj, damager, OBJECTTYPE_DRAWONLY, BROKENARROW_UNIQUE_ID); | |||
|  | 	 | |||
|  | 	//arrowObj.setCurrentDirection(direction); | |||
|  | 	 | |||
|  | 	//local hitX = (sq_GetCenterXPos(boundingBox) - 5);// + sq_getRandom(0, 2); | |||
|  | 	local hitX = sq_GetXPos(damager) + sq_getRandom(0, 2); | |||
|  | 	local hitY = sq_GetYPos(damager) + 1; | |||
|  | 	local hitZ = (sq_GetCenterZPos(boundingBox) - 5) + sq_getRandom(0, 5); | |||
|  | 	 | |||
|  | 	//arrowObj.setCurrentPos(hitX,hitY,hitZ); | |||
|  | 	//sq_moveWithParent(damager, arrowObj); | |||
|  | 	 | |||
|  | 	obj.setCurrentPos(hitX,hitY,hitZ); | |||
|  | 	sq_moveWithParent(damager, obj); | |||
|  | 	 | |||
|  | 
 | |||
|  | 	local appendage = CNSquirrelAppendage.sq_AppendAppendage(damager, damager, SKILL_BROKENARROW,  | |||
|  | 	true, "Appendage/Character/ap_atmage_effect.nut", true); | |||
|  | 	 | |||
|  | 	print(" onattack"); | |||
|  | 	 | |||
|  | 	 | |||
|  | 	if(obj.isMyControlObject()) | |||
|  | 	{ | |||
|  | 		local passiveState = obj.getVar("state").get_vector(0); | |||
|  | 
 | |||
|  | 		print(" onattack:" + passiveState); | |||
|  | 		if(passiveState == BrokenArrow_state_0) | |||
|  | 		{ | |||
|  | 			local pIntVec = sq_GetGlobalIntVector(); | |||
|  | 		 | |||
|  | 			sq_IntVectorClear(pIntVec); | |||
|  | 			sq_IntVectorPush(pIntVec, 0); | |||
|  | 
 | |||
|  | 			obj.addSetStatePacket(BrokenArrow_state_1, pIntVec, STATE_PRIORITY_AUTO, false, ""); | |||
|  | 		} | |||
|  | 		else if(passiveState == BrokenArrow_state_1) | |||
|  | 		{ | |||
|  | 			local pIntVec = sq_GetGlobalIntVector(); | |||
|  | 			 | |||
|  | 			sq_IntVectorClear(pIntVec); | |||
|  | 			sq_IntVectorPush(pIntVec, 0); | |||
|  | 
 | |||
|  | 			obj.addSetStatePacket(BrokenArrow_state_2, pIntVec, STATE_PRIORITY_AUTO, false, ""); | |||
|  | 			//sq_SendDestroyPacketPassiveObject(obj); | |||
|  | 		} | |||
|  | 		 | |||
|  | 		//local group = sq_GetGroup(damager); | |||
|  | 		//local uniqueId = sq_GetUniqueId(damager); | |||
|  | 		// | |||
|  | 		//sq_BinaryStartWrite(); | |||
|  | 		//sq_BinaryWriteWord(group); | |||
|  | 		//sq_BinaryWriteWord(uniqueId); | |||
|  | 		// | |||
|  | 		//sq_SendChangeSkillEffectPacket(pChr, SKILL_BROKENARROW); | |||
|  | 	 | |||
|  | 	 | |||
|  | 		//sq_SendDestroyPacketPassiveObject(obj); | |||
|  | 	} | |||
|  | 	 | |||
|  | 	return 0; | |||
|  | } | |||
|  | 
 | |||
|  | 
 | |||
|  | function getCustomHitEffectFileName_po_ATBrokenArrow(obj, isAttachOnDamager) | |||
|  | { | |||
|  | 	return "PassiveObject/Character/Mage/Animation/ATBrokenArrow/02_arrowboom_dodge.ani"; | |||
|  | } | |||
|  | 
 | |||
|  | 
 | |||
|  |  |