301 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			301 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
|  | getroottable()["IceOrbExCreatePos"] <- {}; | ||
|  | getroottable()["IceOrbExCreatePos"] = [[28,28],	// 0 | ||
|  | 											[22,-24],	// 1 | ||
|  | 											[-21,0],	// 2 | ||
|  | 											[-5,-28],	// 3 | ||
|  | 											[-17,36],	// 4 | ||
|  | 											[8,-19],	// 5 | ||
|  | 											[-31,9],	// 6 | ||
|  | 											[-2,42],	// 7 | ||
|  | 											[-24,-24],	// 8 | ||
|  | 											[36,7]];	// 9 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | PO_ICE_ORB_ETC_ANI_READY	 <- 0;	// 赅暮 1 : 姜虽, 遽绿 | ||
|  | PO_ICE_ORB_ETC_ANI_ATTACK	 <- 1;	// 赅暮 2 : 陛卫奢问 | ||
|  | PO_ICE_ORB_ETC_ANI_EXPLOSION <- 2;	// 赅暮 3 : ?嫦	 | ||
|  | 
 | ||
|  | PO_ICE_ORB_SUB_STATE_FLYING	<- 2; // 陈嬴马 | ||
|  | PO_ICE_ORB_SUB_STATE_READY		<- 3; // 奢问遽绿,姜虽 | ||
|  | PO_ICE_ORB_SUB_STATE_ATTACK	<- 4; // 奢问,陛卫络挤 | ||
|  | PO_ICE_ORB_SUB_STATE_EXPLOSION <- 5; // ?嫦 | ||
|  | 
 | ||
|  | //PO_ICE_ORB_VAR_TIME		<- 0; // 陈嬴陛朝 卫除 | ||
|  | PO_ICE_ORB_VAR_SPEED	<- 1; // 陈嬴陛朝 楼紫 | ||
|  | PO_ICE_ORB_VAR_GAP		<- 2; // 陛卫 当撩 卫除除问 | ||
|  | PO_ICE_ORB_VAR_POWER	<- 3; // 陛卫 奢问溘 | ||
|  | PO_ICE_ORB_VAR_MAXCOUNT <- 4; // 陛卫 当撩 譆渠 偎热. | ||
|  | PO_ICE_ORB_VAR_TARGET_X <- 5; // 迹瞳虽 X谢? | ||
|  | PO_ICE_ORB_VAR_TARGET_Z <- 6; // 迹瞳虽 z谢? | ||
|  | 
 | ||
|  | 
 | ||
|  | PO_ICE_ORB_TIMER_FLYING <- 0; //陈嬴陛朝 卫除 | ||
|  | PO_ICE_ORB_TIMER_ATTACK_GAP <- 1; //陛卫 奢问 卫除 除问 | ||
|  | PO_ICE_ORB_TIMER_WAITING_END <- 2; //葆虽虞 陛卫 奢问? 拥栖 部陈阳 梱虽 卫除 除问 | ||
|  | 
 | ||
|  | PO_ICE_ORB_CONST_PRICKLE_ANI_TIME <- 160; // 陛卫 拥栖暧 识 卫除. : 葆虽虞 陛卫陛 当撩胀? 葆虽虞 陛卫陛 饵塭韩阳梱虽 渠晦 卫除 | ||
|  | PO_ICE_ORB_CONST_START_FRAME	  <- 6; //籀挤 卫蒙? ?溯歜 | ||
|  | 
 | ||
