SUB_STATE_MGRAB_0 <- 0 SUB_STATE_MGRAB_1 <- 1 function setStateMouseGrab(obj) { if (!obj) return; local posX = obj.getXPos(); local posY = obj.getYPos(); local posZ = obj.getZPos(); //local grabNum = obj.sq_GetIntData(SKILL_MGRAB, 1); //1. 葆办蝶煎 濩击 热 毡朝 ?热 //obj.getVar("MouseGrab").clear_vector(); //obj.getVar("MouseGrab").push_vector(grabNum); // 觼葬缣桧搅暧 蝶鉴樯策蝶蒂 撮??栖棻. //setCreatorSkillStateSkillIndex(obj, SKILL_MGRAB); //setCreatorSkillCount(obj, grabNum); releaseOutLine(obj, "grabobj"); obj.getVar("mgrab").clear_vector(); obj.getVar("mgrab").push_vector(0); obj.getVar("mgrab").push_vector(0); obj.getVar("mgrab").clear_timer_vector(); obj.getVar("mgrab").push_timer_vector(); local t = obj.getVar("mgrab").get_timer_vector(0); t.setParameter(100, -1); t.resetInstant(0); obj.getVar("mgrab").clear_ct_vector(); obj.getVar("mgrab").push_ct_vector(); local timer = obj.getVar("mgrab").get_ct_vector(0); timer.Reset(); timer.Start(10000,0); } function grabThrowObject(obj) { local hoverEnemyObject = getOverClickableEnemyObject(obj, IMouse.GetXPos(), IMouse.GetYPos()); if (hoverEnemyObject) { local grabable = sq_IsGrabable(obj, hoverEnemyObject); print(" grab:" + grabable + " holdable:" + sq_IsHoldable(obj, hoverEnemyObject)); if (sq_IsHoldable(obj, hoverEnemyObject) == true && sq_IsGrabable(obj, hoverEnemyObject) == true) { // 濩晦陛栋瞳桧塭贼 ?卫?栖棻. // 濩擎匙桧 毡朝 唳办缣虏 啪桧虽蒂 还罹鄹栖棻. local consumeValue = getCreatorSkillConsumeValue(obj, SKILL_MGRAB); if (!useCreatorSkill(obj, SKILL_MGRAB, 0, 0, consumeValue)) return; // obj.getVar("grabobj").push_obj_vector(hoverEnemyObject); // grabobj local activeobj = sq_GetCNRDObjectToActiveObject(hoverEnemyObject); if (activeobj) { // ?葆葬虏 濩朝棻. local objListSize = obj.getVar("grabobj").get_obj_vector_size(); print(" objListSize:" + objListSize); for (local i =0;i 0) { data_l[i] = reciveData.readDword(); } } local targetObj = sq_GetObject(obj, data_l[0], data_l[1]); if (targetObj) { local xPos = data_l[2]; local zPos = data_l[3]; if (zPos < 0) zPos = 0; local stateTimer = obj.sq_GetStateTimer(); if (!obj.getVar("mgrab").get_vector(0)) { obj.getVar("mgrab").set_vector(0, xPos); obj.getVar("mgrab").set_vector(1, zPos); } local state = data_l[4]; print(" on change state:" + state); //if (obj.isMyControlObject()) { if (state == 0) { if (targetObj.getState() != STATE_HOLD && targetObj.getState() != STATE_DOWN) { local act = sq_GetCNRDObjectToActiveObject(targetObj); if (act) { sq_IntVectorClear(sq_GetGlobalIntVector()); sq_IntVectorPush(sq_GetGlobalIntVector(),0); sq_AddSetStatePacketActiveObject(act, STATE_HOLD, sq_GetGlobalIntVector(), STATE_PRIORITY_FORCE); print(" onchange setstate hold"); } } } else if (state == 1) { local act = sq_GetCNRDObjectToActiveObject(targetObj); if (act) { local direction = data_l[5]; local nX = data_l[6]; local nY = data_l[7]; sq_IntVectorClear(sq_GetGlobalIntVector()); sq_IntVectorPush(sq_GetGlobalIntVector(),direction); sq_IntVectorPush(sq_GetGlobalIntVector(),0); sq_IntVectorPush(sq_GetGlobalIntVector(),1); sq_IntVectorPush(sq_GetGlobalIntVector(),nX); sq_IntVectorPush(sq_GetGlobalIntVector(),nY); sq_AddSetStatePacketActiveObject(act,STATE_DOWN, sq_GetGlobalIntVector(), STATE_PRIORITY_FORCE); print(" onchange setstate down:"); } } } sq_SetCurrentPos(targetObj, xPos, targetObj.getYPos(), zPos); } } function prepareDraw_Mgrab(obj) { if (!obj) return; } // 剪葬 桧? 颤啃击 琼嬴顶横 葬欐?朝 ?热殓栖棻. function pushTargetDistanceMinObject(obj, targetObj, distance) { if (!obj) return; local objectManager = obj.getObjectManager(); if (objectManager == null) return; if (!targetObj) return; obj.getVar("mgrab").clear_obj_vector(); local grabObj = null; for (local i = 0; i < objectManager.getCollisionObjectNumber(); i+=1) { local object = objectManager.getCollisionObject(i); if (sq_IsHoldable(obj, object) == true && sq_IsGrabable(obj, object) == true) { // 濩晦陛栋瞳桧塭贼 ?卫?栖棻. if (object && obj.isEnemy(object) && object.isInDamagableState(obj) && object.isObjectType(OBJECTTYPE_ACTIVE)) { local isSame = isSameObject(targetObj, object); if (isSame) continue; local activeObj = sq_GetCNRDObjectToActiveObject(object); // 舱羲 顶缣怃 陛潍 陛梱遴 瞳击 坚艇棻 if (activeObj) { if (!activeObj.isDead()) { local dis = sq_GetDistanceObject(targetObj, object, false); if (dis < distance) { distance = dis; grabObj = activeObj; //obj.getVar("mgrab").push_obj_vector(object); } } } } } //if (sq_IsHoldable(obj, hoverEnemyObject) == false && sq_IsGrabable(obj, hoverEnemyObject) == true) } if (grabObj) { obj.getVar("mgrab").push_obj_vector(grabObj); } } function onProc_Mgrab(obj) { if (!obj) return; if (!obj.isMyControlObject()) return; local objListSize = obj.getVar("grabobj").get_obj_vector_size(); if (objListSize <= 0) return; local stage = sq_GetObjectManagerStage(obj); if (!stage) return; local control = stage.getMainControl(); if (control.IsRBDown()) { onMouseMoveButtonDown_Mgrab(obj); } else { onMouseButtonUp_Mgrab(obj); } } // 葆办蝶 帼?击 机卫俪击 阳 籀葬?捡肾朝 睡碟殓栖棻. function onMouseButtonUp_Mgrab(obj) { local objListSize = obj.getVar("grabobj").get_obj_vector_size(); print(" onMouseButtonUp_Mgrab:" + objListSize); for (local i = 0; i < objListSize;++i) { local hoverEnemy = obj.getVar("grabobj").get_obj_vector(i); if (hoverEnemy) { local activeobj = sq_GetCNRDObjectToActiveObject(hoverEnemy); if (activeobj) { local srcX = obj.getVar("mgrab").get_vector(0); local srcY = sq_GetYPos(activeobj); local srcZ = obj.getVar("mgrab").get_vector(1); if (srcZ < 0) srcZ = 0; local dstX = sq_GetXPos(activeobj); local dstY = sq_GetYPos(activeobj); local dstZ = sq_GetZPos(activeobj); if (dstZ < 0) dstZ = 0; print(" sx:" + srcX + " sy:" + srcY + " sz:" + srcZ); print(" dx:" + dstX + " dy:" + dstY + " dz:" + dstZ); local distance = sq_GetDistance( srcX, srcZ, dstX, dstZ, true); local width = sq_Abs(dstX - srcX); local h = sq_Abs((dstZ) - (srcZ)); print(" h:" + h); if (h <= 0) h = 10; local angle = sq_Atan2( h.tofloat(), width.tofloat()); local nRevision = distance; local cos = nRevision.tofloat() * sq_Cos(angle); local sin = nRevision.tofloat() * sq_Sin(angle); local nX = sq_Abs( cos.tointeger() ) * 2; local nY = sq_Abs( sin.tointeger() ) * 2; local direction = sq_GetDirection(activeobj); if ((dstX - srcX) < 0) { nX = -nX; } direction = 0; print(" nX:" + nX + " nY:" + nY + " offset:" + (dstX - srcX) + " direction:" + direction + " activeobj:" + activeobj); sq_IntVectorClear(sq_GetGlobalIntVector()); sq_IntVectorPush(sq_GetGlobalIntVector(),direction); sq_IntVectorPush(sq_GetGlobalIntVector(),0); sq_IntVectorPush(sq_GetGlobalIntVector(),1); sq_IntVectorPush(sq_GetGlobalIntVector(),nX); sq_IntVectorPush(sq_GetGlobalIntVector(),nY); sq_AddSetStatePacketActiveObject(activeobj,STATE_DOWN, sq_GetGlobalIntVector(), STATE_PRIORITY_FORCE); print(" activeobj:" + activeobj + " setstate down:"); local group = sq_GetGroup(activeobj); local uniqueId = sq_GetUniqueId(activeobj); sq_BinaryStartWrite(); sq_BinaryWriteDword(group); // 0 sq_BinaryWriteDword(uniqueId); // 1 sq_BinaryWriteDword(dstX); // 2 sq_BinaryWriteDword(dstZ); // 3 // 1廓擎 state_down鼻鹧殓栖棻. sq_BinaryWriteDword(1); // 4 sq_BinaryWriteDword(direction); // 5 sq_BinaryWriteDword(nX); // 6 sq_BinaryWriteDword(nY); // 7 sq_SendChangeSkillEffectPacket(obj, SKILL_MGRAB); print(" sq_SendChangeSkillEffectPacket down"); } } } obj.getVar("mgrab").clear_vector(); obj.getVar("mgrab").push_vector(0); obj.getVar("mgrab").push_vector(0); releaseOutLine(obj, "grabobj"); if (objListSize) { obj.sq_PlaySound("R_THROW_MONSTER"); } } // 葆办蝶 帼?击 棻遴卫俪击 阳 籀葬?捡肾朝 睡碟殓栖棻. function onMouseMoveCharacter_Mgrab(obj) { onMouseMoveButtonDown_Mgrab(obj); } function onMouseMoveButtonDown_Mgrab(obj) { local hoverEnemy = obj.getVar("grabobj").get_obj_vector(0); if (!hoverEnemy) { return; } else { local objectManager = obj.getObjectManager(); local objListSize = obj.getVar("grabobj").get_obj_vector_size(); local t = obj.getVar("mgrab").get_ct_vector(0); local time = 0; if(t) time = t.Get(); local skill_level = obj.sq_GetSkillLevel(SKILL_MGRAB); local activeObj = sq_GetCNRDObjectToActiveObject(hoverEnemy); if (!activeObj) { onMouseButtonUp_Mgrab(obj); return; } // 跪 颤殓涤煎 濩坚毡朝 譆渠卫除桧 殖塭喂栖棻. // 0. 橾奁跪 濩坚 毡击阳 譆渠卫除 // 1. 啻歜萄 濩坚 毡击阳 譆渠卫除 // 2. 尔蝶跪 濩坚 毡击阳 譆渠卫除 // 3. ?跨蝶搅 濩坚 毡击阳 譆渠卫除 // 4. apc 濩坚 毡击阳 譆渠卫除 // 橾奁橾隆 蚝岁0 local columnIndex = SKL_LV_0; if (sq_IsNamed(activeObj)) { // 啻歜萄 橾隆 蚝岁1 columnIndex = SKL_LV_1; } else if (sq_IsBoss(activeObj)) { // 尔蝶 橾隆 蚝岁2 columnIndex = SKL_LV_2; } else if (sq_IsHellMonster(activeObj)) { // ?跨蝶搅 橾隆 蚝岁3 columnIndex = SKL_LV_3; } else if (sq_IsAiCharacter(activeObj)) { // apc橾隆 columnIndex = SKL_LV_4; } // 濩坚毡击 热 毡朝 譆渠卫除 local maxTime = obj.sq_GetLevelData(SKILL_MGRAB, columnIndex, skill_level); print(" maxTime:" + maxTime + " time:" + time); if (time > maxTime) { onMouseButtonUp_Mgrab(obj); } else { for (local i =0;i