예제 #1
0
파일: JSUnit.cpp 프로젝트: ds-hwang/d2bs
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;
}
예제 #2
0
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;
		}
	}
}
예제 #3
0
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);
}
예제 #4
0
파일: Packet.cpp 프로젝트: Zakamurite/xMap
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;
}
예제 #5
0
파일: D2Helpers.cpp 프로젝트: ds-hwang/d2bs
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;
}
예제 #6
0
void ItemMover::PutItemOnGround() {
	BYTE PacketData[5] = {0x17,0,0,0,0};
	*reinterpret_cast<int*>(PacketData + 1) = ActivePacket.itemId;
	D2NET_SendPacket(5, 1, PacketData);
}
예제 #7
0
void ItemMover::PickUpItem() {
	BYTE PacketData[5] = {0x19,0,0,0,0};
	*reinterpret_cast<int*>(PacketData + 1) = ActivePacket.itemId;
	D2NET_SendPacket(5, 1, PacketData);
}
예제 #8
0
파일: JSUnit.cpp 프로젝트: ds-hwang/d2bs
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;
}
예제 #9
0
파일: AutoAim.cpp 프로젝트: perryh/Devil
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;
}