|  | function setCustomData_po_ATIceOrbEx(obj, reciveData) | ||
|  | { | ||
|  | 	if(!obj) return;	 | ||
|  | 	 | ||
|  | 	local speed			= reciveData.readDword(); | ||
|  | 	local gap			= reciveData.readDword(); | ||
|  | 	local pricklePower	= reciveData.readFloat(); | ||
|  | 	local lastPower		= reciveData.readFloat(); | ||
|  | 	local maxCount		= reciveData.readDword();		 | ||
|  | 	local direction		= reciveData.readWord(); | ||
|  | 	local targetPos		= reciveData.readDword(); | ||
|  | 			 | ||
|  | 	obj.setDirection(direction); // 寞?击 睡赅偌羹谛 翕橾?啪 | ||
|  | 	 | ||
|  | 	 | ||
|  | 	local var = obj.getVar(); | ||
|  | 	var.setInt(PO_ICE_ORB_VAR_SPEED		,speed); | ||
|  | 	var.setInt(PO_ICE_ORB_VAR_GAP		,gap); | ||
|  | 	var.setFloat(PO_ICE_ORB_VAR_POWER	,pricklePower); | ||
|  | 	var.setInt(PO_ICE_ORB_VAR_MAXCOUNT	,maxCount); | ||
|  | 	var.setInt(PO_ICE_ORB_VAR_TARGET_X	,targetPos); | ||
|  | 	var.setInt(PO_ICE_ORB_VAR_TARGET_Z	,obj.getZPos()); | ||
|  | 	 | ||
|  | 	 | ||
|  | 	obj.sendStateOnlyPacket(PO_ICE_ORB_SUB_STATE_FLYING); | ||
|  | 	 | ||
|  | 	// 虞颤 奢问溘 荡潍 | ||
|  | 	local currentAttackInfo = sq_GetCurrentAttackInfo(obj); | ||
|  | 	sq_SetCurrentAttackBonusRate(currentAttackInfo, lastPower.tointeger()); | ||
|  | 	 | ||
|  | } | ||
|  | 
 | ||
|  | //陛卫 当撩 ?热. | ||
|  | function createIcePrickleByIceOrbEx(obj, index, isFirst) | ||
|  | { | ||
|  | 	// 当撩 嫔纂陛 蟾娄 肾贼 蟾娄 寰肾朝 彰嫔煎 虽姜			 | ||
|  | 	local createPosMax = ::IceOrbExCreatePos.len();	 | ||
|  | 	index = index % createPosMax;  | ||
|  | 	 | ||
|  | 	local pos = ::IceOrbExCreatePos[index];	 | ||
|  | 	local x = pos[0];	 | ||
|  | 	local z = pos[1]; | ||
|  | 	 | ||
|  | 	// 桧嘐虽蒂 1.5寡 ?渠 ?棻. 评塭怃 陛卫暧 当撩嫔纂紫 1.5寡 渗?棻. | ||
|  | 	x = x.tofloat() * 1.0; | ||
|  | 	z = z.tofloat() * 1.0; | ||
|  | 	 | ||
|  | 	local var	= obj.getVar(); | ||
|  | 	local power = var.getFloat(PO_ICE_ORB_VAR_POWER); | ||
|  | 	 | ||
|  | 	sq_BinaryStartWrite();		 | ||
|  | 	sq_BinaryWriteWord(index); // 当撩 陛卫 樯策蝶. | ||
|  | 	sq_BinaryWriteFloat(power); | ||
|  | 	sq_BinaryWriteBool(isFirst);			 | ||
|  | 	sq_SendCreatePassiveObjectPacket(obj, 24236, 0, x.tointeger(), 1, z.tointeger(), obj.getDirection());			 | ||
|  | } | ||
|  | 
 | ||
