INT unit_repair(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { CDebug cDbg("unit repair"); 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; BYTE aPacket[17] = { NULL }; aPacket[0] = 0x35; *(DWORD*)&aPacket[1] = *p_D2CLIENT_RecentInteractId; aPacket[16] = 0x80; D2NET_SendPacket(17,1, aPacket); // note: this crashes while minimized // D2CLIENT_PerformNpcAction(pUnit,1, NULL); *rval = JSVAL_TRUE; return JS_TRUE; }
void ItemMover::OnKey(bool up, BYTE key, LPARAM lParam, bool* block) { UnitAny *unit = D2CLIENT_GetPlayerUnit(); if (!unit) return; if (!up && (key == HealKey || key == ManaKey)) { char firstChar = key == HealKey ? 'h' : 'm'; char minPotion = 127; DWORD minItemId = 0; bool isBelt = false; for (UnitAny *pItem = unit->pInventory->pFirstItem; pItem; pItem = pItem->pItemData->pNextInvItem) { if (pItem->pItemData->ItemLocation == STORAGE_INVENTORY || pItem->pItemData->ItemLocation == STORAGE_NULL && pItem->pItemData->NodePage == NODEPAGE_BELTSLOTS) { char* code = D2COMMON_GetItemText(pItem->dwTxtFileNo)->szCode; if (code[0] == firstChar && code[1] == 'p' && code[2] < minPotion) { minPotion = code[2]; minItemId = pItem->dwUnitId; isBelt = pItem->pItemData->NodePage == NODEPAGE_BELTSLOTS; } } //char *code = D2COMMON_GetItemText(pItem->dwTxtFileNo)->szCode; //if (code[0] == 'b' && code[1] == 'o' && code[2] == 'x') { // // Hack to pick up cube to fix cube-in-cube problem // BYTE PacketDataCube[5] = {0x19,0,0,0,0}; // *reinterpret_cast<int*>(PacketDataCube + 1) = pItem->dwUnitId; // D2NET_SendPacket(5, 1, PacketDataCube); // break; //} } if (minItemId > 0) { if (isBelt){ BYTE PacketData[13] = { 0x26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; *reinterpret_cast<int*>(PacketData + 1) = minItemId; D2NET_SendPacket(13, 0, PacketData); } else{ //PrintText(1, "Sending packet %d, %d, %d", minItemId, unit->pPath->xPos, unit->pPath->yPos); BYTE PacketData[13] = { 0x20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; *reinterpret_cast<int*>(PacketData + 1) = minItemId; *reinterpret_cast<WORD*>(PacketData + 5) = (WORD)unit->pPath->xPos; *reinterpret_cast<WORD*>(PacketData + 9) = (WORD)unit->pPath->yPos; D2NET_SendPacket(13, 0, PacketData); } *block = true; } } }
void ItemMover::PutItemInContainer() { BYTE PacketData[17] = {0x18,0,0,0,0}; *reinterpret_cast<int*>(PacketData + 1) = ActivePacket.itemId; *reinterpret_cast<int*>(PacketData + 5) = ActivePacket.x; *reinterpret_cast<int*>(PacketData + 9) = ActivePacket.y; *reinterpret_cast<int*>(PacketData + 13)= ActivePacket.destination; D2NET_SendPacket(17, 1, PacketData); }
BOOL Interact(DWORD dwUnitId, DWORD dwType, BOOL bCheckOverride) { if (!bCheckOverride) //if(!D2CLIENT_GetUnitFromId(dwUnitId, dwType)) if (!D2CLIENT_FindUnit(dwUnitId, dwType)) return FALSE; BYTE aPacket[9]; aPacket[0] = 0x13; *(DWORD*)&aPacket[1] = dwType; *(DWORD*)&aPacket[5] = dwUnitId; D2NET_SendPacket(9, 1, aPacket); return 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; }
void ItemMover::PutItemOnGround() { BYTE PacketData[5] = {0x17,0,0,0,0}; *reinterpret_cast<int*>(PacketData + 1) = ActivePacket.itemId; D2NET_SendPacket(5, 1, PacketData); }
void ItemMover::PickUpItem() { BYTE PacketData[5] = {0x19,0,0,0,0}; *reinterpret_cast<int*>(PacketData + 1) = ActivePacket.itemId; D2NET_SendPacket(5, 1, PacketData); }
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; }
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; }