INT unit_getStat(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { CDebug cDbg("unit getStat"); if(!GameReady()) return JS_TRUE; myUnit* lpUnit = (myUnit*)JS_GetPrivate(cx, obj); *rval = JSVAL_FALSE; if(!lpUnit || IsBadReadPtr(lpUnit, sizeof(myUnit)) || lpUnit->_dwPrivateType != PRIVATE_UNIT) return JS_TRUE; UnitAny* pUnit = D2CLIENT_FindUnit(lpUnit->dwUnitId, lpUnit->dwType); if(!pUnit) return JS_TRUE; jsint nStat = JSVAL_TO_INT(argv[0]); jsint nSubIndex = NULL; if(argc > 1 && JSVAL_IS_INT(argv[1])) nSubIndex = JSVAL_TO_INT(argv[1]); if(nStat >= 6 && nStat <= 11) *rval = INT_TO_JSVAL(D2COMMON_GetUnitStat(pUnit, nStat, nSubIndex)>>8); else if(nStat == 13)
INT unit_cancel(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { CDebug cDbg("unit cancel"); if(!GameReady()) return JS_TRUE; if(argc == 1 && JSVAL_IS_INT(argv[0])) { jsint nType = JSVAL_TO_INT(argv[0]); if(nType == 0) D2CLIENT_CloseInteract(); else if(nType == 1) D2CLIENT_CloseNPCInteract(); } else if(D2CLIENT_GetCursorItem()) { // Diablo drops an Item by using the Walk function. // Just perform a clickMap "click" and we drop it D2CLIENT_clickMap(0, 10, 10, 0x08); } return JS_TRUE; }
BOOL SetSkill(WORD wSkillId, BOOL bLeft) { if(!GameReady()) return FALSE; if(!GetSkill(wSkillId)) return FALSE; BYTE aPacket[9]; aPacket[0] = 0x3C; *(WORD*)&aPacket[1] = wSkillId; aPacket[3] = 0; aPacket[4] = (bLeft) ? 0x80 : 0; *(DWORD*)&aPacket[5] = 0xFFFFFFFF; D2NET_SendPacket(9, 1, aPacket); UnitAny* Me = *p_D2CLIENT_PlayerUnit; int timeout = 0; Skill* hand = NULL; while(GameReady()) { hand = (bLeft ? Me->pInfo->pLeftSkill : Me->pInfo->pRightSkill); if(hand->pSkillInfo->wSkillId != wSkillId) { if(timeout > 10) return FALSE; timeout++; } else return TRUE; Sleep(100); } return FALSE; }
bool __cdecl CTableFrameSink::OnActionUserReady( WORD wChairID, IServerUserItem * pIServerUserItem, VOID * pData, WORD wDataSize ) { //m_oLog.Log("玩家[%s]准备。", pIServerUserItem->GetUserData()->szAccounts); if (wChairID != INVALID_CHAIR) { if(pIServerUserItem->GetUserScore()->lBodyChip < m_lMinbet*MAXMULITY) { m_pITableFrameManager->PerformStandUpAction(pIServerUserItem); } else { CountDownTime(wChairID,TRUE); GameReady(wChairID); } } else { GameReady(wChairID); } return true; }
BOOL ExecuteEnchantQueue(LPENCHANTINFO EnchInfo) { if (!GameReady() || !EnchInfo) return FALSE; UnitAny* pPlayer = D2CLIENT_GetPlayerUnit(); if (EnchInfo->dwPlayerId == pPlayer->dwUnitId) return FALSE; if (EnchInfo->nEnchantType == ENCHANT_ME) { for(Room1* pRoom1 = pPlayer->pAct->pRoom1; pRoom1; pRoom1 = pRoom1->pRoomNext) for (UnitAny* pUnit = pRoom1->pFirstUnit; pUnit; pUnit = pUnit->pListNext) if (pUnit->dwType == UNIT_PLAYER && pUnit->dwUnitId == EnchInfo->dwPlayerId) { CastOnUnit(D2S_ENCHANT, pUnit, FALSE); return TRUE; } if (!bSilentBots) Say("You're out of range!"); return FALSE; } if(EnchInfo->nEnchantType == ENCHANT_MERC) { for (Room1* pRoom1 = pPlayer->pAct->pRoom1; pRoom1; pRoom1 = pRoom1->pRoomNext) for (UnitAny* pUnit = pRoom1->pFirstUnit; pUnit; pUnit = pUnit->pListNext) if (pUnit->dwType == UNIT_NPC && IsMercClassId(pUnit->dwTxtFileNo)) { DWORD dwOwner = D2CLIENT_GetMonsterOwner(pUnit->dwUnitId); if (dwOwner == EnchInfo->dwPlayerId) { CastOnUnit(D2S_ENCHANT, pUnit, FALSE); return TRUE; } } if (!bSilentBots) Say("Couldn't find your mercenary!"); return FALSE; } return FALSE; }
VOID CheckAntiTppk() { if(IsTownLevel(GetPlayerArea())) { v_AntiTppkBusy=false; return; } if(v_AntiTppkBusy) { for(Room1* pRoom = Myself->pAct->pRoom1; pRoom && v_AntiTppkBusy; pRoom = pRoom->pRoomNext) { for(UnitAny* pUnit = pRoom->pUnitFirst; pUnit && v_AntiTppkBusy; pUnit = pUnit->pListNext) { if(pUnit->dwType == UNIT_TYPE_OBJECT && pUnit->dwTxtFileNo == 59) { if(!stricmp(pUnit->pObjectData->szOwner, Myself->pPlayerData->szName)) { if(GetUnitDist(Myself, pUnit) < 12) { for(INT i = 0; i < 20; i++) { if(!GameReady() || IsTownLevel(GetPlayerArea()) || Myself->dwMode==PLAYER_MODE_DEATH || Myself->dwMode==PLAYER_MODE_DEAD || !TakeNextTP) { v_AntiTppkBusy = false; break; } Interact(pUnit->dwUnitId, UNIT_TYPE_OBJECT, TRUE); Sleep(50); } } } } } } } }
DWORD WINAPI EnchantThread(LPVOID lpParameter) { EnchantQueue.RemoveAll(); while(true) { SleepEx(800, true); if (!GameReady()) continue; if (!cEnchantBotToggle) continue; if (EnchantQueue.IsEmpty() || EnchantQueue.IsLocked) continue; ExecuteEnchantQueue(EnchantQueue[0]); EnchantQueue.RemoveAt(0); EnchantQueue.FreeExtra(); } }
DWORD GetPlayerArea(void) { return (GameReady() ? (*p_D2CLIENT_PlayerUnit)->pPath->pRoom1->pRoom2->pLevel->dwLevelNo : NULL); }
INT unit_interact(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { CDebug cDbg("unit interact"); if(!GameReady()) return JS_TRUE; myUnit* lpUnit = (myUnit*)JS_GetPrivate(cx, obj); *rval = JSVAL_FALSE; if(!lpUnit || IsBadReadPtr(lpUnit, sizeof(myUnit)) || lpUnit->_dwPrivateType != PRIVATE_UNIT) return JS_TRUE; UnitAny* pUnit = D2CLIENT_FindUnit(lpUnit->dwUnitId, lpUnit->dwType); if(!pUnit) return JS_TRUE; if(pUnit->dwType == UNIT_ITEM && pUnit->dwMode != ITEM_MODE_ON_GROUND && pUnit->dwMode != ITEM_MODE_BEING_DROPPED) { INT nLocation = GetItemLocation(pUnit); BYTE aPacket[13] = {NULL}; if(nLocation == STORAGE_INVENTORY) { aPacket[0] = 0x20; *(DWORD*)&aPacket[1] = pUnit->dwUnitId; *(DWORD*)&aPacket[5] = D2CLIENT_GetPlayerUnit()->pPath->xPos; *(DWORD*)&aPacket[9] = D2CLIENT_GetPlayerUnit()->pPath->yPos; D2NET_SendPacket(13, 1, aPacket); return JS_TRUE; } else if(nLocation == STORAGE_BELT) { aPacket[0] = 0x26; *(DWORD*)&aPacket[1] = pUnit->dwUnitId; *(DWORD*)&aPacket[5] = 0; *(DWORD*)&aPacket[9] = 0; D2NET_SendPacket(13, 1, aPacket); return JS_TRUE; } } if(pUnit->dwType == UNIT_OBJECT && argc == 1 && JSVAL_IS_INT(argv[0])) { // TODO: check the range on argv[0] to make sure it won't crash the game D2CLIENT_TakeWaypoint(pUnit->dwUnitId, JSVAL_TO_INT(argv[0])); // D2CLIENT_TakeWP(pUnit->dwUnitId, JSVAL_TO_INT(argv[0])); *rval = JSVAL_TRUE; return JS_TRUE; } else if(pUnit->dwType == UNIT_PLAYER && argc == 1 && JSVAL_IS_INT(argv[0]) && JSVAL_TO_INT(argv[0]) == 1) { // Accept Trade } else { *rval = JSVAL_TRUE; ClickMap(0, GetUnitX(pUnit), GetUnitY(pUnit), FALSE, pUnit); //D2CLIENT_Interact(pUnit, 0x45); } return JS_TRUE; }
INT unit_getProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) { CDebug cDbg("unit getProperty"); BnetData* pData = *p_D2LAUNCH_BnData; GameStructInfo* pInfo = *p_D2CLIENT_GameInfo; switch(JSVAL_TO_INT(id)) { case ME_ACCOUNT: if(!pData) return JS_TRUE; *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, pData->szAccountName)); break; case ME_CHARNAME: if(!pInfo) return JS_TRUE; *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, pInfo->szCharName)); break; case ME_CHICKENHP: *vp = INT_TO_JSVAL(Vars.nChickenHP); break; case ME_CHICKENMP: *vp = INT_TO_JSVAL(Vars.nChickenMP); break; case ME_DIFF: *vp = INT_TO_JSVAL(D2CLIENT_GetDifficulty()); break; case ME_GAMENAME: if(!pInfo) return JS_TRUE; *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, pInfo->szGameName)); break; case ME_GAMEPASSWORD: if(!pInfo) return JS_TRUE; *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, pInfo->szGamePassword)); break; case ME_GAMESERVERIP: if(!pInfo) return JS_TRUE; *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, pInfo->szGameServerIp)); break; case ME_GAMESTARTTIME: *vp = INT_TO_JSVAL(Vars.dwGameTime); break; case ME_GAMETYPE: *vp = INT_TO_JSVAL(*p_D2CLIENT_ExpCharFlag); break; case ME_ITEMONCURSOR: *vp = BOOLEAN_TO_JSVAL(!!D2CLIENT_GetCursorItem()); break; case ME_LADDER: if(pData) *vp = BOOLEAN_TO_JSVAL(((pData->nCharFlags & PLAYER_TYPE_LADDER) == TRUE)); break; case ME_QUITONHOSTILE: *vp = BOOLEAN_TO_JSVAL(Vars.bQuitOnHostile); break; case ME_REALM: *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, pData->szRealmName)); break; case ME_REALMSHORT: *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, pData->szRealmName2)); break; case OOG_SCREENSIZE: *vp = INT_TO_JSVAL(D2GFX_GetScreenSize()); break; case OOG_WINDOWTITLE: CHAR szTitle[128]; GetWindowText(D2WIN_GetHwnd(), szTitle, 128); *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, szTitle)); break; case ME_PING: *vp = INT_TO_JSVAL(*p_D2CLIENT_Ping); break; case OOG_INGAME: *vp = BOOLEAN_TO_JSVAL(ClientState() == ClientStateMenu ? FALSE : TRUE); break; case OOG_QUITONERROR: *vp = BOOLEAN_TO_JSVAL(Vars.bQuitOnError); break; case OOG_MAXGAMETIME: *vp = INT_TO_JSVAL(Vars.dwMaxGameTime); break; case OOG_DEBUG: *vp = BOOLEAN_TO_JSVAL(Vars.bDebug); break; case ME_MERCREVIVECOST: *vp = INT_TO_JSVAL((*p_D2CLIENT_MercReviveCost)); break; case ME_BLOCKKEYS: *vp = BOOLEAN_TO_JSVAL(Vars.bBlockKeys); break; case ME_BLOCKMOUSE: *vp = BOOLEAN_TO_JSVAL(Vars.bBlockMouse); break; default: break; } /* // TODO: Properly fix this... if ((JSVAL_TO_INT(id) < OOG_WINDOWTITLE) && !GameReady()) return JS_TRUE; */ if(!GameReady()) return JS_TRUE; myUnit* lpUnit = (myUnit*)JS_GetPrivate(cx, obj); if(!lpUnit || IsBadReadPtr(lpUnit, sizeof(myUnit)) || lpUnit->_dwPrivateType != PRIVATE_UNIT) return JS_TRUE; UnitAny* pUnit = D2CLIENT_FindUnit(lpUnit->dwUnitId, lpUnit->dwType); if(!pUnit) return JS_TRUE; char* tmp = NULL; Room1* pRoom = NULL; switch(JSVAL_TO_INT(id)) { case UNIT_TYPE: *vp = INT_TO_JSVAL(pUnit->dwType); break; case UNIT_CLASSID: *vp = INT_TO_JSVAL(pUnit->dwTxtFileNo); break; case UNIT_MODE: *vp = INT_TO_JSVAL(pUnit->dwMode); break; case UNIT_NAME: tmp = new char[8192]; GetUnitName(pUnit, tmp, 8192); *vp = STRING_TO_JSVAL(JS_InternString(cx, tmp)); delete[] tmp; break; case UNIT_ACT: *vp = INT_TO_JSVAL(pUnit->dwAct + 1); break; case UNIT_AREA: pRoom = D2COMMON_GetRoomFromUnit(pUnit); if(pRoom && pRoom->pRoom2 && pRoom->pRoom2->pLevel) *vp = INT_TO_JSVAL(pRoom->pRoom2->pLevel->dwLevelNo); break; case UNIT_ID: *vp = INT_TO_JSVAL(pUnit->dwUnitId); break; case UNIT_XPOS: *vp = INT_TO_JSVAL(GetUnitX(pUnit)); break; case UNIT_YPOS: *vp = INT_TO_JSVAL(GetUnitY(pUnit)); break; case UNIT_HP: *vp = INT_TO_JSVAL(D2COMMON_GetUnitStat(pUnit, 6, 0) >> 8); break; case UNIT_HPMAX: *vp = INT_TO_JSVAL(D2COMMON_GetUnitStat(pUnit, 7, 0) >> 8); break; case UNIT_MP: *vp = INT_TO_JSVAL(D2COMMON_GetUnitStat(pUnit, 8, 0) >> 8); break; case UNIT_MPMAX: *vp = INT_TO_JSVAL(D2COMMON_GetUnitStat(pUnit, 9, 0) >> 8); break; case UNIT_STAMINA: *vp = INT_TO_JSVAL(D2COMMON_GetUnitStat(pUnit, 10, 0) >> 8); break; case UNIT_STAMINAMAX: *vp = INT_TO_JSVAL(D2COMMON_GetUnitStat(pUnit, 11, 0) >> 8); break; case UNIT_CHARLVL: *vp = INT_TO_JSVAL(D2COMMON_GetUnitStat(pUnit, 12, 0)); break; case ME_RUNWALK: *vp = INT_TO_JSVAL(*p_D2CLIENT_AlwaysRun); break; case UNIT_ADDRESS: *vp = INT_TO_JSVAL(pUnit); break; case UNIT_SPECTYPE: DWORD SpecType; SpecType = NULL; if(pUnit->dwType == UNIT_MONSTER && pUnit->pMonsterData) { if(pUnit->pMonsterData->fMinion & 1) SpecType |= 0x08; if(pUnit->pMonsterData->fBoss & 1) SpecType |= 0x04; if(pUnit->pMonsterData->fChamp & 1) SpecType |= 0x02; if((pUnit->pMonsterData->fBoss & 1)&& (pUnit->pMonsterData->fNormal & 1)) SpecType |= 0x01; if(pUnit->pMonsterData->fNormal & 1) SpecType |= 0x00; *vp = INT_TO_JSVAL(SpecType); return JS_TRUE; } break; case UNIT_UNIQUEID: if(pUnit->dwType == UNIT_MONSTER && pUnit->pMonsterData->fBoss && pUnit->pMonsterData->fNormal) *vp = INT_TO_JSVAL(pUnit->pMonsterData->wUniqueNo); else *vp = INT_TO_JSVAL(-1); break; case ITEM_CODE: // replace with better method if found if(!(pUnit->dwType == UNIT_ITEM) && pUnit->pItemData) break; ItemTxt* pTxt; pTxt = D2COMMON_GetItemText(pUnit->dwTxtFileNo); if(!pTxt) { *vp = STRING_TO_JSVAL(JS_InternString(cx, "Unknown")); return JS_TRUE; } CHAR szCode[4]; memcpy(szCode, pTxt->szCode, 3); szCode[3] = 0x00; *vp = STRING_TO_JSVAL(JS_InternString(cx, szCode)); break; case ITEM_PREFIX: if(pUnit->dwType == UNIT_ITEM && pUnit->pItemData) if (D2COMMON_GetItemMagicalMods(pUnit->pItemData->wPrefix)) *vp = STRING_TO_JSVAL(JS_InternString(cx, D2COMMON_GetItemMagicalMods(pUnit->pItemData->wPrefix))); break; case ITEM_SUFFIX: if(pUnit->dwType == UNIT_ITEM && pUnit->pItemData) if (D2COMMON_GetItemMagicalMods(pUnit->pItemData->wSuffix)) *vp = STRING_TO_JSVAL(JS_InternString(cx, D2COMMON_GetItemMagicalMods(pUnit->pItemData->wSuffix))); break; case ITEM_PREFIXNUM: if(pUnit->dwType == UNIT_ITEM && pUnit->pItemData) *vp = INT_TO_JSVAL(pUnit->pItemData->wPrefix); break; case ITEM_SUFFIXNUM: if(pUnit->dwType == UNIT_ITEM && pUnit->pItemData) *vp = INT_TO_JSVAL(pUnit->pItemData->wSuffix); break; case ITEM_FNAME: if(pUnit->dwType == UNIT_ITEM && pUnit->pItemData) { wchar_t wszfname[256] = L""; D2CLIENT_GetItemName(pUnit, wszfname, sizeof(wszfname)); if(wszfname) { char* tmp = UnicodeToAnsi(wszfname); *vp = STRING_TO_JSVAL(JS_InternString(cx, tmp)); delete[] tmp; } } break; case ITEM_QUALITY: if(pUnit->dwType == UNIT_ITEM && pUnit->pItemData) *vp = INT_TO_JSVAL(pUnit->pItemData->dwQuality); break; case ITEM_NODE: if(pUnit->dwType == UNIT_ITEM && pUnit->pItemData) *vp = INT_TO_JSVAL(pUnit->pItemData->NodePage); break; case ITEM_LOC: if(pUnit->dwType == UNIT_ITEM && pUnit->pItemData) *vp = INT_TO_JSVAL(pUnit->pItemData->ItemLocation); break; case ITEM_SIZEX: if(pUnit->dwType == UNIT_ITEM && pUnit->pItemData) { if(!D2COMMON_GetItemText(pUnit->dwTxtFileNo)) break; *vp = INT_TO_JSVAL(D2COMMON_GetItemText(pUnit->dwTxtFileNo)->xSize); } break; case ITEM_SIZEY: if(pUnit->dwType == UNIT_ITEM && pUnit->pItemData) { if(!D2COMMON_GetItemText(pUnit->dwTxtFileNo)) break; *vp = INT_TO_JSVAL(D2COMMON_GetItemText(pUnit->dwTxtFileNo)->ySize); } break; case ITEM_Type: if(pUnit->dwType == UNIT_ITEM && pUnit->pItemData) { if(!D2COMMON_GetItemText(pUnit->dwTxtFileNo)) break; *vp = INT_TO_JSVAL(D2COMMON_GetItemText(pUnit->dwTxtFileNo)->nType); } break; case ITEM_DESC: { if(pUnit->dwType != UNIT_ITEM) break; wchar_t wBuffer[8192] = L""; D2CLIENT_GetItemDesc(pUnit, wBuffer); tmp = UnicodeToAnsi(wBuffer); *vp = STRING_TO_JSVAL(JS_InternString(cx, tmp)); delete[] tmp; } break; case UNIT_ITEMCOUNT: if(pUnit->pInventory) *vp = INT_TO_JSVAL(pUnit->pInventory->dwItemCount); break; case ITEM_BODYLOCATION: if(pUnit->dwType != UNIT_ITEM) break; if(pUnit->pItemData) *vp = INT_TO_JSVAL(pUnit->pItemData->BodyLocation); break; case UNIT_OWNER: *vp = INT_TO_JSVAL(pUnit->dwOwnerId); break; case UNIT_OWNERTYPE: *vp = INT_TO_JSVAL(pUnit->dwOwnerType); break; case ITEM_LEVEL: if(pUnit->dwType != UNIT_ITEM) break; if(pUnit->pItemData) *vp = INT_TO_JSVAL(pUnit->pItemData->dwItemLevel); break; case ITEM_LEVELREQ: if(pUnit->dwType != UNIT_ITEM) break; *vp = INT_TO_JSVAL(D2COMMON_GetItemLevelRequirement(pUnit, D2CLIENT_GetPlayerUnit())); break; case UNIT_DIRECTION: if(pUnit->pPath) *vp = INT_TO_JSVAL(pUnit->pPath->bDirection); break; case OBJECT_TYPE: if(pUnit->dwType == UNIT_OBJECT) if(pUnit->pObjectData) { pRoom = D2COMMON_GetRoomFromUnit(pUnit); if(pRoom && pRoom->pRoom2 && pRoom->pRoom2->pLevel && IsTownLevel(pRoom->pRoom2->pLevel->dwLevelNo)) *vp = INT_TO_JSVAL(pUnit->pObjectData->Type & 255); else *vp = INT_TO_JSVAL(pUnit->pObjectData->Type); } break; case ME_WSWITCH: *vp = INT_TO_JSVAL(*p_D2CLIENT_bWeapSwitch); break; default: break; } return JS_TRUE; }
BOOL AttackPlayer(DWORD dwUnitId) { if(!GameReady() || IsTownLevel(GetPlayerArea())) return FALSE; UnitAny* pTarget = GetUnit(dwUnitId, UNIT_TYPE_PLAYER); if(!LeftAA) { WORD SkillID = GetCurrentSkillRight(); if(!pTarget || pTarget->dwMode == PLAYER_MODE_DEAD) return FALSE; if(SkillID == D2S_CHARGEDSTRIKE || SkillID == D2S_ENCHANT || SkillID == D2S_BONEPRISON) { BYTE aPacket[9]; aPacket[0] = LeftAA ? 0x0A : 0x11; *(LPDWORD)&aPacket[1] = UNIT_TYPE_PLAYER; *(LPDWORD)&aPacket[5] = dwUnitId; D2NET_SendPacket(9, 1, aPacket); return TRUE; } else { AttackStruct Attack; D2SpellInfo Spell; Attack.dwAttackType = ATTACKTYPE_SHIFTRIGHT; GetSkillInfo(SkillID, &Spell); if(SkillID != D2S_TELEPORT) { Attack.dwTargetX = pTarget->pPath->xPos; Attack.dwTargetY = pTarget->pPath->yPos; } if(pTarget->dwMode == PLAYER_MODE_RUN && !BlindToggled && SkillID == D2S_TELEPORT) { Attack.dwTargetX = pTarget->pPath->xTarget; Attack.dwTargetX = pTarget->pPath->yTarget; } if(SkillID == D2S_TELEPORT && !BlindToggled) { Attack.dwTargetX = pTarget->pPath->xPos; Attack.dwTargetY = pTarget->pPath->yPos; } if(BlindToggled && SkillID == D2S_TELEPORT && cfg.BlindSpot == 1) { Attack.dwTargetX = pTarget->pPath->xPos + 2; Attack.dwTargetY = pTarget->pPath->yPos + 2; } if(BlindToggled && SkillID == D2S_TELEPORT && cfg.BlindSpot == 2) { Attack.dwTargetX = pTarget->pPath->xPos + 3; Attack.dwTargetY = pTarget->pPath->yPos + 2; } if(BlindToggled && SkillID == D2S_TELEPORT && cfg.BlindSpot == 3) { Attack.dwTargetX = pTarget->pPath->xPos - 1; Attack.dwTargetY = pTarget->pPath->yPos + 3; } if(BlindToggled && SkillID == D2S_TELEPORT && cfg.BlindSpot == 4) { Attack.dwTargetX = pTarget->pPath->xPos + 1; Attack.dwTargetY = pTarget->pPath->yPos - 1.2; } if(BlindToggled && cfg.BlindSpot == 5) { Attack.dwTargetX = pTarget->pPath->xPos; Attack.dwTargetY = pTarget->pPath->yPos; } Attack.lpPlayerUnit = Myself; if(Spell.dwSpellInfoFlag & DSI_GUIDED) { Attack.dwAttackType = LeftAA ? ATTACKTYPE_UNITLEFT : ATTACKTYPE_RIGHT; Attack.lpTargetUnit = GetUnit(dwUnitId, UNIT_TYPE_PLAYER); } else Attack.lpTargetUnit = NULL; Attack._1 = 3; Attack._2 = 4; D2CLIENT_Attack(&Attack, (Spell.dwSpellInfoFlag & DSI_GUIDED) ? TRUE : FALSE); return TRUE; } } if(LeftAA) { WORD SkillID = GetCurrentSkillLeft(); if(!pTarget || pTarget->dwMode == PLAYER_MODE_DEAD) return FALSE; if(SkillID == D2S_CHARGEDSTRIKE || SkillID == D2S_ENCHANT || SkillID == D2S_BONEPRISON) { BYTE aPacket[9]; aPacket[0] = LeftAA ? 0x0A : 0x11; *(LPDWORD)&aPacket[1] = UNIT_TYPE_PLAYER; *(LPDWORD)&aPacket[5] = dwUnitId; D2NET_SendPacket(9, 1, aPacket); return TRUE; } else { AttackStruct Attack; D2SpellInfo Spell; Attack.dwAttackType = ATTACKTYPE_SHIFTLEFT; GetSkillInfo(SkillID, &Spell); if(SkillID != D2S_TELEPORT) { Attack.dwTargetX = pTarget->pPath->xPos; Attack.dwTargetY = pTarget->pPath->yPos; } if(pTarget->dwMode == PLAYER_MODE_RUN && !BlindToggled && SkillID == D2S_TELEPORT) { Attack.dwTargetX = pTarget->pPath->xTarget; Attack.dwTargetX = pTarget->pPath->yTarget; } if(SkillID == D2S_TELEPORT && !BlindToggled) { Attack.dwTargetX = pTarget->pPath->xPos; Attack.dwTargetY = pTarget->pPath->yPos; } if(BlindToggled && SkillID == D2S_TELEPORT && cfg.BlindSpot == 1) { Attack.dwTargetX = pTarget->pPath->xPos + 2; Attack.dwTargetY = pTarget->pPath->yPos + 2; } if(BlindToggled && SkillID == D2S_TELEPORT && cfg.BlindSpot == 2) { Attack.dwTargetX = pTarget->pPath->xPos + 3; Attack.dwTargetY = pTarget->pPath->yPos + 2; } if(BlindToggled && SkillID == D2S_TELEPORT && cfg.BlindSpot == 3) { Attack.dwTargetX = pTarget->pPath->xPos - 1; Attack.dwTargetY = pTarget->pPath->yPos + 3; } if(BlindToggled && SkillID == D2S_TELEPORT && cfg.BlindSpot == 4) { Attack.dwTargetX = pTarget->pPath->xPos + 1; Attack.dwTargetY = pTarget->pPath->yPos - 1.2; } if(BlindToggled && cfg.BlindSpot == 5) { Attack.dwTargetX = pTarget->pPath->xPos; Attack.dwTargetY = pTarget->pPath->yPos; } Attack.lpPlayerUnit = Myself; if(Spell.dwSpellInfoFlag & DSI_GUIDED) { Attack.dwAttackType = LeftAA ? ATTACKTYPE_UNITLEFT : ATTACKTYPE_RIGHT; Attack.lpTargetUnit = GetUnit(dwUnitId, UNIT_TYPE_PLAYER); } else Attack.lpTargetUnit = NULL; Attack._1 = 3; Attack._2 = 4; D2CLIENT_Attack(&Attack, (Spell.dwSpellInfoFlag & DSI_GUIDED) ? TRUE : FALSE); return TRUE; } } return FALSE; }