|  | function onTimeEvent_po_ATIceOrbEx(obj, timeEventIndex, timeEventCount) | ||
|  | {	 | ||
|  | 	if(!obj) | ||
|  | 		return false; | ||
|  | 		 | ||
|  | 	if(timeEventIndex == PO_ICE_ORB_TIMER_ATTACK_GAP) | ||
|  | 	{	 | ||
|  | 		if(!obj.isMyControlObject()) | ||
|  | 			return true;	//	颤桧该陛 true桧贼 ?轿 酝钦. | ||
|  | 			 | ||
|  | 		local var = obj.getVar(); | ||
|  | 		local maxCount = var.getInt(PO_ICE_ORB_VAR_MAXCOUNT); | ||
|  | 		if(timeEventCount < maxCount) //譆渠 偎热 嘐虏桧贼 陛卫 当撩 | ||
|  | 		{	 | ||
|  | 			// 陛卫 当撩 ?热 属 | ||
|  | 			createIcePrickleByIceOrbEx(obj, timeEventCount + PO_ICE_ORB_CONST_START_FRAME, false); | ||
|  | 			return false;	//	颤桧该陛 false桧贼 啗楼 ?轿 ?棻. | ||
|  | 		}		 | ||
|  | 		else { | ||
|  | 			obj.setTimeEvent(PO_ICE_ORB_TIMER_WAITING_END, PO_ICE_ORB_CONST_PRICKLE_ANI_TIME ,1 , false); 			 | ||
|  | 			return true;	//	颤桧该陛 true桧贼 ?轿 酝钦. | ||
|  | 		} | ||
|  | 	} | ||
|  | 	else if(timeEventIndex == PO_ICE_ORB_TIMER_WAITING_END) | ||
|  | 	{ | ||
|  | 		obj.sendStateOnlyPacket(PO_ICE_ORB_SUB_STATE_EXPLOSION);		 | ||
|  | 		return true;	//	颤桧该陛 true桧贼 ?轿 酝钦. | ||
|  | 	} | ||
|  | 		 | ||
|  | 	return false; | ||
|  | } | ||
|  | 
 | ||
|  | function setState_po_ATIceOrbEx(obj, state, datas) | ||
|  | { | ||
|  | 	if(!obj) return; | ||
|  | 	 | ||
|  | 	if(state == PO_ICE_ORB_SUB_STATE_FLYING)  | ||
|  | 	{ | ||
|  | 		local var = obj.getVar(); | ||
|  | 		local speed = var.getInt(PO_ICE_ORB_VAR_SPEED);	 | ||
|  | 			 | ||
|  | 		obj.sq_SetMoveParticle("Particle/ATIceOrbEx.ptl", 0.0, 0.0); | ||
|  | 		sq_SetSpeedToMoveParticle(obj,0,speed);	 | ||
|  | 				 | ||
|  | 		// 窒葬 试虽 : 绪蒂热烟 濠舆 当撩?棻. | ||
|  | 		local dustTimeGap = 50.0 * (1000.0/speed.tofloat()); | ||
|  | 		 | ||
|  | 		sq_CreateParticle("PassiveObject/Character/Mage/Particle/ATIceOrbDust.ptl",obj,0,-1,0,true,dustTimeGap.tointeger(),500,100);		 | ||
|  | 	}		 | ||
|  | 	else if(state == PO_ICE_ORB_SUB_STATE_READY) | ||
|  | 	{ | ||
|  | 		obj.sq_RemoveMoveParticle(); // 桧翕 姜虽.		 | ||
|  | 		setCurrentAnimationFromCutomIndex(obj, PO_ICE_ORB_ETC_ANI_READY); // 拥栖 掖羹		 | ||
|  | 		local xPos = sq_GetVectorData(datas,0); // 紫杂? x谢?. | ||
|  | 		sq_SetCurrentPos(obj, xPos, obj.getYPos(), obj.getZPos());		 | ||
|  | 		 | ||
|  | 		sq_RemoveParticle("PassiveObject/Character/Mage/Particle/ATIceOrbDust.ptl",obj); | ||
|  | 	} | ||
|  | 	else if(state == PO_ICE_ORB_SUB_STATE_ATTACK) | ||
|  | 	{	 | ||
|  | 		setCurrentAnimationFromCutomIndex(obj, PO_ICE_ORB_ETC_ANI_ATTACK); // 拥栖 掖羹			 | ||
|  | 	} | ||
|  | 	else if(state == PO_ICE_ORB_SUB_STATE_EXPLOSION) | ||
|  | 	{	 | ||
|  | 		setCurrentAnimationFromCutomIndex(obj, PO_ICE_ORB_ETC_ANI_EXPLOSION); // 拥栖 掖羹		 | ||
|  | 		obj.stopSound(3711); | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | function procAppend_po_ATIceOrbEx(obj) | ||
|  | { | ||
|  | 	if(!obj) return; | ||
|  | 	 | ||
|  | 	local state = obj.getState(); | ||
|  | 	if(state == PO_ICE_ORB_SUB_STATE_FLYING) | ||
|  | 	{		 | ||
|  | 		local var = obj.getVar(); | ||
|  | 		local targetXPos = var.getInt(PO_ICE_ORB_VAR_TARGET_X); | ||
|  | 		local direction = obj.getDirection(); | ||
|  | 		if( (direction == ENUM_DIRECTION_LEFT && targetXPos > obj.getXPos())  | ||
|  | 			|| (direction == ENUM_DIRECTION_RIGHT && targetXPos < obj.getXPos()) ) { | ||
|  | 			 | ||
|  | 			obj.sq_RemoveMoveParticle(); // 桧翕 姜虽.					 | ||
|  | 			targetXPos = obj.getXPos(); | ||
|  | 			sq_SetCurrentPos(obj, targetXPos, obj.getYPos(), obj.getZPos()); | ||
|  | 			 | ||
|  | 			// 桧翕 部 棻挤 鼻鹧煎 剩梯. | ||
|  | 			obj.sendStatePacket(PO_ICE_ORB_SUB_STATE_READY, obj.getXPos()); | ||
|  | 		} | ||
|  | 	} | ||
|  | 	else if(state == PO_ICE_ORB_SUB_STATE_READY) | ||
|  | 	{		 | ||
|  | 		if(sq_GetCurrentFrameIndex(obj) < 1) {		 | ||
|  | 			local var = obj.getVar(); | ||
|  | 			local targetXPos = var.getInt(PO_ICE_ORB_VAR_TARGET_X);			 | ||
|  | 			local addX = sq_GetShuttleValue(0, 10, sq_GetObjectTime(obj), 30)-5; | ||
|  | 			addX = addX >= 0 ? 2 : -2; | ||
|  | 
 | ||
|  | 			sq_SetCurrentPos(obj, targetXPos + addX, obj.getYPos(), obj.getZPos());			 | ||
|  | 		} | ||
|  | 	} | ||
|  | 	 | ||
|  | 	if(state == PO_ICE_ORB_SUB_STATE_ATTACK || state == PO_ICE_ORB_SUB_STATE_READY) | ||
|  | 	{ | ||
|  | 		if(PO_ICE_ORB_SUB_STATE_READY && sq_GetCurrentFrameIndex(obj) < 2) | ||
|  | 			return; | ||
|  | 		 | ||
|  | 		local var = obj.getVar(); | ||
|  | 		local x,z; | ||
|  | 		local t = (sq_GetObjectTime(obj)/100)%4; //sq_GetShuttleValue(0, 4,sq_GetObjectTime(obj),80)%4; | ||
|  | 		 | ||
|  | 		switch(t) | ||
|  | 		{ | ||
|  | 			case 0 : x = 0; z = 2; break; | ||
|  | 			case 1 : x = 0; z = -2; break; | ||
|  | 			case 2 : x = -2; z = 0; break; | ||
|  | 			case 3 : x = 2; z = 0; break; | ||
|  | 			default : x = 0; z = 0; break; | ||
|  | 		} | ||
|  | 		 | ||
|  | 		x = x + var.getInt(PO_ICE_ORB_VAR_TARGET_X); | ||
|  | 		z = z + var.getInt(PO_ICE_ORB_VAR_TARGET_Z);		 | ||
|  | 			 | ||
|  | 		 | ||
|  | 		sq_SetCurrentPos(obj, x, obj.getYPos(), z); | ||
|  | 
 | ||
|  | 	} | ||
|  | 	 | ||
|  | } | ||
|  | 
 | ||
|  | function onKeyFrameFlag_po_ATIceOrbEx(obj, flagIndex) | ||
|  | { | ||
|  | 	if(!obj) | ||
|  | 		return false; | ||
|  | 
 | ||
|  | 	if(obj.getState() == PO_ICE_ORB_SUB_STATE_READY) | ||
|  | 	{ | ||
|  | 		if(flagIndex == 1) | ||
|  | 		{			 | ||
|  | 			// 籀挤缚 棻 廓翻 鼻鹧煎 赅舒 当撩. | ||
|  | 			for(local i = 0; i<PO_ICE_ORB_CONST_START_FRAME ; ++i)  | ||
|  | 			{					 | ||
|  | 				createIcePrickleByIceOrbEx(obj, i, true); | ||
|  | 			} | ||
|  | 			 | ||
|  | 			local var	= obj.getVar(); | ||
|  | 			local gap	= var.getInt(PO_ICE_ORB_VAR_GAP); | ||
|  | 			local power = var.getInt(PO_ICE_ORB_VAR_POWER); | ||
|  | 			obj.setTimeEvent(PO_ICE_ORB_TIMER_ATTACK_GAP, gap, 999, true); 	 | ||
|  | 			obj.sq_PlaySound("ICEORB_THORN_LOOP",3711);		 | ||
|  | 		} | ||
|  | 	} | ||
|  | 	else if(obj.getState() == PO_ICE_ORB_SUB_STATE_EXPLOSION) | ||
|  | 	{ | ||
|  | 		if(flagIndex == 2) | ||
|  | 		{ | ||
|  | 			sq_CreateParticleByGlobal(PARTICLE_CREATER_WATER_HIT_LIGHT,	// ENUM_PARTICLE_CREATER | ||
|  | 										obj,		// CNRDObject* master, | ||
|  | 										0,			//int x, | ||
|  | 										-1,			//int y, | ||
|  | 										0,			//int z, | ||
|  | 										true,		//bool posistionFromMaster, | ||
|  | 										30,			//int timeGap, | ||
|  | 										150,		//int maxTime, | ||
|  | 										5);		//int maxCount		 | ||
|  | 										 | ||
|  | 			sq_CreateParticleByGlobal(PARTICLE_CREATER_WATER_HIT_ICE,	// ENUM_PARTICLE_CREATER | ||
|  | 										obj,		// CNRDObject* master, | ||
|  | 										0,			//int x, | ||
|  | 										-1,			//int y, | ||
|  | 										0,			//int z, | ||
|  | 										true,		//bool posistionFromMaster, | ||
|  | 										30,			//int timeGap, | ||
|  | 										150,		//int maxTime, | ||
|  | 										5);		//int maxCount		 | ||
|  | 										 | ||
|  | 			sq_CreateParticleByGlobal(PARTICLE_CREATER_WATER_HIT,	// ENUM_PARTICLE_CREATER | ||
|  | 										obj,		// CNRDObject* master, | ||
|  | 										0,			//int x, | ||
|  | 										0,			//int y, | ||
|  | 										0,			//int z, | ||
|  | 										true,		//bool posistionFromMaster, | ||
|  | 										30,			//int timeGap, | ||
|  | 										150,		//int maxTime, | ||
|  | 										2);			//int maxCount			 | ||
|  | 		}	 | ||
|  | 	} | ||
|  | 	 | ||
|  | 	return true;	 | ||
|  | } | ||
|  | 
 | ||
|  | function onEndCurrentAni_po_ATIceOrbEx(obj) | ||
|  | { | ||
|  | 	if(!obj) return; | ||
|  | 	 | ||
|  | 	if(obj.getState() == PO_ICE_ORB_SUB_STATE_READY) | ||
|  | 	{ | ||
|  | 		obj.sendStateOnlyPacket(PO_ICE_ORB_SUB_STATE_ATTACK); | ||
|  | 	} | ||
|  | 	else if(obj.getState() == PO_ICE_ORB_SUB_STATE_EXPLOSION)  | ||
|  | 	{ | ||
|  | 		sq_SendDestroyPacketPassiveObject(obj); | ||
|  | 	}	 | ||
|  | } |