BOOL TMonsterSkillElement::ApplyElementMP(int iIndex, int iTargetIndex)
{
	LPOBJ lpObj = &gObj[iIndex];
	LPOBJ lpTargetObj = &gObj[iTargetIndex];
	int iIncDecValue = 0;

	if ( this->m_iIncAndDecType != MSE_INCDEC_TYPE_NONE )
	{
		if ( this->m_iIncAndDecType < MSE_INCDEC_TYPE_CONSTANTINC )
		{
			iIncDecValue = (int)(lpTargetObj->Mana * this->m_iIncAndDecValue / 100.0f);

			if ( this->m_iIncAndDecType == MSE_INCDEC_TYPE_PERCENTDEC )
				iIncDecValue = -iIncDecValue;
		}

		if ( this->m_iIncAndDecType >= MSE_INCDEC_TYPE_CONSTANTINC )
		{
			iIncDecValue = this->m_iIncAndDecValue;

			if ( this->m_iIncAndDecType == MSE_INCDEC_TYPE_CONSTANTDEC )
				iIncDecValue = -iIncDecValue;
		}
	}

	lpTargetObj->Mana += iIncDecValue;

	if ( lpTargetObj->Mana < 0 )
	{
		lpTargetObj->Mana = 0;
		GCManaSend(lpTargetObj->m_Index, (short)lpTargetObj->Mana, 0xFF, 0, lpObj->BP);	// #error Change lpObj to lpTargetObj

		return TRUE;
	}

	if ( (lpTargetObj->MaxMana + lpTargetObj->AddMana) < lpTargetObj->Mana )
	{
		lpTargetObj->Mana = lpTargetObj->MaxMana + lpTargetObj->AddMana;
		GCManaSend(lpTargetObj->m_Index, (short)lpTargetObj->Mana, 0xFF, 0, lpTargetObj->BP);

		return TRUE;
	}

	GCManaSend(lpTargetObj->m_Index, (short)lpTargetObj->Mana, 0xFF, 0, lpTargetObj->BP);

	return FALSE;
}
BOOL TMonsterSkillElement::ApplyElementAG(int iIndex, int iTargetIndex)
{
	LPOBJ lpObj = &gObj[iIndex];
	LPOBJ lpTargetObj = &gObj[iTargetIndex];
	int iIncDecValue = 0;

	if ( this->m_iIncAndDecType != MSE_INCDEC_TYPE_NONE )
	{
		if ( this->m_iIncAndDecType < MSE_INCDEC_TYPE_CONSTANTINC )
		{
			iIncDecValue = lpTargetObj->BP * this->m_iIncAndDecValue / 100;

			if ( this->m_iIncAndDecType == MSE_INCDEC_TYPE_PERCENTDEC )
				iIncDecValue = -iIncDecValue;
		}

		if ( this->m_iIncAndDecType >= MSE_INCDEC_TYPE_CONSTANTINC )
		{
			iIncDecValue = this->m_iIncAndDecValue;

			if ( this->m_iIncAndDecType == MSE_INCDEC_TYPE_CONSTANTDEC )
				iIncDecValue = -iIncDecValue;
		}
	}

	lpTargetObj->BP += iIncDecValue;

	if ( lpTargetObj->BP < 0 )
	{
		lpTargetObj->BP = 0;
		GCManaSend(lpTargetObj->m_Index, (short)lpTargetObj->Mana, 0xFF, 0, lpTargetObj->BP);

		return TRUE;
	}

	if ( (lpTargetObj->MaxBP + lpTargetObj->AddBP) < lpTargetObj->Mana )	// #error Change Mana->BP
	{
		lpTargetObj->Mana = (float)(lpTargetObj->MaxBP + lpTargetObj->AddBP);	// #error Change Mana->BP
		GCManaSend(lpTargetObj->m_Index, (short)lpTargetObj->Mana, 0xFF, 0, lpTargetObj->BP);

		return TRUE;
	}

	GCManaSend(lpTargetObj->m_Index, (short)lpTargetObj->Mana, 0xFF, 0, lpTargetObj->BP);

	return FALSE;
}
void CSocketItems::ApplyWindOption(LPOBJ lpObj,BYTE btOption,BYTE IncType,WORD IncValue)
{
	int _IncValue = 0;

	switch( btOption )
	{
	case 21:
		_IncValue = GetResultValue(lpObj->MaxLife+lpObj->AddLife,IncValue,IncType);
		lpObj->m_wSocketAddLife += _IncValue;
		break;
	case 22:
		_IncValue = GetResultValue(lpObj->MaxLife+lpObj->AddLife,IncValue,IncType);
		lpObj->AddLife += _IncValue;

		GCReFillSend(lpObj->m_Index,lpObj->MaxLife+lpObj->AddLife,0xFE,0,lpObj->iMaxShield+lpObj->iAddShield);
		GCReFillSend(lpObj->m_Index,lpObj->Life,0xFF,0,lpObj->iShield);
		break;
	case 23:
		_IncValue = GetResultValue(lpObj->MaxMana+lpObj->AddMana,IncValue,IncType);
		lpObj->AddMana += _IncValue;

		GCManaSend(lpObj->m_Index,lpObj->MaxMana+lpObj->AddMana,0xFE,0,lpObj->MaxBP+lpObj->AddBP);
		GCManaSend(lpObj->m_Index,lpObj->Mana,0xFF,0,lpObj->BP);
		break;
	case 24:
		_IncValue = GetResultValue(lpObj->MaxMana+lpObj->AddMana,IncValue,IncType);
		lpObj->m_wSocketAddMana += _IncValue;
		break;
	case 25:
		_IncValue = GetResultValue(lpObj->MaxBP+lpObj->AddBP,IncValue,IncType);
		lpObj->AddBP += _IncValue;

		GCManaSend(lpObj->m_Index,lpObj->MaxMana+lpObj->AddMana,0xFE,0,lpObj->MaxBP+lpObj->AddBP);
		GCManaSend(lpObj->m_Index,lpObj->Mana,0xFF,0,lpObj->BP);
		break;
	case 26:
		_IncValue = GetResultValue(lpObj->SetOpIncAGValue,IncValue,IncType);
		lpObj->SetOpIncAGValue += _IncValue;
		break;
	case 27:
		lpObj->MonsterDieGetMoney += IncValue;
		break;
	}
}
Exemplo n.º 4
0
void cOffExp::UseMana(int aIndex)
{
	LPOBJ lpObj = &gObj[aIndex];

	if(lpObj->Mana > 100) return;
		
	int pos;

	pos = gObjGetManaItemPos(aIndex);

	if(pos == -1) return;

	if( lpObj->pInventory[pos].m_Type == ITEMGET(14,4) || 
		lpObj->pInventory[pos].m_Type == ITEMGET(14,5) || 
		lpObj->pInventory[pos].m_Type == ITEMGET(14,6)  )
	{
		int tMana = (lpObj->pInventory[pos].m_Value*10) - (gObj[aIndex].Level);

		if ( tMana < 0 )
		{
			tMana=0;
		}

		switch ( lpObj->pInventory[pos].m_Type )
		{
		case ITEMGET(14,4):
			tMana += ((int)(gObj[aIndex].MaxMana + gObj[aIndex].AddMana))*20/100; 
			break;
		case ITEMGET(14,5):
			tMana += ((int)(gObj[aIndex].MaxMana + gObj[aIndex].AddMana))*30/100; 
			break;
		case ITEMGET(14,6):
			tMana += ((int)(gObj[aIndex].MaxMana + gObj[aIndex].AddMana))*40/100; 
			break;
		}

		gObj[aIndex].Mana += tMana;

		if ( gObj[aIndex].Mana > (gObj[aIndex].MaxMana+gObj[aIndex].AddMana-1.0f) )
		{
			gObj[aIndex].Mana = gObj[aIndex].MaxMana+gObj[aIndex].AddMana;
		}

		GCManaSend(aIndex, (int)gObj[aIndex].Mana, 0xFF, 0, (int)gObj[aIndex].BP);

		if ( !gObjSearchItemMinus(&gObj[aIndex], pos, 1) )
		{
			gObjInventoryItemSet(aIndex, pos, -1);
			gObj[aIndex].pInventory[pos].Clear();
			GCInventoryItemDeleteSend(aIndex, pos, 1);
		}
	}
}
Exemplo n.º 5
0
void CGuardian::GuardianAct(int iIndex)
{
#if (GS_CASTLE==1)
	if ( !gObjIsConnected(iIndex))
		return;

	LPOBJ lpObj = &gObj[iIndex];

	if ( lpObj->VPCount < 1 ) 
		return;

	int tObjNum = -1;

	for (int i=0;i<MAX_VIEWPORT;i++)
	{
		tObjNum = lpObj->VpPlayer[i].number;

		if ( tObjNum >= 0 )
		{
			if ( gObj[tObjNum].Type == OBJ_USER && gObj[tObjNum].Live )
			{
				if ( gObj[tObjNum].m_btCsJoinSide == lpObj->m_btCsJoinSide )
				{
					if ( abs(lpObj->Y - gObj[tObjNum].Y) <= 3 &&
						 abs(lpObj->X - gObj[tObjNum].X) <= 3 )
					{
						gObj[tObjNum].Life += 100.0f;
						gObj[tObjNum].Mana += 100.0f;
						gObj[tObjNum].BP += 100;

						if ( gObj[tObjNum].Life > gObj[tObjNum].MaxLife )
							gObj[tObjNum].Life = gObj[tObjNum].MaxLife;

						if ( gObj[tObjNum].Mana > gObj[tObjNum].MaxMana )
							gObj[tObjNum].Mana = gObj[tObjNum].MaxMana;

						if ( gObj[tObjNum].BP > gObj[tObjNum].MaxBP )
							gObj[tObjNum].BP = gObj[tObjNum].MaxBP;

						GCReFillSend(tObjNum, (WORD)gObj[tObjNum].Life, 0xFF, 1, gObj[tObjNum].iShield);
						GCManaSend(tObjNum, (WORD)gObj[tObjNum].Mana, 0xFF, 0, gObj[tObjNum].BP);
					}
				}
			}
		}
	}

#endif
	return;
}
Exemplo n.º 6
0
BOOL NpcLitleSanta(LPOBJ lpNpc,LPOBJ lpObj,int Buff)
{
	if( !gObjIsConnected(lpObj->m_Index) )
	{
		return true;
	}

	switch( Buff )
	{
	case 0:
		lpObj->Life = lpObj->MaxLife + lpObj->AddLife;
		GCReFillSend(lpObj->m_Index,(WORD)lpObj->Life,0xFF,0,lpObj->iShield);
		break;
	case 1:
		lpObj->Mana = lpObj->MaxMana + lpObj->MaxMana;
		GCManaSend(lpObj->m_Index,(WORD)lpObj->Mana,0xFF,0,lpObj->BP);
		break;
	case 0x5E:
		gObjAddBuffEffect(lpObj,BUFF_SANTA_STRENGHTHENER,ADD_OPTION_SANTABUFF,30,0,0,1800);
		break;
	case 0x5F:
		gObjAddBuffEffect(lpObj,BUFF_SANTA_DEFENSE,ADD_OPTION_SANTADEFENSE,100,0,0,1800);
		break;
	case 0x5C:
		gObjAddBuffEffect(lpObj,BUFF_SANTA_HEALING,ADD_OPTION_LIFE,500,0,0,1800);
		break;
	case 0x5D:
		gObjAddBuffEffect(lpObj,BUFF_SANTA_PROTECTION,ADD_OPTION_MANA,500,0,0,1800);
		break;
	case 0x60:
		gObjAddBuffEffect(lpObj,BUFF_SANTA_QUICKNESS,ADD_OPTION_ATTACK_SPEED,15,0,0,1800);
		break;
	case 0x61:
		gObjAddBuffEffect(lpObj,BUFF_SANTA_FORTUNE,ADD_OPTION_SANTABPRECOVERY,10,0,0,1800);
		break;
	}

return true;
}
void gObjSetItemApply(LPOBJ lpObj)
{
	lpObj->m_AttackDamageMinLeft += lpObj->SetOpAddAttackDamage;
	lpObj->m_AttackDamageMaxLeft += lpObj->SetOpAddAttackDamage;
	lpObj->m_AttackDamageMinRight += lpObj->SetOpAddAttackDamage;
	lpObj->m_AttackDamageMaxRight += lpObj->SetOpAddAttackDamage;

	lpObj->m_AttackDamageMinLeft += lpObj->SetOpAddMinAttackDamage;
	lpObj->m_AttackDamageMinRight += lpObj->SetOpAddMinAttackDamage;

	lpObj->m_AttackDamageMaxLeft += lpObj->SetOpAddMaxAttackDamage;
	lpObj->m_AttackDamageMaxRight += lpObj->SetOpAddMaxAttackDamage;

	lpObj->m_MagicDamageMin += lpObj->m_MagicDamageMin * lpObj->SetOpAddMagicPower / 100;
	lpObj->m_MagicDamageMax += lpObj->m_MagicDamageMax * lpObj->SetOpAddMagicPower / 100;

	lpObj->AddLife += INT(lpObj->AddVitality * gCharInfo.sCharInfo[lpObj->Class].VitalityToLife);
	lpObj->AddMana += INT(lpObj->AddEnergy * gCharInfo.sCharInfo[lpObj->Class].EnergyToMana);

	lpObj->m_CriticalDamage += lpObj->SetOpAddCriticalDamageSuccessRate;
	lpObj->m_ExcelentDamage += lpObj->SetOpAddExDamageSuccessRate;

	if ( lpObj->pInventory[10].IsSetItem() )
	{
		lpObj->pInventory[10].PlusSpecialSetRing((LPBYTE)lpObj->m_AddResistance);
	}

	if ( lpObj->pInventory[11].IsSetItem() )
	{
		lpObj->pInventory[11].PlusSpecialSetRing((LPBYTE)lpObj->m_AddResistance);
	}

	if ( lpObj->pInventory[9].IsSetItem() )
	{
		lpObj->pInventory[9].PlusSpecialSetRing((LPBYTE)lpObj->m_AddResistance);
	}

	if ( lpObj->SetOpTwoHandSwordImproveDamage )
	{
		if ( !lpObj->pInventory[1].IsItem() && !lpObj->pInventory[0].IsItem() )
		{
			lpObj->SetOpTwoHandSwordImproveDamage = 0;
		}

		if ( lpObj->pInventory[1].IsItem() && lpObj->pInventory[1].m_TwoHand == FALSE )
		{
			lpObj->SetOpTwoHandSwordImproveDamage = 0;
		}

		if ( lpObj->pInventory[0].IsItem() && lpObj->pInventory[0].m_TwoHand == FALSE )
		{
			lpObj->SetOpTwoHandSwordImproveDamage = 0;
		}
	}

	if ( (lpObj->MaxLife + lpObj->AddLife ) < lpObj->Life )
	{
		lpObj->Life = lpObj->MaxLife + lpObj->AddLife;
		GCReFillSend(lpObj->m_Index, lpObj->Life, 0xFF, 0, lpObj->iShield);
	}

	gObjSetBP(lpObj->m_Index);

	if ( (lpObj->MaxMana + lpObj->AddMana ) < lpObj->Mana )
	{
		lpObj->Mana = lpObj->MaxMana + lpObj->AddMana;
		GCManaSend(lpObj->m_Index, lpObj->Mana, 0xFF, 0, lpObj->BP);
	}

	lpObj->m_Defense += lpObj->SetOpAddDefence * 10 / 20;
	lpObj->m_Defense += lpObj->m_Defense * lpObj->SetOpAddDefenceRate / 100;

	if ( lpObj->pInventory[1].m_Type >= ITEMGET(6,0) && lpObj->pInventory[1].m_Type < ITEMGET(7,0) )
	{
		lpObj->m_Defense += lpObj->m_Defense * lpObj->SetOpImproveSheldDefence / 100;
	}
}
Exemplo n.º 8
0
bool cChat::AddCommands(LPOBJ gObj, char *Msg, int Type)
{
	int aIndex = User.GetPlayerIndex(gObj->Name);

	switch (Type)
	{
	case 0:
		if (CheckCommand(gObj, Configs.Commands.AddPointEnabled, GmSystem.NONE, Configs.Commands.AddPriceZen,
			Configs.Commands.AddPointLevelReq, 1, 0, "AddStats", "/addstr <num>", Msg))
			return true;
		break;
	case 1:
		if (CheckCommand(gObj, Configs.Commands.AddPointEnabled, GmSystem.NONE, Configs.Commands.AddPriceZen, Configs.Commands.AddPointLevelReq, 1, 0, "AddStats", "/addagi <num>", Msg))
			return true;
		break;
	case 2:
		if (CheckCommand(gObj, Configs.Commands.AddPointEnabled, GmSystem.NONE, Configs.Commands.AddPriceZen, Configs.Commands.AddPointLevelReq, 1, 0, "AddStats", "/addvit <num>", Msg))
			return true;
		break;
	case 3:
		if (CheckCommand(gObj, Configs.Commands.AddPointEnabled, GmSystem.NONE, Configs.Commands.AddPriceZen, Configs.Commands.AddPointLevelReq, 1, 0, "AddStats", "/addene <num>", Msg))
			return true;
		break;
	case 4:
		if (CheckCommand(gObj, Configs.Commands.AddPointEnabled, GmSystem.NONE, Configs.Commands.AddPriceZen, Configs.Commands.AddPointLevelReq, 1, 0, "AddStats", "/addcmd <num>", Msg))
			return true;
		if (gObj->Class != 4)
		{
			TNotice.SendNotice(aIndex, 1, "[AddStats] You are not Dark Lord!!!");
			//MessageLog(1, gObj, "[AddStats] You are not Dark Lord!!!");
			return true;
		}
		break;
	}
	DWORD Points;
	sscanf(Msg, "%d", &Points);

	if (Configs.Commands.MaxAddedStats > 0 && Configs.Commands.MaxAddedStats <= Points)
	{
		TNotice.SendNotice(aIndex, 1, "[AddStats] You can't add more than %d stats!!!", Configs.Commands.MaxAddedStats);
		return true;
	}

	int MaxPoints = 32767;
	//if(Configs.Enable65kStats >= 1)
	//	MaxPoints = -536;	

	int Stats = 0;
	bool bResult = false;
	switch (Type)
	{
	case 0x00:
		Stats = gObj->Strength;
		if (gObj->Class == 0)
			MaxPoints;
		else if (gObj->Class == 1)
			MaxPoints;
		else if (gObj->Class == 2)
			MaxPoints;
		else if (gObj->Class == 3)
			MaxPoints;
		else if (gObj->Class == 4)
			MaxPoints;
		else if (gObj->Class == 5)
			MaxPoints;
		break;
	case 0x01:
		Stats = gObj->Dexterity;
		if (gObj->Class == 0)
			MaxPoints;
		else if (gObj->Class == 1)
			MaxPoints;
		else if (gObj->Class == 2)
			MaxPoints;
		else if (gObj->Class == 3)
			MaxPoints;
		else if (gObj->Class == 4)
			MaxPoints;
		else if (gObj->Class == 5)
			MaxPoints;
		break;
	case 0x02:
		Stats = gObj->Vitality;
		if (gObj->Class == 0)
			MaxPoints;
		else if (gObj->Class == 1)
			MaxPoints;
		else if (gObj->Class == 2)
			MaxPoints;
		else if (gObj->Class == 3)
			MaxPoints;
		else if (gObj->Class == 4)
			MaxPoints;
		else if (gObj->Class == 5)
			MaxPoints;
		break;
	case 0x03:
		Stats = gObj->Energy;
		if (gObj->Class == 0)
			MaxPoints;
		else if (gObj->Class == 1)
			MaxPoints;
		else if (gObj->Class == 2)
			MaxPoints;
		else if (gObj->Class == 3)
			MaxPoints;
		else if (gObj->Class == 4)
			MaxPoints;
		else if (gObj->Class == 5)
			MaxPoints;
		break;
	case 0x04:
		Stats = gObj->Leadership;
		if (gObj->Class == 4)
			MaxPoints;
		break;
	}

	int MaxPointsTemp = MaxPoints;
	if (MaxPoints > 32767)
		MaxPoints = -32768 + (MaxPoints - 32767);

	if (((MaxPoints > 0) && (Stats >= MaxPoints || Stats < 0)) ||
		((MaxPoints < 0) && (Stats < 0) && (Stats >= MaxPoints)))
	{
		TNotice.SendNotice(aIndex, 1, "[AddStats] You have max points for this type!!!");
		return true;
	}

	int StatsTemp = Stats;
	Stats += Points;
	if (gObj->LevelUpPoint < Points)
	{
		TNotice.SendNotice(aIndex, 1, "[AddStats] You don't have enough points to add. Need %d more.", Points - gObj->LevelUpPoint);
		return true;
	}

	if (((MaxPoints > 0) && (Stats > MaxPoints || Stats < 0)) ||
		((MaxPoints < 0) && (Stats < 0) && (Stats > MaxPoints)))
	{
		TNotice.SendNotice(aIndex, 1, "[AddStats] You can't add more than %d points for this type!!!", MaxPoints - StatsTemp);
		return true;
	}

	TakeCommand(gObj, Configs.Commands.AddPriceZen, "AddStats");

	switch (Type)
	{
	case 0x00://str
	{
		//PMSG_CHARREGEN pMsg;
		PMSG_STAT_UPDATE pMsg;
		PHeadSetB((LPBYTE)&pMsg, 0x2C, sizeof(PMSG_STAT_UPDATE));
		pMsg.result = 0;
		pMsg.btFruitType = 3;
		pMsg.btStatValue = Points;
		gObj->Strength += Points;
		gObj->LevelUpPoint -= Points;

		GCLevelUpMsgSend(gObj->m_Index, 1);
		gObjCalCharacter(gObj->m_Index);
		gObjSetBP(gObj->m_Index);

		DataSend(gObj->m_Index, (char*)&pMsg, pMsg.h.size);
		//Utilits.SendEffect(gObj, 5);
		return true;
	}
	case 0x01://agi
	{
		PMSG_STAT_UPDATE pMsg;
		PHeadSetB((LPBYTE)&pMsg, 0x2C, sizeof(PMSG_STAT_UPDATE));
		pMsg.result = 0;
		pMsg.btFruitType = 2;
		pMsg.btStatValue = Points;
		gObj->Dexterity += Points;
		gObj->LevelUpPoint -= Points;

		GCLevelUpMsgSend(gObj->m_Index, 1);
		gObjCalCharacter(gObj->m_Index);
		gObjSetBP(gObj->m_Index);

		DataSend(gObj->m_Index, (char*)&pMsg, pMsg.h.size);

		return true;
	}
	case 0x02://vit
	{
		PMSG_STAT_UPDATE pMsg;
		PHeadSetB((LPBYTE)&pMsg, 0x2C, sizeof(PMSG_STAT_UPDATE));
		pMsg.result = 0;
		pMsg.btStatValue = Points;
		pMsg.btFruitType = 1;
		DataSend(gObj->m_Index, (char*)&pMsg, pMsg.h.size);
		gObj->Vitality += Points;
		gObj->MaxLife += gObj->VitalityToLife * Points;

		gObj->LevelUpPoint -= Points;
		GCLevelUpMsgSend(gObj->m_Index, 1);
		gObjCalCharacter(gObj->m_Index);
		GCReFillSend(gObj->m_Index, gObj->MaxLife + gObj->AddLife, 0xFE, 0, gObj->iMaxShield + gObj->iAddShield);
		gObjSetBP(gObj->m_Index);
		//Utilits.SendEffect(gObj, 2);
		return true;
	}
	case 0x03://ene
	{
		PMSG_STAT_UPDATE pMsg;
		PHeadSetB((LPBYTE)&pMsg, 0x2C, sizeof(PMSG_STAT_UPDATE));
		pMsg.result = 0;
		pMsg.btFruitType = 0;
		pMsg.btStatValue = Points;
		DataSend(gObj->m_Index, (char*)&pMsg, pMsg.h.size);
		gObj->Energy += Points;
		gObj->MaxMana += gObj->EnergyToMana * Points;

		gObj->LevelUpPoint -= Points;
		GCLevelUpMsgSend(gObj->m_Index, 1);
		gObjCalCharacter(gObj->m_Index);
		GCManaSend(gObj->m_Index, gObj->MaxMana + gObj->AddMana, 0xFE, 0, gObj->MaxBP + gObj->AddBP);
		gObjSetBP(gObj->m_Index);

		//Utilits.SendEffect(gObj, 2);
		return true;
	}
	case 0x04://cmd
	{
		PMSG_STAT_UPDATE pMsg;
		PHeadSetB((LPBYTE)&pMsg, 0x2C, sizeof(PMSG_STAT_UPDATE));
		pMsg.result = 0;
		pMsg.btFruitType = 4;
		pMsg.btStatValue = Points;
		gObj->Leadership += Points;
		gObj->LevelUpPoint -= Points;

		DataSend(gObj->m_Index, (char*)&pMsg, pMsg.h.size);
		gObjCalCharacter(aIndex);
		gObjSetBP(aIndex);
		GCLevelUpMsgSend(gObj->m_Index, 0);
		//Utilits.SendEffect(gObj, 2);
		return true;
	}
	default:
	{
		return true;
	}
	}

	TNotice.SendNotice(aIndex, 1, "[AddStats] Your stats successfully added!");
	TNotice.SendNotice(aIndex, 1, "Please Relog!");
	return true;
}
Exemplo n.º 9
0
bool CItemAddOption::_ClearItemEffect(LPOBJ lpObj, int iEffectOption, int iOptionType, int iEffectType, int iEffectValue)
{
	if ( iEffectType <= 0 )
		return false;

	switch ( iEffectType )
	{
		case ADD_OPTION_LIFE:
			lpObj->AddLife -= iEffectValue;

			if ( (lpObj->AddLife + lpObj->MaxLife ) < lpObj->Life )
				lpObj->Life = lpObj->AddLife + lpObj->MaxLife;

			GCReFillSend(lpObj->m_Index, (WORD)lpObj->Life, 0xFF, 0, lpObj->iShield);
			GCReFillSend(lpObj->m_Index, WORD(lpObj->MaxLife + lpObj->AddLife), 0xFE, 0, lpObj->iMaxShield + lpObj->iAddShield);
			break;

		case ADD_OPTION_MANA:
			lpObj->AddMana -= iEffectValue;

			if ( (lpObj->AddMana + lpObj->MaxMana ) < lpObj->Mana )
				lpObj->Mana = lpObj->AddMana + lpObj->MaxMana;


			GCManaSend(lpObj->m_Index, (short)lpObj->Mana, -1, 0, lpObj->BP);
			GCManaSend(lpObj->m_Index, short(lpObj->AddMana + lpObj->MaxMana), 0xFE, 0, lpObj->MaxBP + lpObj->AddBP);
			break;

		case ADD_OPTION_ATTACK_DAMAGE:
			lpObj->m_AttackDamageMaxLeft -= iEffectValue;
			lpObj->m_AttackDamageMinLeft -= iEffectValue;
			lpObj->m_AttackDamageMaxRight -= iEffectValue;
			lpObj->m_AttackDamageMinRight -= iEffectValue;
			lpObj->m_MagicDamageMin -= iEffectValue;
			lpObj->m_MagicDamageMax -= iEffectValue;
			break;

		case ADD_OPTION_SPEED:
			lpObj->m_AttackSpeed -= iEffectValue;
			lpObj->m_MagicSpeed -= iEffectValue;
			break;

		case ADD_OPTION_EXPERIENCE:
			lpObj->m_wExprienceRate = 100;
			lpObj->m_btMoveMapBound = 0;
			break;

		case ADD_OPTION_DROP_RATE:
			lpObj->m_wItemDropRate = 100;
			lpObj->m_btMoveMapBound = 0;
			break;

		case 8:
			lpObj->m_wExprienceRate = 100;
			lpObj->m_btMoveMapBound = 0;
			break;

		case ADD_OPTION_DEFENSE:
			lpObj->m_Defense -= iEffectValue * 10 / 20;
			break;

		case ADD_OPTION_STRENGTH:
			lpObj->Strength -= iEffectValue;
			break;

		case ADD_OPTION_DEXTERITY:
			lpObj->Dexterity -= iEffectValue;
			break;

		case ADD_OPTION_VITALITY:
			lpObj->Vitality -= iEffectValue;
			break;

		case ADD_OPTION_ENERGY:
			lpObj->Energy -= iEffectValue;
			break;

		case ADD_OPTION_LEADERSHIP:
			lpObj->Leadership -= iEffectValue;
			break;
			
        case ADD_OPTION_FORCE:
                lpObj->m_AttackDamageMaxLeft -= iEffectValue;
                lpObj->m_AttackDamageMinLeft -= iEffectValue;
                lpObj->m_AttackDamageMaxRight -= iEffectValue;
                lpObj->m_AttackDamageMinRight -= iEffectValue;
                break;
        case ADD_OPTION_MAGIC:
                lpObj->m_MagicDamageMin -= iEffectValue;
                lpObj->m_MagicDamageMax -= iEffectValue;
                break;
        case ADD_OPTION_MOVEABLE:
                lpObj->m_btMoveMapBound = 0;
                //Do nothing cuz mapmovebound is removed
                break;

		default:
			return false;
	}

	GCUseEffectItem(lpObj, iEffectOption, iOptionType, iEffectType, 0);

	return true;
}
Exemplo n.º 10
0
void CSantaEvent::LittleSantaCancelBuffer(LPOBJ lpObj)
{
	if ( lpObj->LittleSantaTime1 > 0 )
	{
		lpObj->LittleSantaTime1 = 0;
		lpObj->AddLife-=500;
		if ( lpObj->Life > (lpObj->MaxLife+lpObj->AddLife) )
		{
			lpObj->Life = lpObj->MaxLife+lpObj->AddLife;
			GCReFillSend(lpObj->m_Index,lpObj->Life,0xFF,0,lpObj->iShield);
		}
		GCReFillSend(lpObj->m_Index,lpObj->MaxLife + lpObj->AddLife,0xFE,0,lpObj->iMaxShield + lpObj->iAddShield);
		GCStateInfoSend(lpObj,0,92);
	}

	if ( lpObj->LittleSantaTime2 > 0 )
	{
		lpObj->LittleSantaTime2 = 0;
		lpObj->m_Defense-=100;
		GCStateInfoSend(lpObj,0,95);
	}

	if ( lpObj->LittleSantaTime3 > 0 )
	{
		lpObj->LittleSantaTime3 = 0;
		lpObj->AddMana-=500;
		if ( lpObj->Mana > (lpObj->MaxMana+lpObj->AddMana) )
		{
			lpObj->Mana = lpObj->MaxMana+lpObj->AddMana;
			GCManaSend(lpObj->m_Index,lpObj->Mana,0xFF,0,lpObj->BP);
		}
		GCManaSend(lpObj->m_Index,lpObj->MaxMana+lpObj->AddMana,0xFE,0,lpObj->MaxBP+lpObj->AddBP);
		GCStateInfoSend(lpObj,0,93);
	}

	if ( lpObj->LittleSantaTime4 > 0 )
	{
		lpObj->LittleSantaTime4 = 0;
		lpObj->m_AttackSpeed-=15;
		lpObj->m_MagicSpeed-=15;
		GCStateInfoSend(lpObj,0,96);
	}

	if ( lpObj->LittleSantaTime5 > 0 )
	{
		lpObj->LittleSantaTime5 = 0;
		lpObj->m_AttackDamageLeft-=30;
		lpObj->m_AttackDamageRight-=30;
		lpObj->m_AttackDamageMinLeft-=30;
		lpObj->m_AttackDamageMaxLeft-=30;
		lpObj->m_AttackDamageMinRight-=30;
		lpObj->m_AttackDamageMaxRight-=30;
		lpObj->m_AttackDamageMax-=30;
		lpObj->m_AttackDamageMin-=30;
		lpObj->m_MagicDamageMax-=30;
		lpObj->m_MagicDamageMin-=30;
		GCStateInfoSend(lpObj,0,94);
	}

	if ( lpObj->LittleSantaTime6 > 0 )
	{
		lpObj->LittleSantaTime6 = 0;
		GCStateInfoSend(lpObj,0,97);
	}
}
Exemplo n.º 11
0
bool CItemAddOption::_SetItemEffect(LPOBJ lpObj, int iEffectType, int iEffectValue)
{
	if ( iEffectType <= 0 )
		return false;

	switch ( iEffectType )
	{
		case ADD_OPTION_LIFE:
			lpObj->AddLife += iEffectValue;
			GCReFillSend(lpObj->m_Index, lpObj->MaxLife + lpObj->AddLife, -2, 0, lpObj->iMaxShield + lpObj->iAddShield);
			GCReFillSend(lpObj->m_Index, lpObj->Life, -1, 0, lpObj->iShield);
			break;

		case ADD_OPTION_MANA:
			lpObj->AddMana += iEffectValue;
			GCManaSend(lpObj->m_Index, lpObj->AddMana + lpObj->MaxMana, -2, 0, lpObj->MaxBP + lpObj->AddBP);
			GCManaSend(lpObj->m_Index, lpObj->Mana, -1, 0, lpObj->BP);
			break;

		case ADD_OPTION_ATTACK_DAMAGE:
			lpObj->m_AttackDamageMaxLeft += iEffectValue;
			lpObj->m_AttackDamageMinLeft += iEffectValue;
			lpObj->m_AttackDamageMaxRight += iEffectValue;
			lpObj->m_AttackDamageMinRight += iEffectValue;
			lpObj->m_MagicDamageMin += iEffectValue;
			lpObj->m_MagicDamageMax += iEffectValue;
			break;

		case ADD_OPTION_SPEED:
			lpObj->m_AttackSpeed += iEffectValue;
			lpObj->m_MagicSpeed += iEffectValue;
			break;

		case ADD_OPTION_EXPERIENCE:
			lpObj->m_wExprienceRate = iEffectValue;
			break;

		case ADD_OPTION_DROP_RATE:
			lpObj->m_wItemDropRate = iEffectValue;
			break;

		case 8:
			lpObj->m_wExprienceRate = 0;
			break;

		case ADD_OPTION_DEFENSE:
			lpObj->m_Defense += iEffectValue * 10 / 20;
			break;

		case ADD_OPTION_STRENGTH:
			lpObj->Strength += iEffectValue;
			break;

		case ADD_OPTION_DEXTERITY:
			lpObj->Dexterity += iEffectValue;
			break;

		case ADD_OPTION_VITALITY:
			lpObj->Vitality += iEffectValue;
			break;

		case ADD_OPTION_ENERGY:
			lpObj->Energy += iEffectValue;
			break;

		case ADD_OPTION_LEADERSHIP:
			lpObj->Leadership += iEffectValue;
			break;
		case ADD_OPTION_FORCE:
			lpObj->m_AttackDamageMaxLeft += iEffectValue;
			lpObj->m_AttackDamageMinLeft += iEffectValue;
			lpObj->m_AttackDamageMaxRight += iEffectValue;
			lpObj->m_AttackDamageMinRight += iEffectValue;
			break;
		case ADD_OPTION_MAGIC:
			lpObj->m_MagicDamageMin += iEffectValue;
			lpObj->m_MagicDamageMax += iEffectValue;
			break;
		case ADD_OPTION_MOVEABLE:
			//Do nothing cuz mapmovebound is removed
			break;

		default:
			return false;
	}

	return true;
}
Exemplo n.º 12
0
//0067c120
void CBuffEffect::SetBuffEffect(LPOBJ lpObj, BYTE EffectType, int EffectValue)
{
	if( lpObj == NULL || EffectType < 0 )
		return;

	if( lpObj->Connected < 3 )
		return;

	switch( EffectType )
	{
	case ADD_OPTION_SPEED:
		lpObj->m_AttackSpeed += EffectValue;
		lpObj->m_MagicSpeed += EffectValue;
		break;
	case ADD_OPTION_DEFENSE:
		lpObj->m_Defense += EffectValue;
		lpObj->m_MagicDefense += EffectValue;
		break;
	case ADD_OPTION_LIFE:
		lpObj->AddLife += EffectValue;
		GCReFillSend(lpObj->m_Index,(int)(lpObj->AddLife + lpObj->MaxLife),0xFEu,0,lpObj->iAddShield + lpObj->iMaxShield);
        GCReFillSend(lpObj->m_Index, (int)lpObj->Life, 0xFF, 0, lpObj->iShield);
		break;
	case ADD_OPTION_MANA:
		lpObj->AddMana += EffectValue;
		GCManaSend(lpObj->m_Index,(int)(lpObj->AddMana + lpObj->MaxMana),0xFEu,0,lpObj->AddBP + lpObj->MaxBP);
        GCManaSend(lpObj->m_Index, (int)lpObj->Mana, 0xFF, 0, lpObj->BP);
		break;
	case ADD_OPTION_STRENGTH:
		lpObj->AddStrength += EffectValue;
		break;
	case ADD_OPTION_DEXTERITY:
		lpObj->AddDexterity += EffectValue;
		break;
	case ADD_OPTION_VITALITY:
		lpObj->AddVitality += EffectValue;
		break;
	case ADD_OPTION_ENERGY:
		lpObj->AddEnergy += EffectValue;
		break;
	case ADD_OPTION_LEADERSHIP:
		lpObj->AddLeadership += EffectValue;
		break;
	case ADD_OPTION_WIZARD_DEFENSE:
        lpObj->m_nSoulBarrierDefence = EffectValue;
        break;
	case ADD_OPTION_MAGIC_DEFENSE:
		lpObj->m_MagicDefense += EffectValue;
		break;
	case ADD_OPTION_REFLECT:
		lpObj->DamageReflect += EffectValue;
		break;
	case ADD_OPTION_ATTACK_RATE:
		lpObj->m_AttackRating -= EffectValue;
		break;
	case ADD_OPTION_WIZARD_DEFENSE_DURATION:
		lpObj->m_nSoulBarrierManaRate = EffectValue;
		break;
	case ADD_OPTION_CRITICAL_DAMAGE:
		lpObj->m_CriticalDamage += EffectValue;
		break;
	case ADD_OPTION_EXCELLENT_DAMAGE:
		lpObj->m_ExcelentDamage += EffectValue;
		break;
	case ADD_OPTION_BERSERKMANA:
        lpObj->AddMana += (int)(EffectValue * lpObj->MaxMana / 100.0);
        GCManaSend(lpObj->m_Index,(int)(lpObj->AddMana + lpObj->MaxMana),0xFEu,0,lpObj->AddBP + lpObj->MaxBP);
        GCManaSend(lpObj->m_Index, (int)lpObj->Mana, 0xFFu, 0, lpObj->BP);
        break;
	case ADD_OPTION_BERSERKLIFE:
		{
			float fAddLife = 0;
			float fPer = (((float)(40.0f) - (float)(EffectValue))/100.0f);

			fPer = (fPer > 0.1f)?fPer:0.1f;
			fAddLife = fPer * lpObj->MaxLife;

			lpObj->AddLife -= (int)((float)(fAddLife));
			lpObj->Life = ( (float)(lpObj->Life) < ( (float)(lpObj->AddLife) + (float)(lpObj->MaxLife) ) )?( (float)(lpObj->Life) ):( ( (float)(lpObj->AddLife) + (float)(lpObj->MaxLife) ) );

			GCReFillSend(lpObj->m_Index,(int)(lpObj->AddLife + lpObj->MaxLife),0xFEu,0,lpObj->iAddShield + lpObj->iMaxShield);
			GCReFillSend(lpObj->m_Index, (int)lpObj->Life, 0xFFu, 0, lpObj->iShield);
		}
		break;
	case ADD_OPTION_MAGICDAMAGEMIN:
		lpObj->m_MagicDamageMin += EffectValue;
		break;
	case ADD_OPTION_MAGICDAMAGEMAX:
		lpObj->m_MagicDamageMax += EffectValue;
		break;
	case ADD_OPTION_XMASATTACK:
		lpObj->m_AttackDamageMaxLeft += EffectValue;
		lpObj->m_AttackDamageMinLeft += EffectValue;
		lpObj->m_AttackDamageMaxRight += EffectValue;
		lpObj->m_AttackDamageMinRight += EffectValue;
		lpObj->m_MagicDamageMin += EffectValue;
		lpObj->m_MagicDamageMax += EffectValue;
		lpObj->m_CurseDamgeMin += EffectValue;
		lpObj->m_CurseDamgeMax += EffectValue;
		break;
	case ADD_OPTION_XMASDEFENSE:
		lpObj->m_Defense += EffectValue;
		break;
	case ADD_OPTION_LEVEL_BP:
		lpObj->AddBP += EffectValue * (lpObj->m_nMasterLevel + lpObj->Level);
		GCManaSend(lpObj->m_Index,(int)(lpObj->AddMana + lpObj->MaxMana),0xFEu,0,lpObj->AddBP + lpObj->MaxBP);
        GCManaSend(lpObj->m_Index, (int)lpObj->Mana, 0xFFu, 0, lpObj->BP);
		break;
	case ADD_OPTION_LEVEL_SD:
		lpObj->iAddShield += EffectValue * (lpObj->m_nMasterLevel + lpObj->Level);
		GCReFillSend(lpObj->m_Index,(int)(lpObj->AddLife + lpObj->MaxLife),0xFEu,0,lpObj->iAddShield + lpObj->iMaxShield);
        GCReFillSend(lpObj->m_Index, (int)lpObj->Life, 0xFFu, 0, lpObj->iShield);
		break;
	case ADD_OPTION_BP:
		lpObj->AddBP += EffectValue;
		GCManaSend(lpObj->m_Index,(int)(lpObj->AddMana + lpObj->MaxMana),0xFEu,0,lpObj->AddBP + lpObj->MaxBP);
        GCManaSend(lpObj->m_Index, (int)lpObj->Mana, 0xFFu, 0, lpObj->BP);
		break;
	case ADD_OPTION_SD:
		lpObj->iAddShield += EffectValue;
		GCReFillSend(lpObj->m_Index,(int)(lpObj->AddLife + lpObj->MaxLife),0xFEu,0,lpObj->iAddShield + lpObj->iMaxShield);
        GCReFillSend(lpObj->m_Index, (int)lpObj->Life, 0xFFu, 0, lpObj->iShield);
		break;
	case ADD_OPTION_IGNOREDEFENSE:
		lpObj->SetOpIgnoreDefense += EffectValue;
		break;
	case ADD_OPTION_SUCCESSFULBLOCKING:
		lpObj->m_SuccessfulBlocking += EffectValue;
		break;
	case SUB_OPTION_SUCCESSFULBLOCKING:
        lpObj->m_SuccessfulBlocking -= EffectValue;
        if ( lpObj->m_SuccessfulBlocking < 0 )
          lpObj->m_SuccessfulBlocking = 0;
        break;
	default:
		return;
	}
}
Exemplo n.º 13
0
void gObjCalCharacter(int aIndex)
{
		LPOBJ lpObj = &gObj[aIndex];
	int Strength = 0;
	int Dexterity = 0;
	int Vitality = 0;
	int Energy = 0;
	CItem * Right = &lpObj->pInventory[0];
	CItem * Left  = &lpObj->pInventory[1];
	CItem * Gloves = &lpObj->pInventory[5];
	CItem * Amulet = &lpObj->pInventory[9];
	CItem * Helper = &lpObj->pInventory[8];
	lpObj->HaveWeaponInHand = true;

	if ( Right->IsItem() == FALSE && Left->IsItem() == FALSE )
	{
		lpObj->HaveWeaponInHand = false;
	}
	else if ( Left->IsItem() == FALSE && Right->m_Type == ITEMGET(4,15) )	// Arrow
	{
		lpObj->HaveWeaponInHand = false;
	}
	else if ( Right->IsItem() == FALSE )
	{
		int iType = Left->m_Type / MAX_SUBTYPE_ITEMS;

		if ( Left->m_Type == ITEMGET(4,7) ) // Bolt
		{
			lpObj->HaveWeaponInHand = false;
		}
		else if ( iType == 6 )
		{
			lpObj->HaveWeaponInHand = false;
		}
	}

	lpObj->AddLife = 0;
	lpObj->AddMana = 0;
	lpObj->MonsterDieGetMoney = 0;
	lpObj->MonsterDieGetLife = 0;
	lpObj->MonsterDieGetMana = 0;
	lpObj->DamageReflect = 0;
	lpObj->DamageMinus = 0;
	lpObj->SkillLongSpearChange = false;

	if ( lpObj->m_iItemEffectValidTime > 0 )
	{
		g_ItemAddOption.PrevSetItemLastEffectForHallowin(lpObj);
	}

	int iItemIndex;
	BOOL bIsChangeItem;	// lc34

	for ( iItemIndex=0; iItemIndex<MAX_PLAYER_EQUIPMENT;iItemIndex++)
	{
		if ( lpObj->pInventory[iItemIndex].IsItem() != FALSE )
		{
			lpObj->pInventory[iItemIndex].m_IsValidItem = true;
		}
	}

	do
	{
		lpObj->SetOpAddMaxAttackDamage = 0;
		lpObj->SetOpAddMinAttackDamage = 0;
		lpObj->SetOpAddDamage = 0;
		lpObj->SetOpIncAGValue = 0;
		lpObj->SetOpAddCriticalDamageSuccessRate = 0;
		lpObj->SetOpAddCriticalDamage = 0;
		lpObj->SetOpAddExDamageSuccessRate = 0;
		lpObj->SetOpAddExDamage = 0;
		lpObj->SetOpAddSkillAttack = 0;
		lpObj->AddStrength = 0;
		lpObj->AddDexterity = 0;
		lpObj->AddVitality = 0;
		lpObj->AddEnergy = 0;
		lpObj->AddBP = 0;
		lpObj->iAddShield = 0;
		lpObj->SetOpAddAttackDamage = 0;
		lpObj->SetOpAddDefence = 0;
		lpObj->SetOpAddMagicPower = 0;
		lpObj->SetOpAddDefenceRate = 0;
		lpObj->SetOpIgnoreDefense = 0;
		lpObj->SetOpDoubleDamage = 0;
		lpObj->SetOpTwoHandSwordImproveDamage = 0;
		lpObj->SetOpImproveSuccessAttackRate = 0;
		lpObj->SetOpReflectionDamage = 0;
		lpObj->SetOpImproveSheldDefence = 0;
		lpObj->SetOpDecreaseAG = 0;
		lpObj->SetOpImproveItemDropRate = 0;
		lpObj->IsFullSetItem = false;

		memset(lpObj->m_AddResistance, 0, sizeof(lpObj->m_AddResistance));
		bIsChangeItem = 0;
		gObjCalcSetItemStat(lpObj);
		gObjCalcSetItemOption(lpObj);

		for (iItemIndex=0;iItemIndex<MAX_PLAYER_EQUIPMENT;iItemIndex++)
		{
			if ( lpObj->pInventory[iItemIndex].IsItem() != FALSE && lpObj->pInventory[iItemIndex].m_IsValidItem != false )
			{
				if ( gObjValidItem( lpObj, &lpObj->pInventory[iItemIndex], iItemIndex) != FALSE )
				{
					lpObj->pInventory[iItemIndex].m_IsValidItem = true;
				}
				else
				{
					lpObj->pInventory[iItemIndex].m_IsValidItem  = false;
					bIsChangeItem = TRUE;
				}
			}
		}
	}
	while ( bIsChangeItem != FALSE );

	Strength = lpObj->Strength + lpObj->AddStrength;
	Dexterity = lpObj->Dexterity + lpObj->AddDexterity;
	Vitality = lpObj->Vitality + lpObj->AddVitality;
	Energy = lpObj->Energy + lpObj->AddEnergy;

	if ( lpObj->Class == CLASS_ELF ) // Elf
	{
		if ( (Right->m_Type >= ITEMGET(4,8) && Right->m_Type < ITEMGET(4,15) ) ||
			 (Left->m_Type >= ITEMGET(4,0) && Left->m_Type < ITEMGET(4,7)) ||
			  Right->m_Type == ITEMGET(4,16) ||
			  Left->m_Type == ITEMGET(4,20) ||
			  Left->m_Type == ITEMGET(4,21) ||
			  Right->m_Type == ITEMGET(4,18) ||
			  Right->m_Type == ITEMGET(4,19) ||
			  Left->m_Type == ITEMGET(4,17) )
		{
			if ( (Right->IsItem() != FALSE && Right->m_IsValidItem == false) || (Left->IsItem() != FALSE && Left->m_IsValidItem == false) )
			{
				lpObj->m_AttackDamageMinRight = (Dexterity + Strength ) / 7;
				lpObj->m_AttackDamageMaxRight = (Dexterity + Strength ) / 4;
				lpObj->m_AttackDamageMinLeft = (Dexterity + Strength ) / 7;
				lpObj->m_AttackDamageMaxLeft = (Dexterity + Strength ) / 4;
			}
			else
			{
				lpObj->m_AttackDamageMinRight = (Dexterity / 7) + (Strength / 14);
				lpObj->m_AttackDamageMaxRight = (Dexterity / 4) + (Strength / 8 );
				lpObj->m_AttackDamageMinLeft = (Dexterity / 7) + (Strength / 14);
				lpObj->m_AttackDamageMaxLeft = (Dexterity / 4) + (Strength / 8 );
			}
		}
		else
		{
			lpObj->m_AttackDamageMinRight = (Dexterity + Strength) / 7;
			lpObj->m_AttackDamageMaxRight = (Dexterity + Strength) / 4;
			lpObj->m_AttackDamageMinLeft = (Dexterity + Strength) / 7;
			lpObj->m_AttackDamageMaxLeft = (Dexterity + Strength) / 4;
		}
	}
	else if ( lpObj->Class == CLASS_KNIGHT ) // Dark Knight
	{
		lpObj->m_AttackDamageMinRight = Strength / 6;
		lpObj->m_AttackDamageMaxRight = Strength / 4;
		lpObj->m_AttackDamageMinLeft = Strength / 6;
		lpObj->m_AttackDamageMaxLeft = Strength / 4;
	}
	else if (lpObj->Class == CLASS_MAGUMSA ) // MAgic Gladiator
	{
		lpObj->m_AttackDamageMinRight = (Strength / 6) + (Energy / 12);
		lpObj->m_AttackDamageMaxRight = (Strength / 4) + (Energy / 8);
		lpObj->m_AttackDamageMinLeft = (Strength / 6) + (Energy / 12);
		lpObj->m_AttackDamageMaxLeft = (Strength / 4) + (Energy / 8);
	}
	else if ( lpObj->Class == CLASS_DARKLORD ) // Dark Lord
	{
		lpObj->m_AttackDamageMinRight = (Strength / 7) + (Energy / 14);
		lpObj->m_AttackDamageMaxRight = (Strength / 5) + (Energy / 10);
		lpObj->m_AttackDamageMinLeft = (Strength / 7) + (Energy / 14);
		lpObj->m_AttackDamageMaxLeft = (Strength / 5) + (Energy / 10);
	}
	else if( lpObj->Class == CLASS_SUMMONER ) // Summoner
	{
		lpObj->m_AttackDamageMinRight = (Dexterity / 7) + (Strength / 7);
		lpObj->m_AttackDamageMaxRight = (Dexterity / 4) + (Strength / 4);
		lpObj->m_AttackDamageMinLeft = (Dexterity / 7) + (Strength / 7);
		lpObj->m_AttackDamageMaxLeft = (Dexterity / 4) + (Strength / 4);
	}

	else
	{
		lpObj->m_AttackDamageMinRight = (Strength / 8);
		lpObj->m_AttackDamageMaxRight = (Strength / 4);
		lpObj->m_AttackDamageMinLeft = (Strength / 8);
		lpObj->m_AttackDamageMaxLeft = (Strength / 4);
	}

	lpObj->pInventory[7].PlusSpecial(&lpObj->m_AttackDamageMinRight, 80);
	lpObj->pInventory[7].PlusSpecial(&lpObj->m_AttackDamageMaxRight, 80);
	lpObj->pInventory[7].PlusSpecial(&lpObj->m_AttackDamageMinLeft, 80);
	lpObj->pInventory[7].PlusSpecial(&lpObj->m_AttackDamageMaxLeft, 80);

	int AddLeadership = 0;

	if ( lpObj->pInventory[7].IsItem() != FALSE && lpObj->pInventory[7].m_IsValidItem != false)
	{
		AddLeadership += lpObj->pInventory[7].m_Leadership;
	}

	if ( Right->m_Type != -1 )
	{
		if ( Right->m_IsValidItem != false )
		{
			if ( Right->m_Type >= ITEMGET(5,0) && Right->m_Type <= ITEMGET(6,0) )
			{
				lpObj->m_AttackDamageMinRight += Right->m_DamageMin / 2;
				lpObj->m_AttackDamageMaxRight += Right->m_DamageMax / 2;
			}
			else
			{
				lpObj->m_AttackDamageMinRight += Right->m_DamageMin;
				lpObj->m_AttackDamageMaxRight += Right->m_DamageMax;
			}
		}

		if ( lpObj->pInventory[0].m_SkillChange != FALSE )
		{
			lpObj->SkillLongSpearChange = true;
		}

		lpObj->pInventory[0].PlusSpecial(&lpObj->m_AttackDamageMinRight, 80);
		lpObj->pInventory[0].PlusSpecial(&lpObj->m_AttackDamageMaxRight, 80);
	}
		
	if ( Left->m_Type != -1 )
	{
		if ( Left->m_IsValidItem != false)
		{
			lpObj->m_AttackDamageMinLeft += Left->m_DamageMin;
			lpObj->m_AttackDamageMaxLeft += Left->m_DamageMax;
		}

		lpObj->pInventory[1].PlusSpecial(&lpObj->m_AttackDamageMinLeft, 80);
		lpObj->pInventory[1].PlusSpecial(&lpObj->m_AttackDamageMaxLeft, 80);
	}

	lpObj->m_CriticalDamage = 0;
	lpObj->m_ExcelentDamage = 0;

	lpObj->pInventory[0].PlusSpecial(&lpObj->m_CriticalDamage, 84);
	lpObj->pInventory[1].PlusSpecial(&lpObj->m_CriticalDamage, 84);
	lpObj->pInventory[2].PlusSpecial(&lpObj->m_CriticalDamage, 84);
	lpObj->pInventory[3].PlusSpecial(&lpObj->m_CriticalDamage, 84);
	lpObj->pInventory[4].PlusSpecial(&lpObj->m_CriticalDamage, 84);
	lpObj->pInventory[5].PlusSpecial(&lpObj->m_CriticalDamage, 84);
	lpObj->pInventory[6].PlusSpecial(&lpObj->m_CriticalDamage, 84);
	lpObj->pInventory[7].PlusSpecial(&lpObj->m_CriticalDamage, 84);
	lpObj->m_MagicDamageMin = Energy / 9;
	lpObj->m_MagicDamageMax = Energy / 4;
	lpObj->pInventory[7].PlusSpecial(&lpObj->m_MagicDamageMin, 81);
	lpObj->pInventory[7].PlusSpecial(&lpObj->m_MagicDamageMax, 81);

	if ( Right->m_Type != -1 )
	{
		if ( lpObj->pInventory[0].m_Type == ITEMGET(0,31) ||
			 lpObj->pInventory[0].m_Type == ITEMGET(0,21) ||
			 lpObj->pInventory[0].m_Type == ITEMGET(0,23) ||
			 lpObj->pInventory[0].m_Type == ITEMGET(0,25) ) 
		{
			lpObj->pInventory[0].PlusSpecial(&lpObj->m_MagicDamageMin, 80);
			lpObj->pInventory[0].PlusSpecial(&lpObj->m_MagicDamageMax, 80);
		}
		else
		{
			lpObj->pInventory[0].PlusSpecial(&lpObj->m_MagicDamageMin, 81);
			lpObj->pInventory[0].PlusSpecial(&lpObj->m_MagicDamageMax, 81);
		}
	}

	lpObj->m_AttackRating = (Strength + Dexterity) / 2;
	lpObj->m_AttackRating += lpObj->pInventory[5].ItemDefense();

	if ( lpObj->Class == 2 ) // Elf
	{
		lpObj->m_AttackSpeed = Dexterity / 50;
		lpObj->m_MagicSpeed = Dexterity / 50;
	}
	else if ( lpObj->Class == 1 || lpObj->Class == 3) // Dark Knigh and MG
	{
		lpObj->m_AttackSpeed = Dexterity / 15;
		lpObj->m_MagicSpeed = Dexterity / 20;
	}
	else if ( lpObj->Class == 4 ) // DarkLord
	{
		lpObj->m_AttackSpeed = Dexterity / 10;
		lpObj->m_MagicSpeed = Dexterity / 10;
	}
	else if ( lpObj->Class == 5 ) // Summoner
	{
		lpObj->m_AttackSpeed = Dexterity / 15;
		lpObj->m_MagicSpeed = Dexterity / 20;
	}
	else
	{
		lpObj->m_AttackSpeed = Dexterity / 20;
		lpObj->m_MagicSpeed = Dexterity / 10;
	}

	bool bRight = false;
	bool bLeft = false;

	if ( Right->m_Type != ITEMGET(4,7) && Right->m_Type != ITEMGET(4,15) && Right->m_Type >= ITEMGET(0,0) && Right->m_Type < ITEMGET(6,0) )
	{
		if ( Right->m_IsValidItem != false )
		{
			bRight = true;
		}
	}

	if ( Left->m_Type != ITEMGET(4,7) && Left->m_Type != ITEMGET(4,15) && Left->m_Type >= ITEMGET(0,0) && Left->m_Type < ITEMGET(6,0) )
	{
		if ( Left->m_IsValidItem != false )
		{
			bLeft = true;
		}
	}

	if ( bRight != false && bLeft != false )
	{
		lpObj->m_AttackSpeed += (Right->m_AttackSpeed + Left->m_AttackSpeed)/2;
		lpObj->m_MagicSpeed += (Right->m_AttackSpeed + Left->m_AttackSpeed)/2;
	}
	else if ( bRight!= false )
	{
		lpObj->m_AttackSpeed += Right->m_AttackSpeed;
		lpObj->m_MagicSpeed += Right->m_AttackSpeed;
	}
	else if ( bLeft != false )
	{
		lpObj->m_AttackSpeed += Left->m_AttackSpeed;
		lpObj->m_MagicSpeed += Left->m_AttackSpeed;
	}

	if ( Gloves->m_Type != -1 )
	{
		if ( Gloves->m_IsValidItem != false )
		{
			lpObj->m_AttackSpeed += Gloves->m_AttackSpeed;
			lpObj->m_MagicSpeed += Gloves->m_AttackSpeed;
		}
	}

	if ( Helper->m_Type != -1 )
	{
		if ( Helper->m_IsValidItem != false )
		{
			lpObj->m_AttackSpeed += Helper->m_AttackSpeed;
			lpObj->m_MagicSpeed += Helper->m_AttackSpeed;
		}
	}

	if ( Amulet->m_Type != -1 )
	{
		if ( Amulet->m_IsValidItem != false )
		{
			lpObj->m_AttackSpeed += Amulet->m_AttackSpeed;
			lpObj->m_MagicSpeed += Amulet->m_AttackSpeed;
		}
	}

	// Wizard Ring effect
	if ( (lpObj->pInventory[10].IsItem() == TRUE && lpObj->pInventory[10].m_Type == ITEMGET(13,20) && lpObj->pInventory[10].m_Level == 0 && lpObj->pInventory[10].m_Durability > 0.0f ) || (lpObj->pInventory[11].IsItem() == TRUE && lpObj->pInventory[11].m_Type == ITEMGET(13,20) && lpObj->pInventory[11].m_Level == 0 && lpObj->pInventory[11].m_Durability > 0.0f ) )
	{
		lpObj->m_AttackDamageMinRight += lpObj->m_AttackDamageMinRight * 10 / 100;
		lpObj->m_AttackDamageMaxRight += lpObj->m_AttackDamageMaxRight * 10 / 100;
		lpObj->m_AttackDamageMinLeft += lpObj->m_AttackDamageMinLeft * 10 / 100;
		lpObj->m_AttackDamageMaxLeft += lpObj->m_AttackDamageMaxLeft * 10 / 100;
		lpObj->m_MagicDamageMin += lpObj->m_MagicDamageMin * 10 / 100;
		lpObj->m_MagicDamageMax += lpObj->m_MagicDamageMax * 10 / 100;
		lpObj->m_AttackSpeed += 10;
		lpObj->m_MagicSpeed += 10;
	}

	if ( lpObj->Class == CLASS_WIZARD ) // Dark Wizard;
	{
		lpObj->m_DetectSpeedHackTime = (gAttackSpeedTimeLimit - (lpObj->m_MagicSpeed*2 * gDecTimePerAttackSpeed) );
	}
	else
	{
		lpObj->m_DetectSpeedHackTime = (gAttackSpeedTimeLimit - (lpObj->m_AttackSpeed * gDecTimePerAttackSpeed) );
	}

	if ( lpObj->m_DetectSpeedHackTime < gMinimumAttackSpeedTime )
	{
		lpObj->m_DetectSpeedHackTime = gMinimumAttackSpeedTime;
	}

	if ( lpObj->Class == 2 ) // elf
	{
		lpObj->m_SuccessfulBlocking = Dexterity / 4;
	}
	else if ( lpObj->Class == 4 ) // DL
	{
		lpObj->m_SuccessfulBlocking = Dexterity / 7;
	}
	else
	{
		lpObj->m_SuccessfulBlocking = Dexterity / 3;
	}

	if ( Left->m_Type != -1 )
	{
		if ( Left->m_IsValidItem != false )
		{
			lpObj->m_SuccessfulBlocking += Left->m_SuccessfulBlocking;
			lpObj->pInventory[1].PlusSpecial(&lpObj->m_SuccessfulBlocking, 82);
		}
	}

	bool Success = true;

	if ( lpObj->Class == CLASS_MAGUMSA ) // MG
	{
		for ( int j=3;j<=6;j++)
		{
			if ( lpObj->pInventory[j].m_Type == -1 )
			{
				Success = false;
				break;
			}

			if ( lpObj->pInventory[j].m_IsValidItem == false )
			{
				Success = false;
				break;
			}
		}
	}
	else
	{
		for  ( int k=2;k<=6;k++)
		{
			if ( lpObj->pInventory[k].m_Type == -1 )
			{
				Success = false;
				break;
			}

			if ( lpObj->pInventory[k].m_IsValidItem == false )
			{
				Success = false;
				break;
			}
		}
	}

	int Level11Count = 0;
	int Level10Count = 0;
	int Level12Count = 0;
	int Level13Count = 0;
	int Level14Count = 0;
	int Level15Count = 0;
	if ( Success != false )
	{
		int in;

		if ( lpObj->Class == CLASS_MAGUMSA ) // MG
		{
			in = lpObj->pInventory[3].m_Type % MAX_SUBTYPE_ITEMS;

			if ( in != ITEMGET(0,15) &&
				 in != ITEMGET(0,20) &&
				 in != ITEMGET(0,23) &&
				 in != ITEMGET(0,33) &&
				 in != ITEMGET(0,32) &&
				 in != ITEMGET(0,37) )
			{
				Success = false;
			}
			else
			{
				Level13Count++;

				for (int m=3;m<=6;m++)
				{
					if ( in != ( lpObj->pInventory[m].m_Type % MAX_SUBTYPE_ITEMS) )
					{
						Success = false;
					}
					if ( lpObj->pInventory[m].m_Level > 14)
					{
						Level15Count++;
					}
					else if ( lpObj->pInventory[m].m_Level > 13)
					{
						Level14Count++;
					}
					else if ( lpObj->pInventory[m].m_Level > 12 )
					{
						Level13Count++;
					}
					else if ( lpObj->pInventory[m].m_Level > 11 )
					{
						Level12Count++;
					}
					else if ( lpObj->pInventory[m].m_Level > 10 )
					{
						Level11Count++;
					}
					else if ( lpObj->pInventory[m].m_Level > 9 )
					{
						Level10Count++;
					}
				}
			}
		}
		else
		{
			in = lpObj->pInventory[2].m_Type % MAX_SUBTYPE_ITEMS;

			for (int m=2;m<=6;m++)
			{
				if ( in !=  ( lpObj->pInventory[m].m_Type % MAX_SUBTYPE_ITEMS) )
				{
					Success = false;
				}

				if ( lpObj->pInventory[m].m_Level > 14)
				{
					Level15Count++;
				}
				else if ( lpObj->pInventory[m].m_Level > 13)
				{
					Level14Count++;
				}
				else if ( lpObj->pInventory[m].m_Level > 12 )
				{
					Level13Count++;
				}
				else if ( lpObj->pInventory[m].m_Level > 11 )
				{
					Level12Count++;
				}
				else if ( lpObj->pInventory[m].m_Level > 10 )
				{
					Level11Count++;
				}
				else if ( lpObj->pInventory[m].m_Level > 9 )
				{
					Level10Count++;
				}
			}
		}

		if ( Success != false )	// #warning unuseful if
		{
			lpObj->m_SuccessfulBlocking += lpObj->m_SuccessfulBlocking / 10;
		}
	}

	if ( lpObj->Class == CLASS_ELF ) // Elf
	{
		lpObj->m_Defense = Dexterity / 10;
	}
	else if ( lpObj->Class == 1 ) // DK
	{
		lpObj->m_Defense = Dexterity / 3;
	}
	else if ( lpObj->Class == 4 ) // DL
	{
		lpObj->m_Defense = Dexterity / 7;
	}
	else if ( lpObj->Class == 5 ) // SU
	{
		lpObj->m_Defense = Dexterity / 3;
	}
	else
	{
		lpObj->m_Defense = Dexterity / 4;
	}

	lpObj->m_Defense += lpObj->pInventory[2].ItemDefense();
	lpObj->m_Defense += lpObj->pInventory[3].ItemDefense();
	lpObj->m_Defense += lpObj->pInventory[4].ItemDefense();
	lpObj->m_Defense += lpObj->pInventory[5].ItemDefense();
	lpObj->m_Defense += lpObj->pInventory[6].ItemDefense();
	lpObj->m_Defense += lpObj->pInventory[1].ItemDefense();
	lpObj->m_Defense += lpObj->pInventory[7].ItemDefense();

	if ( lpObj->pInventory[8].IsItem() != FALSE )
	{
		if ( lpObj->pInventory[8].m_Type == ITEMGET(13,4) && lpObj->pInventory[8].m_Durability > 0.0f )	// Dark Horse
		{
			lpObj->m_Defense += INT( Dexterity / 20 + 5 + Helper->m_PetItem_Level * 2 );
		}
	}

	if ( (Level13Count + Level12Count + Level11Count + Level10Count + Level14Count + Level15Count ) >= 5 )
	{
		if ( Success != false )
		{
			if( Level15Count == 5)
			{
				lpObj->m_Defense += lpObj->m_Defense * 30 / 100;
			}
			else if( Level14Count == 5)
			{
				lpObj->m_Defense += lpObj->m_Defense * 25 / 100;
			}
			else if ( Level13Count == 5 )
			{
				lpObj->m_Defense += lpObj->m_Defense * 20 / 100;
			}
			else if ( Level12Count == 5 || (Level12Count + Level13Count) == 5 )
			{
				lpObj->m_Defense += lpObj->m_Defense * 15 / 100;
			}
			else if ( Level11Count == 5 || (Level11Count + Level12Count + Level13Count) == 5 )
			{
				lpObj->m_Defense += lpObj->m_Defense * 10 / 100;
			}
			else if ( Level10Count == 5 || (Level10Count + Level11Count + Level12Count + Level13Count) == 5)
			{
				lpObj->m_Defense += lpObj->m_Defense * 5 / 100;
			}
		}
	}

	lpObj->m_Defense = lpObj->m_Defense * 10 / 20;

	if ( lpObj->m_Change == 9 )
	{

	}
	else if ( lpObj->m_Change == 41 )
	{
		lpObj->AddLife = ((int)(lpObj->MaxLife * 20.0f))/100;
	}
	else if ( lpObj->m_Change == 372 )
	{
		lpObj->m_Defense += lpObj->m_Defense / 10;
		lpObj->AddLife += lpObj->Level;
	}
	else if ( lpObj->m_Change == 374 )
	{
		lpObj->m_AttackDamageMinRight += lpObj->m_AttackDamageMinRight * 20 / 100;
		lpObj->m_AttackDamageMaxRight += lpObj->m_AttackDamageMaxRight * 20 / 100;
		lpObj->m_AttackDamageMinLeft += lpObj->m_AttackDamageMinLeft * 20 / 100;
		lpObj->m_AttackDamageMaxLeft += lpObj->m_AttackDamageMaxLeft * 20 / 100;
		lpObj->m_MagicDamageMin += lpObj->m_MagicDamageMin * 20 / 100;
		lpObj->m_MagicDamageMax += lpObj->m_MagicDamageMax * 20 / 100;
	}
	else if ( lpObj->m_Change == 378 )
	{
		lpObj->m_AddResistance[R_ICE] += (char)255;
		lpObj->m_AddResistance[R_POISON] += (char)255;
		lpObj->m_AddResistance[R_LIGHTNING] += (char)255;
		lpObj->m_AddResistance[R_FIRE] += (char)255;
		lpObj->m_AddResistance[R_EARTH] += (char)255;
		lpObj->m_AddResistance[R_WIND] += (char)255;
		lpObj->m_AddResistance[R_WATER] += (char)255;
	}

	if ( lpObj->pInventory[8].m_Type == ITEMGET(13,0) )
	{
		lpObj->AddLife += 50;
	}

	if ( lpObj->pInventory[8].m_Type == ITEMGET(13,37) && lpObj->pInventory[8].m_NewOption == 4 && lpObj->pInventory[8].m_Durability > 0.0f ) //Golden Fenrir Attribute
	{
		lpObj->AddLife += 200;	//Life +200
		lpObj->AddMana += 200;	//Mana +200
		
		/*
		//Attack Power Already Coded on zzzitem.cpp
		lpObj->m_AttackDamageMaxLeft += lpObj->m_AttackDamageMaxLeft * 33 / 100; //Attack Power +33
		lpObj->m_AttackDamageMinLeft += lpObj->m_AttackDamageMinLeft * 33 / 100; //Attack Power +33
		lpObj->m_AttackDamageMaxRight += lpObj->m_AttackDamageMaxRight * 33 / 100; //Attack Power +33
		lpObj->m_AttackDamageMinRight += lpObj->m_AttackDamageMinRight * 33 / 100; //Attack Power +33
		*/

		lpObj->m_MagicDamageMin += lpObj->m_MagicDamageMin * 16 / 100; //Wizardry +16
		lpObj->m_MagicDamageMax += lpObj->m_MagicDamageMax * 16 / 100; //Wizardry +16
	}

	int addlife = 0;
	int addmana = 0;

	if ( lpObj->pInventory[7].m_Type >= ITEMGET(12,0) && lpObj->pInventory[7].m_Type <= ITEMGET(12,6) || lpObj->pInventory[7].m_Type == ITEMGET(13,30) ) //Third Wings Fix Applied
	{
	lpObj->pInventory[7].PlusSpecial(&addlife, 100);
	lpObj->pInventory[7].PlusSpecial(&addmana, 101);
	lpObj->pInventory[7].PlusSpecial(&AddLeadership, 105);
	lpObj->AddLeadership = AddLeadership;
	lpObj->AddLife += addlife;
	lpObj->AddMana += addmana;
	}

	if ( lpObj->pInventory[8].m_Type == ITEMGET(13,3) )
	{
		lpObj->pInventory[8].PlusSpecial(&lpObj->AddBP, 103 );
	}

	if ( lpObj->Type == OBJ_USER )
	{
		gDarkSpirit[lpObj->m_Index].Set(lpObj->m_Index, &lpObj->pInventory[1]);
	}

	lpObj->pInventory[9].PlusSpecialPercentEx(&lpObj->AddBP, lpObj->MaxBP, 173);
	lpObj->pInventory[10].PlusSpecialPercentEx(&lpObj->AddMana, lpObj->MaxMana, 172);
	lpObj->pInventory[11].PlusSpecialPercentEx(&lpObj->AddMana, lpObj->MaxMana, 172);

	CItem * rItem[3];
	int comparecount = 0;
	
	rItem[0] = &lpObj->pInventory[10];
	rItem[1] = &lpObj->pInventory[11];
	rItem[2] = &lpObj->pInventory[9];

#define GET_MAX_RESISTANCE(x,y,z) ( ( ( ( (x) > (y) ) ? (x) : (y) ) > (z) ) ? ( ( (x) > (y) ) ? (x) : (y) ) : (z) )	

	lpObj->m_Resistance[1] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[1], rItem[1]->m_Resistance[1], rItem[2]->m_Resistance[1]);
	lpObj->m_Resistance[0] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[0], rItem[1]->m_Resistance[0], rItem[2]->m_Resistance[0]);
	lpObj->m_Resistance[2] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[2], rItem[1]->m_Resistance[2], rItem[2]->m_Resistance[2]);
	lpObj->m_Resistance[3] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[3], rItem[1]->m_Resistance[3], rItem[2]->m_Resistance[3]);
	lpObj->m_Resistance[4] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[4], rItem[1]->m_Resistance[4], rItem[2]->m_Resistance[4]);
	lpObj->m_Resistance[5] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[5], rItem[1]->m_Resistance[5], rItem[2]->m_Resistance[5]);
	lpObj->m_Resistance[6] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[6], rItem[1]->m_Resistance[6], rItem[2]->m_Resistance[6]);


	g_kItemSystemFor380.ApplyFor380Option(lpObj);
	g_kJewelOfHarmonySystem.SetApplyStrengthenItem(lpObj);
	//BuffEffectC.InitEffect(lpObj);
	MasterLevelSystem.SetObjEffect(lpObj->m_Index);
	gItemSocket.ApplyEffect(lpObj->m_Index);
	GObjExtItemApply(lpObj);
	gObjSetItemApply(lpObj);
	gObjNextExpCal(lpObj);

	if ( (Left->m_Type >= ITEMGET(4,0) && Left->m_Type < ITEMGET(4,7) ) ||
		  Left->m_Type == ITEMGET(4,17) ||
		  Left->m_Type == ITEMGET(4,20) ||
		  Left->m_Type == ITEMGET(4,21) ||
		  Left->m_Type == ITEMGET(4,22)  )
	{
		if ( Right->m_Type == ITEMGET(4,15) && Right->m_Level == 1 )
		{
			lpObj->m_AttackDamageMinLeft += (WORD)(lpObj->m_AttackDamageMinLeft * 0.03f + 1.0f);
			lpObj->m_AttackDamageMaxLeft += (WORD)(lpObj->m_AttackDamageMaxLeft * 0.03f + 1.0f);
		}
		else if ( Right->m_Type == ITEMGET(4,15) && Right->m_Level == 2 )
		{
			lpObj->m_AttackDamageMinLeft += (WORD)(lpObj->m_AttackDamageMinLeft * 0.05f + 1.0f);
			lpObj->m_AttackDamageMaxLeft += (WORD)(lpObj->m_AttackDamageMaxLeft * 0.05f + 1.0f);
		}
	}
	else if ( (Right->m_Type >= ITEMGET(4,8) && Right->m_Type < ITEMGET(4,15) ) ||
		      (Right->m_Type >= ITEMGET(4,16) && Right->m_Type < ITEMGET(5,0)) )
	{
		if ( Left->m_Type == ITEMGET(4,7) && Left->m_Level == 1 )
		{
				lpObj->m_AttackDamageMinRight += (WORD)(lpObj->m_AttackDamageMinRight * 0.03f + 1.0f);
				lpObj->m_AttackDamageMaxRight += (WORD)(lpObj->m_AttackDamageMaxRight * 0.03f + 1.0f);
		}
		else if ( Left->m_Type == ITEMGET(4,7) && Left->m_Level == 2 )
		{
				lpObj->m_AttackDamageMinRight += (WORD)(lpObj->m_AttackDamageMinRight * 0.05f + 1.0f);
				lpObj->m_AttackDamageMaxRight += (WORD)(lpObj->m_AttackDamageMaxRight * 0.05f + 1.0f);
		}
	}

	if ( lpObj->Class == CLASS_KNIGHT || lpObj->Class == CLASS_MAGUMSA || lpObj->Class == CLASS_DARKLORD  )
	{
		if ( Right->m_Type != -1 && Left->m_Type != -1 )
		{
			if ( Right->m_Type >= ITEMGET(0,0) && Right->m_Type < ITEMGET(4,0) && Left->m_Type >= ITEMGET(0,0) && Left->m_Type < ITEMGET(4,0) )
			{
				lpObj->m_AttackDamageMinRight = lpObj->m_AttackDamageMinRight * 55 / 100;
				lpObj->m_AttackDamageMaxRight = lpObj->m_AttackDamageMaxRight * 55 / 100;
				lpObj->m_AttackDamageMinLeft = lpObj->m_AttackDamageMinLeft * 55 / 100;
				lpObj->m_AttackDamageMaxLeft = lpObj->m_AttackDamageMaxLeft * 55 / 100;
			}
		}
	}

	if ( lpObj->m_iItemEffectValidTime > 0 )
	{
		g_ItemAddOption.NextSetItemLastEffectForHallowin(lpObj);
	}

	if(Helper->m_Type == ITEMGET(13,64))
	{
		lpObj->m_AttackDamageMin += (lpObj->m_AttackDamageMin/100) * 40;
		lpObj->m_AttackDamageMax += (lpObj->m_AttackDamageMax/100) * 40;

		lpObj->m_AttackDamageMinRight += (lpObj->m_AttackDamageMinRight*40) / 100;
		lpObj->m_AttackDamageMaxRight += (lpObj->m_AttackDamageMaxRight*40) / 10;
		lpObj->m_AttackDamageMinLeft += (lpObj->m_AttackDamageMinLeft*40) / 100;
		lpObj->m_AttackDamageMaxLeft += (lpObj->m_AttackDamageMaxLeft*40) / 100;
		lpObj->m_MagicDamageMin += (lpObj->m_MagicDamageMin*40) / 100;
		lpObj->m_MagicDamageMax += (lpObj->m_MagicDamageMax*40) / 100;
		lpObj->m_AttackSpeed += 10;
		lpObj->m_MagicSpeed += 10;
	}
	else if(Helper->m_Type == ITEMGET(13,65))
	{
		//lpObj->AddLife += 50;
		lpObj->m_Defense += lpObj->m_Defense * (30 / 100);
	}
	else if(Helper->m_Type == ITEMGET(13,106))
	{
		lpObj->m_Defense += 50;
	}
	else if(Helper->m_Type == ITEMGET(13,123))
	{
		lpObj->m_AttackDamageMin += (lpObj->m_AttackDamageMin/100) * 40;
		lpObj->m_AttackDamageMax += (lpObj->m_AttackDamageMax/100) * 40;
		lpObj->m_AttackDamageMinRight += (lpObj->m_AttackDamageMinRight/100) * 40;
		lpObj->m_AttackDamageMaxRight += (lpObj->m_AttackDamageMaxRight/100) * 40;
		lpObj->m_AttackDamageMinLeft += (lpObj->m_AttackDamageMinLeft/100) * 40;
		lpObj->m_AttackDamageMaxLeft += (lpObj->m_AttackDamageMaxLeft/100) * 40;
		lpObj->m_MagicDamageMin += (lpObj->m_MagicDamageMin/100) * 40;
		lpObj->m_MagicDamageMax += (lpObj->m_MagicDamageMax/100) * 40;
		lpObj->m_AttackSpeed += 10;
		lpObj->m_MagicSpeed += 10;
	}

	gObjCalcShieldPoint(lpObj);

	if ( lpObj->iShield > ( lpObj->iMaxShield + lpObj->iAddShield ) )
	{
		lpObj->iShield = lpObj->iMaxShield + lpObj->iAddShield ;
		GCReFillSend(lpObj->m_Index, lpObj->Life, 0xFF, 0, lpObj->iShield);
	}
/*	if(lpObj->m_SkillSwordPowerTime != 0)
	{
		lpObj->AddLife = (lpObj->AddLife * lpObj->m_SkillSwordPowerDec)/100;
		lpObj->m_Defense = (lpObj->m_Defense * lpObj->m_SkillSwordPowerDec)/100;
		lpObj->AddMana = lpObj->AddMana * lpObj->m_SkillSwordPowerInc;
		lpObj->m_AttackDamageMinRight = lpObj->m_AttackDamageMinRight * lpObj->m_SkillSwordPowerInc;
		lpObj->m_AttackDamageMaxRight = lpObj->m_AttackDamageMaxRight * lpObj->m_SkillSwordPowerInc;
		lpObj->m_AttackDamageMinLeft = lpObj->m_AttackDamageMinLeft * lpObj->m_SkillSwordPowerInc;
		lpObj->m_AttackDamageMaxLeft = lpObj->m_AttackDamageMaxLeft * lpObj->m_SkillSwordPowerInc;
		lpObj->m_MagicDamageMin = lpObj->m_MagicDamageMin * lpObj->m_SkillSwordPowerInc;
		lpObj->m_MagicDamageMax = lpObj->m_MagicDamageMax * lpObj->m_SkillSwordPowerInc;
	}*/
		
	GCReFillSend(lpObj->m_Index, lpObj->MaxLife + lpObj->AddLife, 0xFE, 0, lpObj->iMaxShield + lpObj->iAddShield);
	GCManaSend(lpObj->m_Index, lpObj->MaxMana + lpObj->AddMana, 0xFE, 0, lpObj->MaxBP + lpObj->AddBP);
}
Exemplo n.º 14
0
// ----------------------------------------------------------------------------------------------
void CSpecialItem::ApplyEffect(LPOBJ lpObj,char Type,int Item)
{
	int CountPos = -1;

	CountPos = gSpecialItem.SearchItemPos(Item,Type);

	if ( CountPos == -1 )
	{
		return;
	}

	if ( lpObj->SpecialBuff[Type] == 1 )
	{
		gSpecialItem.RemoveEffect(lpObj,Type,Item);
	}

	if ( gSpecialItem.EffectType1[Type][CountPos] != -1 )
	{
		switch ( gSpecialItem.EffectType1[Type][CountPos] )
		{
		case INCREASE_MAX_MANA:
			lpObj->AddMana += gSpecialItem.EffectValue1[Type][CountPos];
			GCManaSend(lpObj->m_Index,lpObj->MaxMana+lpObj->AddMana,0xFE,0,lpObj->MaxBP+lpObj->AddBP);
			break;
		case INCREASE_MAX_AG:
			lpObj->AddBP += gSpecialItem.EffectValue1[Type][CountPos];
			GCManaSend(lpObj->m_Index,lpObj->MaxMana+lpObj->AddMana,0xFE,0,lpObj->MaxBP+lpObj->AddBP);
			break;
		case INCREASE_MAX_LIFE:
			lpObj->AddLife += gSpecialItem.EffectValue1[Type][CountPos];
			GCReFillSend(lpObj->m_Index,lpObj->MaxLife+lpObj->AddLife,0xFE,0,lpObj->iMaxShield+lpObj->iAddShield);
			break;
		case INCREASE_MAX_SD:
			lpObj->iAddShield += gSpecialItem.EffectValue1[Type][CountPos];
			GCReFillSend(lpObj->m_Index,lpObj->MaxLife+lpObj->AddLife,0xFE,0,lpObj->iMaxShield+lpObj->iAddShield);
			break;
		case INCREASE_DROP_RATE:
			break;
		case INCREASE_EXE_DMG:
			lpObj->m_ExcelentDamage += gSpecialItem.EffectValue1[Type][CountPos];
			break;
		case INCREASE_CRITICAL_DMG:
			lpObj->m_CriticalDamage += gSpecialItem.EffectValue1[Type][CountPos];
			break;
		case INCREASE_LIFE_AUTORECOVERY:
			break;
		case INCREASE_EXP_RATE:
			break;
		case INCREASE_ATTACK_DMG:
			lpObj->m_AttackDamageLeft += gSpecialItem.EffectValue1[Type][CountPos];
			lpObj->m_AttackDamageRight += gSpecialItem.EffectValue1[Type][CountPos];
			lpObj->m_AttackDamageMin += gSpecialItem.EffectValue1[Type][CountPos];
			lpObj->m_AttackDamageMax += gSpecialItem.EffectValue1[Type][CountPos];
			lpObj->m_AttackDamageMinLeft += gSpecialItem.EffectValue1[Type][CountPos];
			lpObj->m_AttackDamageMaxLeft += gSpecialItem.EffectValue1[Type][CountPos];
			lpObj->m_AttackDamageMinRight += gSpecialItem.EffectValue1[Type][CountPos];
			lpObj->m_AttackDamageMaxRight += gSpecialItem.EffectValue1[Type][CountPos];
			break;
		case INCREASE_DEFENSE:
			lpObj->m_Defense += gSpecialItem.EffectValue1[Type][CountPos];
			break;
		case INCREASE_MANA_AUTORECOVERY:
			break;
		case INCREASE_ATTACK_SPEED:
			lpObj->m_AttackSpeed += gSpecialItem.EffectValue1[Type][CountPos];
			lpObj->m_MagicSpeed += gSpecialItem.EffectValue1[Type][CountPos];
			break;
		case DISABLE_EXP:
			break;
		case ENABLE_MOBILITY:
			break;
		case INCREASE_WIZARDY_DMG:
			lpObj->m_MagicDamageMax += gSpecialItem.EffectValue1[Type][CountPos];
			lpObj->m_MagicDamageMin += gSpecialItem.EffectValue1[Type][CountPos];
			break;
		case INCREASE_STRENGHT:
			lpObj->AddStrength += gSpecialItem.EffectValue1[Type][CountPos];
			break;
		case INCREASE_AGILITY:
			lpObj->AddDexterity += gSpecialItem.EffectValue1[Type][CountPos];
			break;
		case INCREASE_HEALTH:
			lpObj->AddVitality += gSpecialItem.EffectValue1[Type][CountPos];
			break;
		case INCREASE_ENERGY:
			lpObj->AddEnergy += gSpecialItem.EffectValue1[Type][CountPos];
			break;
		case INCREASE_LEADERSHIP:
			lpObj->AddLeadership += gSpecialItem.EffectValue1[Type][CountPos];
			break;
		}
	}

	if ( gSpecialItem.EffectType2[Type][CountPos] != -1 )
	{
		switch ( gSpecialItem.EffectType2[Type][CountPos] )
		{
		case INCREASE_MAX_MANA:
			lpObj->AddMana += gSpecialItem.EffectValue2[Type][CountPos];
			GCManaSend(lpObj->m_Index,lpObj->MaxMana+lpObj->AddMana,0xFE,0,lpObj->MaxBP+lpObj->AddBP);
			break;
		case INCREASE_MAX_AG:
			lpObj->AddBP += gSpecialItem.EffectValue2[Type][CountPos];
			GCManaSend(lpObj->m_Index,lpObj->MaxMana+lpObj->AddMana,0xFE,0,lpObj->MaxBP+lpObj->AddBP);
			break;
		case INCREASE_MAX_LIFE:
			lpObj->AddLife += gSpecialItem.EffectValue2[Type][CountPos];
			GCReFillSend(lpObj->m_Index,lpObj->MaxLife+lpObj->AddLife,0xFE,0,lpObj->iMaxShield+lpObj->iAddShield);
			break;
		case INCREASE_MAX_SD:
			lpObj->iAddShield += gSpecialItem.EffectValue2[Type][CountPos];
			GCReFillSend(lpObj->m_Index,lpObj->MaxLife+lpObj->AddLife,0xFE,0,lpObj->iMaxShield+lpObj->iAddShield);
			break;
		case INCREASE_DROP_RATE:
			break;
		case INCREASE_EXE_DMG:
			lpObj->m_ExcelentDamage += gSpecialItem.EffectValue2[Type][CountPos];
			break;
		case INCREASE_CRITICAL_DMG:
			lpObj->m_CriticalDamage += gSpecialItem.EffectValue2[Type][CountPos];
			break;
		case INCREASE_LIFE_AUTORECOVERY:
			break;
		case INCREASE_EXP_RATE:
			break;
		case INCREASE_ATTACK_DMG:
			lpObj->m_AttackDamageLeft += gSpecialItem.EffectValue2[Type][CountPos];
			lpObj->m_AttackDamageRight += gSpecialItem.EffectValue2[Type][CountPos];
			lpObj->m_AttackDamageMin += gSpecialItem.EffectValue2[Type][CountPos];
			lpObj->m_AttackDamageMax += gSpecialItem.EffectValue2[Type][CountPos];
			lpObj->m_AttackDamageMinLeft += gSpecialItem.EffectValue2[Type][CountPos];
			lpObj->m_AttackDamageMaxLeft += gSpecialItem.EffectValue2[Type][CountPos];
			lpObj->m_AttackDamageMinRight += gSpecialItem.EffectValue2[Type][CountPos];
			lpObj->m_AttackDamageMaxRight += gSpecialItem.EffectValue2[Type][CountPos];
			break;
		case INCREASE_DEFENSE:
			lpObj->m_Defense += gSpecialItem.EffectValue2[Type][CountPos];
			break;
		case INCREASE_MANA_AUTORECOVERY:
			break;
		case INCREASE_ATTACK_SPEED:
			lpObj->m_AttackSpeed += gSpecialItem.EffectValue2[Type][CountPos];
			lpObj->m_MagicSpeed += gSpecialItem.EffectValue2[Type][CountPos];
			break;
		case DISABLE_EXP:
			break;
		case ENABLE_MOBILITY:
			break;
		case INCREASE_WIZARDY_DMG:
			lpObj->m_MagicDamageMax += gSpecialItem.EffectValue2[Type][CountPos];
			lpObj->m_MagicDamageMin += gSpecialItem.EffectValue2[Type][CountPos];
			break;
		case INCREASE_STRENGHT:
			lpObj->AddStrength += gSpecialItem.EffectValue2[Type][CountPos];
			break;
		case INCREASE_AGILITY:
			lpObj->AddDexterity += gSpecialItem.EffectValue2[Type][CountPos];
			break;
		case INCREASE_HEALTH:
			lpObj->AddVitality += gSpecialItem.EffectValue2[Type][CountPos];
			break;
		case INCREASE_ENERGY:
			lpObj->AddEnergy += gSpecialItem.EffectValue2[Type][CountPos];
			break;
		case INCREASE_LEADERSHIP:
			lpObj->AddLeadership += gSpecialItem.EffectValue2[Type][CountPos];
			break;

		}
	}
	lpObj->SpecialBuff[Type] = 1;
	lpObj->SpecialBuffEffectType1[Type] = gSpecialItem.EffectType1[Type][CountPos];
	lpObj->SpecialBuffEffectValue1[Type] = gSpecialItem.EffectValue1[Type][CountPos];
	lpObj->SpecialBuffEffectType2[Type] = gSpecialItem.EffectType2[Type][CountPos];
	lpObj->SpecialBuffEffectValue2[Type] = gSpecialItem.EffectValue2[Type][CountPos];
	if ( gSpecialItem.BuffTime[Type][CountPos] != 0 )
	{
		lpObj->SpecialBuffEffectTime[Type] = gSpecialItem.BuffTime[Type][CountPos];
	}
	if ( gSpecialItem.BuffNumber[Type][CountPos] != -1 )
	{
		GCStateInfoSend(lpObj,1,gSpecialItem.BuffNumber[Type][CountPos]);
	}
	lpObj->SpecialBuffItem[Type] = Item;
	
}
Exemplo n.º 15
0
// ----------------------------------------------------------------------------------------------
void CSpecialItem::RemoveEffect(LPOBJ lpObj, char Type, int Item)
{
	if ( lpObj->SpecialBuff[Type] == 0 )
	{
		return;
	}

	int CountPos = -1;

	CountPos = gSpecialItem.SearchItemPos(lpObj->SpecialBuffItem[Type],Type);

	if ( CountPos == -1 )
	{
		return;
	}

	if ( lpObj->SpecialBuffEffectType1[Type] != -1 )
	{
		switch ( lpObj->SpecialBuffEffectType1[Type] )
		{
		case INCREASE_MAX_MANA:
			lpObj->AddMana -= lpObj->SpecialBuffEffectValue1[Type];
			if ( lpObj->Mana > (lpObj->MaxMana+lpObj->AddMana) )
			{
				lpObj->Mana = lpObj->MaxMana+lpObj->AddMana;
				GCManaSend(lpObj->m_Index,lpObj->Mana,0xFF,0,lpObj->BP);
			}
			GCManaSend(lpObj->m_Index,lpObj->MaxMana+lpObj->AddMana,0xFE,0,lpObj->MaxBP+lpObj->AddBP);
			break;
		case INCREASE_MAX_AG:
			lpObj->AddBP -= lpObj->SpecialBuffEffectValue1[Type];
			if ( lpObj->BP > (lpObj->MaxBP+lpObj->AddBP) )
			{
				lpObj->BP = lpObj->MaxBP+lpObj->AddBP;
				GCManaSend(lpObj->m_Index,lpObj->Mana,0xFF,0,lpObj->BP);
			}
			GCManaSend(lpObj->m_Index,lpObj->MaxMana+lpObj->AddMana,0xFE,0,lpObj->MaxBP+lpObj->AddBP);
			break;
		case INCREASE_MAX_LIFE:
			lpObj->AddLife -= lpObj->SpecialBuffEffectValue1[Type];
			if ( lpObj->Life > (lpObj->MaxLife+lpObj->AddLife) )
			{
				lpObj->Life = lpObj->MaxLife+lpObj->AddLife;
				GCReFillSend(lpObj->m_Index,lpObj->Life,0xFF,0,lpObj->iShield);
			}
			GCReFillSend(lpObj->m_Index,lpObj->MaxLife + lpObj->AddLife,0xFE,0,lpObj->iMaxShield + lpObj->iAddShield);
			break;
		case INCREASE_MAX_SD:
			lpObj->iAddShield -= lpObj->SpecialBuffEffectValue1[Type];
			if ( lpObj->iShield > (lpObj->iMaxShield+lpObj->iAddShield) )
			{
				lpObj->iShield = lpObj->iMaxShield+lpObj->iAddShield;
				GCReFillSend(lpObj->m_Index,lpObj->Life,0xFF,0,lpObj->iShield);
			}
			GCReFillSend(lpObj->m_Index,lpObj->MaxLife + lpObj->AddLife,0xFE,0,lpObj->iMaxShield + lpObj->iAddShield);
			break;
		case INCREASE_DROP_RATE:
			break;
		case INCREASE_EXE_DMG:
			lpObj->m_ExcelentDamage -= lpObj->SpecialBuffEffectValue1[Type];
			break;
		case INCREASE_CRITICAL_DMG:
			lpObj->m_CriticalDamage -= lpObj->SpecialBuffEffectValue1[Type];
			break;
		case INCREASE_LIFE_AUTORECOVERY:
			break;
		case INCREASE_EXP_RATE:
			break;
		case INCREASE_ATTACK_DMG:
			lpObj->m_AttackDamageLeft -= lpObj->SpecialBuffEffectValue1[Type];
			lpObj->m_AttackDamageRight -= lpObj->SpecialBuffEffectValue1[Type];
			lpObj->m_AttackDamageMin -= lpObj->SpecialBuffEffectValue1[Type];
			lpObj->m_AttackDamageMax -= lpObj->SpecialBuffEffectValue1[Type];
			lpObj->m_AttackDamageMinLeft -= lpObj->SpecialBuffEffectValue1[Type];
			lpObj->m_AttackDamageMaxLeft -= lpObj->SpecialBuffEffectValue1[Type];
			lpObj->m_AttackDamageMinRight -= lpObj->SpecialBuffEffectValue1[Type];
			lpObj->m_AttackDamageMaxRight -= lpObj->SpecialBuffEffectValue1[Type];
			break;
		case INCREASE_DEFENSE:
			lpObj->m_Defense -= lpObj->SpecialBuffEffectValue1[Type];
			break;
		case INCREASE_MANA_AUTORECOVERY:
			break;
		case INCREASE_ATTACK_SPEED:
			lpObj->m_AttackSpeed -= lpObj->SpecialBuffEffectValue1[Type];
			lpObj->m_MagicSpeed -= lpObj->SpecialBuffEffectValue1[Type];
			break;
		case DISABLE_EXP:
			break;
		case ENABLE_MOBILITY:
			break;
		case INCREASE_WIZARDY_DMG:
			lpObj->m_MagicDamageMax -= lpObj->SpecialBuffEffectValue1[Type];
			lpObj->m_MagicDamageMin -= lpObj->SpecialBuffEffectValue1[Type];
			break;
		case INCREASE_STRENGHT:
			lpObj->AddStrength -= lpObj->SpecialBuffEffectValue1[Type];
			break;
		case INCREASE_AGILITY:
			lpObj->AddDexterity -= lpObj->SpecialBuffEffectValue1[Type];
			break;
		case INCREASE_HEALTH:
			lpObj->AddVitality -= lpObj->SpecialBuffEffectValue1[Type];
			break;
		case INCREASE_ENERGY:
			lpObj->AddEnergy -= lpObj->SpecialBuffEffectValue1[Type];
			break;
		case INCREASE_LEADERSHIP:
			lpObj->AddLeadership -= lpObj->SpecialBuffEffectValue1[Type];
			break;
		}
		lpObj->SpecialBuffEffectType2[Type] = -1;
	}

	if ( lpObj->SpecialBuffEffectType2[Type] != -1 )
	{
		switch ( lpObj->SpecialBuffEffectType2[Type] )
		{
		case INCREASE_MAX_MANA:
			lpObj->AddMana -= lpObj->SpecialBuffEffectValue2[Type];
			if ( lpObj->Mana > (lpObj->MaxMana+lpObj->AddMana) )
			{
				lpObj->Mana = lpObj->MaxMana+lpObj->AddMana;
				GCManaSend(lpObj->m_Index,lpObj->Mana,0xFF,0,lpObj->BP);
			}
			GCManaSend(lpObj->m_Index,lpObj->MaxMana+lpObj->AddMana,0xFE,0,lpObj->MaxBP+lpObj->AddBP);
			break;
		case INCREASE_MAX_AG:
			lpObj->AddBP -= lpObj->SpecialBuffEffectValue2[Type];
			if ( lpObj->BP > (lpObj->MaxBP+lpObj->AddBP) )
			{
				lpObj->BP = lpObj->MaxBP+lpObj->AddBP;
				GCManaSend(lpObj->m_Index,lpObj->Mana,0xFF,0,lpObj->BP);
			}
			GCManaSend(lpObj->m_Index,lpObj->MaxMana+lpObj->AddMana,0xFE,0,lpObj->MaxBP+lpObj->AddBP);
			break;
		case INCREASE_MAX_LIFE:
			lpObj->AddLife -= lpObj->SpecialBuffEffectValue2[Type];
			if ( lpObj->Life > (lpObj->MaxLife+lpObj->AddLife) )
			{
				lpObj->Life = lpObj->MaxLife+lpObj->AddLife;
				GCReFillSend(lpObj->m_Index,lpObj->Life,0xFF,0,lpObj->iShield);
			}
			GCReFillSend(lpObj->m_Index,lpObj->MaxLife + lpObj->AddLife,0xFE,0,lpObj->iMaxShield + lpObj->iAddShield);
			break;
		case INCREASE_MAX_SD:
			lpObj->iAddShield -= lpObj->SpecialBuffEffectValue2[Type];
			if ( lpObj->iShield > (lpObj->iMaxShield+lpObj->iAddShield) )
			{
				lpObj->iShield = lpObj->iMaxShield+lpObj->iAddShield;
				GCReFillSend(lpObj->m_Index,lpObj->Life,0xFF,0,lpObj->iShield);
			}
			GCReFillSend(lpObj->m_Index,lpObj->MaxLife + lpObj->AddLife,0xFE,0,lpObj->iMaxShield + lpObj->iAddShield);
			break;
		case INCREASE_DROP_RATE:
			break;
		case INCREASE_EXE_DMG:
			lpObj->m_ExcelentDamage -= lpObj->SpecialBuffEffectValue2[Type];
			break;
		case INCREASE_CRITICAL_DMG:
			lpObj->m_CriticalDamage -= lpObj->SpecialBuffEffectValue2[Type];
			break;
		case INCREASE_LIFE_AUTORECOVERY:
			break;
		case INCREASE_EXP_RATE:
			break;
		case INCREASE_ATTACK_DMG:
			lpObj->m_AttackDamageLeft -= lpObj->SpecialBuffEffectValue2[Type];
			lpObj->m_AttackDamageRight -= lpObj->SpecialBuffEffectValue2[Type];
			lpObj->m_AttackDamageMin -= lpObj->SpecialBuffEffectValue2[Type];
			lpObj->m_AttackDamageMax -= lpObj->SpecialBuffEffectValue2[Type];
			lpObj->m_AttackDamageMinLeft -= lpObj->SpecialBuffEffectValue2[Type];
			lpObj->m_AttackDamageMaxLeft -= lpObj->SpecialBuffEffectValue2[Type];
			lpObj->m_AttackDamageMinRight -= lpObj->SpecialBuffEffectValue2[Type];
			lpObj->m_AttackDamageMaxRight -= lpObj->SpecialBuffEffectValue2[Type];
			break;
		case INCREASE_DEFENSE:
			lpObj->m_Defense -= lpObj->SpecialBuffEffectValue2[Type];
			break;
		case INCREASE_MANA_AUTORECOVERY:
			break;
		case INCREASE_ATTACK_SPEED:
			lpObj->m_AttackSpeed -= lpObj->SpecialBuffEffectValue2[Type];
			lpObj->m_MagicSpeed -= lpObj->SpecialBuffEffectValue2[Type];
			break;
		case DISABLE_EXP:
			break;
		case ENABLE_MOBILITY:
			break;
		case INCREASE_WIZARDY_DMG:
			lpObj->m_MagicDamageMax -= lpObj->SpecialBuffEffectValue2[Type];
			lpObj->m_MagicDamageMin -= lpObj->SpecialBuffEffectValue2[Type];
			break;
		case INCREASE_STRENGHT:
			lpObj->AddStrength -= lpObj->SpecialBuffEffectValue2[Type];
			break;
		case INCREASE_AGILITY:
			lpObj->AddDexterity -= lpObj->SpecialBuffEffectValue2[Type];
			break;
		case INCREASE_HEALTH:
			lpObj->AddVitality -= lpObj->SpecialBuffEffectValue2[Type];
			break;
		case INCREASE_ENERGY:
			lpObj->AddEnergy -= lpObj->SpecialBuffEffectValue2[Type];
			break;
		case INCREASE_LEADERSHIP:
			lpObj->AddLeadership -= lpObj->SpecialBuffEffectValue2[Type];
			break;
		}
	}
	lpObj->SpecialBuffEffectType1[Type] = -1;
	lpObj->SpecialBuffEffectValue1[Type] = -1;
	lpObj->SpecialBuffEffectType2[Type] = -1;
	lpObj->SpecialBuffEffectValue2[Type] = -1;

	lpObj->SpecialBuff[Type] = 0;

	if ( gSpecialItem.BuffNumber[Type][CountPos] != -1 )
	{
		GCStateInfoSend(lpObj,0,gSpecialItem.BuffNumber[Type][CountPos]);
	}

	lpObj->SpecialBuffEffectTime[Type] = 0;

	lpObj->SpecialBuffItem[Type] = -1;
	
}
Exemplo n.º 16
0
void CLifeStone::LifeStoneAct(int iIndex)
{
	if ( !gObjIsConnected(iIndex))
		return;

	LPOBJ lpObj = &gObj[iIndex];

	lpObj->m_iCreatedActivationTime++;
	BYTE btCreationState = lpObj->m_btCreationState;

	if ( lpObj->m_iCreatedActivationTime < 60 )
		lpObj->m_btCreationState = lpObj->m_iCreatedActivationTime / 12;
	else
		lpObj->m_btCreationState = 5;

	if ( btCreationState != lpObj->m_btCreationState )
		GCSendObjectCreationState(iIndex);

	if ( lpObj->m_btCreationState < 5 )
		return;

	if ( lpObj->VPCount < 1 ) 
		return;

	int tObjNum = -1;

	for (int i=0;i<MAX_VIEWPORT;i++)
	{
		tObjNum = lpObj->VpPlayer[i].number;

		if ( tObjNum >= 0 )
		{
			if ( gObj[tObjNum].Type == OBJ_USER && gObj[tObjNum].Live )
			{
				if ( gObj[tObjNum].m_btCsJoinSide == lpObj->m_btCsJoinSide )
				{
					if ( abs(lpObj->Y - gObj[tObjNum].Y) <= 3 &&
						 abs(lpObj->X - gObj[tObjNum].X) <= 3 )
					{
						BOOL bLifeChange = FALSE;
						BOOL bManaChange = FALSE;
						BOOL bBpChange = FALSE;

						/*gObj[tObjNum].Life += 100.0f;
						gObj[tObjNum].Mana += 100.0f;
						gObj[tObjNum].BP += 100;*/

						if ( gObj[tObjNum].Life < (gObj[tObjNum].MaxLife + gObj[tObjNum].AddLife))
						{
							gObj[tObjNum].Life += ( gObj[tObjNum].MaxLife + gObj[tObjNum].AddLife ) / 100.0f;

							if ( gObj[tObjNum].Life > (gObj[tObjNum].MaxLife + gObj[tObjNum].AddLife))
								gObj[tObjNum].Life = gObj[tObjNum].MaxLife + gObj[tObjNum].AddLife;

							bLifeChange = TRUE;
						}

						if ( gObj[tObjNum].Mana < (gObj[tObjNum].MaxMana + gObj[tObjNum].AddMana))
						{
							gObj[tObjNum].Mana += ( gObj[tObjNum].MaxMana + gObj[tObjNum].AddMana ) / 100.0f;

							if ( gObj[tObjNum].Mana > (gObj[tObjNum].MaxMana + gObj[tObjNum].AddMana))
								gObj[tObjNum].Mana = gObj[tObjNum].MaxMana + gObj[tObjNum].AddMana;

							bManaChange = TRUE;
						}

						if ( gObj[tObjNum].BP < (gObj[tObjNum].MaxBP + gObj[tObjNum].AddBP))
						{
							gObj[tObjNum].BP += ( gObj[tObjNum].MaxBP + gObj[tObjNum].AddBP ) / 100;

							if ( gObj[tObjNum].BP > (gObj[tObjNum].MaxBP + gObj[tObjNum].AddBP))
								gObj[tObjNum].BP = gObj[tObjNum].MaxBP + gObj[tObjNum].AddBP;

							bBpChange = TRUE;
						}

						if (bLifeChange )
							GCReFillSend(tObjNum, (WORD)gObj[tObjNum].Life, 0xFF, 1, gObj[tObjNum].iShield);

						if (bManaChange ||bBpChange ) 
							GCManaSend(tObjNum, (short)gObj[tObjNum].Mana, 0xFF, 0, gObj[tObjNum].BP);
					}
				}
			}
		}
	}
}
Exemplo n.º 17
0
// -----------------------------------------------------------------------------------------------------------------------
void CIllusionTemple::UseSkillProc(OBJECTSTRUCT* lpObj, PMSG_ILLUSION_USESKILL* pMsg)
{
	LPOBJ lpTargetObj = &gObj[pMsg->m_TargetIndex];

	int TargePosx = lpTargetObj->X;
	int TargePosy = lpTargetObj->Y;

	int iangle = gObjUseSkill.GetAngle(lpObj->X,lpObj->Y,TargePosx,TargePosy);

	if(!(IT_FLOOR_RANGE(lpObj->m_IllusionIndex) && IT_MAP_RANGE(lpObj->MapNumber)))
	{
		GCMagicAttackNumberSend(lpObj, (BYTE)pMsg->m_SkillIndex, lpObj->m_Index, 1);
		return;
	}

	int SkillPoint = MagicDamageC.CheckKillCount(pMsg->m_SkillIndex, lpObj->m_IllusionKillCount);

	if(SkillPoint < 0)
	{
		GCMagicAttackNumberSend(lpObj, (BYTE)pMsg->m_SkillIndex, lpObj->m_Index, 1);
		CLog.LogAddC(2, "[IllusionTemple][%s] Use skill without enough points (%d)(%d)", lpObj->Name, lpObj->m_IllusionKillCount, pMsg->m_SkillIndex);
		return;
	}

	switch(pMsg->m_SkillIndex)
	{
		case IT_SKILL_SHIELD:
		{
			if(lpObj->m_IllusionShieldSkillTime > 0)
			{
				GCMagicAttackNumberSend(lpObj, AT_SKILL_ITSHIELD, lpObj->m_Index, 0);
				return;
			}

			if(lpObj->Mana < MagicDamageC.SkillGetMana(IT_SKILL_SHIELD))
			{
				GCMagicAttackNumberSend(lpObj, AT_SKILL_ITSHIELD, lpObj->m_Index, 0);
				return;
			}

			lpObj->Mana -= MagicDamageC.SkillGetMana(IT_SKILL_SHIELD);
			GCManaSend(lpObj->m_Index, (short)lpObj->Mana, 0xFF, 0, lpObj->BP);
			lpObj->m_IllusionShieldSkillTime = MagicDamageC.GetDelayTime(IT_SKILL_SHIELD);
			GCStateInfoSend(lpObj, 1, eVS_ILLUSION_PROTECTION);
			gObjSetIllusionKillCount(lpObj->m_Index, KILLCOUNT_DECREASE, MagicDamageC.GetKillCount(IT_SKILL_SHIELD));
			GCMagicAttackNumberSend(lpObj, AT_SKILL_ITSHIELD, lpObj->m_Index, 1);
		}break;

		case IT_SKILL_RESIST:
		{
			if(lpObj->Type != OBJ_USER )
			{
				CLog.LogAddC(2, "[IllusionTemple][%s] can't use Skill (%d) in normal state,only in PVP", lpObj->Name, pMsg->m_SkillIndex );
				return;
			}

			if(gObjCalDistance(lpObj,lpTargetObj) <= 4)
			{
				if(SkillElectricSparkHitBox.HitCheck(iangle,lpObj->X,lpObj->Y,lpObj->X,lpObj->Y))
				{
					lpTargetObj->m_btSkillRestraintOrder = TRUE;
					lpTargetObj->m_btSkillRestraintOrderTime = 15;
					//this->GCEffectSkillSend(aIndex,lpTargetObj->m_Index,lpMagic->m_Skill,btType);
					gObjSetPosition(lpObj->m_Index,lpObj->X,lpObj->Y);
				}
			}
		}break;

		case IT_SKILL_TRACK:
		{
			if(lpObj->m_Index != this->m_IllusionTemple[lpObj->m_IllusionIndex].m_BallOwner)
			{
				if(OBJMAX_RANGE(this->m_IllusionTemple[lpObj->m_IllusionIndex].m_BallOwner))
				{
					gObjSetIllusionKillCount(lpObj->m_Index, KILLCOUNT_DECREASE, MagicDamageC.GetKillCount(IT_SKILL_TRACK));
					gObjTeleport(lpObj->m_Index, gObj[this->m_IllusionTemple[lpObj->m_IllusionIndex].m_BallOwner].MapNumber, 
						gObj[this->m_IllusionTemple[lpObj->m_IllusionIndex].m_BallOwner].X, 
						gObj[this->m_IllusionTemple[lpObj->m_IllusionIndex].m_BallOwner].Y); 
				}
			}
		}break;

		case IT_SKILL_FREEZE:
		{
			if(lpObj->Type != OBJ_USER )
			{
				CLog.LogAddC(2, "[IllusionTemple][%s] can't use Skill (%d) in normal state,only in PVP", lpObj->Name, pMsg->m_SkillIndex );
				return;
			}

			lpObj->iShield -= (lpObj->iMaxShield / 2);

			if( lpObj->iShield < 0 )
			{
				lpObj->iShield = 0;
			}

			GCReFillSend(lpObj->m_Index,(WORD)lpObj->Life,0xFF,0,lpObj->iShield);
			GCSendEffectInfo(lpTargetObj->m_Index, 17);
		}break;
	}
}
Exemplo n.º 18
0
bool CItemAddOption::_ClearItemEffect(LPOBJ lpObj, int iEffectOption, int iOptionType, int iEffectType, int iEffectValue)
{
	if ( iEffectType <= 0 )
		return false;

	switch ( iEffectType )
	{
		case ADD_OPTION_LIFE:
			lpObj->AddLife -= iEffectValue;

			if ( (lpObj->AddLife + lpObj->MaxLife ) < lpObj->Life )
			{
				lpObj->Life = lpObj->AddLife + lpObj->MaxLife;
			}

			GCReFillSend(lpObj->m_Index, lpObj->Life, 0xFF, 0, lpObj->iShield);
			GCReFillSend(lpObj->m_Index, lpObj->MaxLife + lpObj->AddLife, 0xFE, 0, lpObj->iMaxShield + lpObj->iAddShield);
			break;

		case ADD_OPTION_MANA:
			lpObj->AddMana -= iEffectValue;

			if ( (lpObj->AddMana + lpObj->MaxMana ) < lpObj->Mana )
			{
				lpObj->Mana = lpObj->AddMana + lpObj->MaxMana;
			}

			GCManaSend(lpObj->m_Index, lpObj->Mana, -1, 0, lpObj->BP);
			GCManaSend(lpObj->m_Index, lpObj->AddMana + lpObj->MaxMana, 0xFE, 0, lpObj->MaxBP + lpObj->AddBP);
			break;

		case ADD_OPTION_ATTACK_DAMAGE:
			lpObj->m_AttackDamageMaxLeft -= iEffectValue;
			lpObj->m_AttackDamageMinLeft -= iEffectValue;
			lpObj->m_AttackDamageMaxRight -= iEffectValue;
			lpObj->m_AttackDamageMinRight -= iEffectValue;
			lpObj->m_MagicDamageMin -= iEffectValue;
			lpObj->m_MagicDamageMax -= iEffectValue;
			break;

		/*case ADD_OPTION_SPEED:
			lpObj->m_AttackSpeed -= iEffectValue;
			lpObj->m_MagicSpeed -= iEffectValue;
			break;*/

		case ADD_OPTION_DEFENSE:
			lpObj->m_Defense -= iEffectValue * 10 / 20;
			break;

		case ADD_OPTION_STRENGTH:
			lpObj->AddStrength -= iEffectValue;
			break;

		case ADD_OPTION_DEXTERITY:
			lpObj->AddDexterity -= iEffectValue;
			break;

		case ADD_OPTION_VITALITY:
			lpObj->AddVitality -= iEffectValue;
			break;

		case ADD_OPTION_ENERGY:
			lpObj->AddEnergy -= iEffectValue;
			break;

		case ADD_OPTION_LEADERSHIP:
			lpObj->AddLeadership -= iEffectValue;
			break;

		case ADD_OPTION_WRATH:
			lpObj->m_AttackDamageMaxLeft -= iEffectValue;
			lpObj->m_AttackDamageMinLeft -= iEffectValue;
			lpObj->m_AttackDamageMaxRight -= iEffectValue;
			lpObj->m_AttackDamageMinRight -= iEffectValue;
			break;

		case ADD_OPTION_WIZARDRY:
			lpObj->m_MagicDamageMin -= iEffectValue;
			lpObj->m_MagicDamageMax -= iEffectValue;
			break;

		case ADD_OPTION_MOBILITY:
			break;

		default:
			return false;
	}

	GCUseEffectItem(lpObj, iEffectOption, iOptionType, iEffectType, 0);

	return true;
}
Exemplo n.º 19
0
bool CItemAddOption::_SetItemEffect(LPOBJ lpObj, int iEffectType, int iEffectValue)//55D100
{
	if ( iEffectType <= 0 )
		return false;

	switch ( iEffectType )
	{
		case ADD_OPTION_LIFE:
			lpObj->AddLife += iEffectValue;
			GCReFillSend(lpObj->m_Index, lpObj->MaxLife + lpObj->AddLife, -2, 0, lpObj->iMaxShield + lpObj->iAddShield);
			GCReFillSend(lpObj->m_Index, lpObj->Life, -1, 0, lpObj->iShield);
			break;

		case ADD_OPTION_MANA:
			lpObj->AddMana += iEffectValue;
			GCManaSend(lpObj->m_Index, lpObj->AddMana + lpObj->MaxMana, -2, 0, lpObj->MaxBP + lpObj->AddBP);
			GCManaSend(lpObj->m_Index, lpObj->Mana, -1, 0, lpObj->BP);
			break;

		case ADD_OPTION_ATTACK_DAMAGE:
			lpObj->m_AttackDamageMaxLeft += iEffectValue;
			lpObj->m_AttackDamageMinLeft += iEffectValue;
			lpObj->m_AttackDamageMaxRight += iEffectValue;
			lpObj->m_AttackDamageMinRight += iEffectValue;
			lpObj->m_MagicDamageMin += iEffectValue;
			lpObj->m_MagicDamageMax += iEffectValue;
			break;

		/*case ADD_OPTION_SPEED:
			lpObj->m_AttackSpeed += iEffectValue;
			lpObj->m_MagicSpeed += iEffectValue;
			break;*/

		case ADD_OPTION_DEFENSE:
			lpObj->m_Defense += iEffectValue * 10 / 20;
			break;

		case ADD_OPTION_STRENGTH:
			lpObj->AddStrength += iEffectValue;
			break;

		case ADD_OPTION_DEXTERITY:
			lpObj->AddDexterity += iEffectValue;
			break;

		case ADD_OPTION_VITALITY:
			lpObj->AddVitality += iEffectValue;
			break;

		case ADD_OPTION_ENERGY:
			lpObj->AddEnergy += iEffectValue;
			break;

		case ADD_OPTION_LEADERSHIP:
			lpObj->AddLeadership += iEffectValue;
			break;

		case ADD_OPTION_WRATH:
			lpObj->m_AttackDamageMaxLeft += iEffectValue;
			lpObj->m_AttackDamageMinLeft += iEffectValue;
			lpObj->m_AttackDamageMaxRight += iEffectValue;
			lpObj->m_AttackDamageMinRight += iEffectValue;
			break;

		case ADD_OPTION_WIZARDRY:
			lpObj->m_MagicDamageMin += iEffectValue;
			lpObj->m_MagicDamageMax += iEffectValue;
			break;

		case ADD_OPTION_MOBILITY:
			break;

		default:
			return false;
	}

	return true;
}
void CCalCharacter::gObjCalCharacter(int aIndex)
{
	LPOBJ lpObj = &gObj[aIndex];
	int Strength = 0;
	int Dexterity = 0;
	int Vitality = 0;
	int Energy = 0;
	int Leadership = 0;
	// ----
	CItem * Right = &lpObj->pInventory[0];
	CItem * Left  = &lpObj->pInventory[1];
	CItem * Helm  = &lpObj->pInventory[2];
	CItem * Armor  = &lpObj->pInventory[3];
	CItem * Pants  = &lpObj->pInventory[4];
	CItem * Gloves = &lpObj->pInventory[5];
	CItem * Boots = &lpObj->pInventory[6];
	CItem * Wings = &lpObj->pInventory[7];
	CItem * Helper = &lpObj->pInventory[8];
	CItem * Amulet = &lpObj->pInventory[9];
	CItem * Ring01 = &lpObj->pInventory[10];
	CItem * Ring02 = &lpObj->pInventory[11];
	lpObj->HaveWeaponInHand = true;
	// -------------------------------------------------------
	// Check Weapon in hand
	// -------------------------------------------------------
	if ( Right->IsItem() == false && Left->IsItem() == false )
	{
		lpObj->HaveWeaponInHand = false;
	}
	else if ( Left->IsItem() == false && Right->m_Type == ITEMGET(4,15) ) // Arrow
	{
		lpObj->HaveWeaponInHand = false;
	}
	else if ( Right->IsItem() == false )
	{
		int iType = Left->m_Type / MAX_SUBTYPE_ITEMS;

		if ( Left->m_Type == ITEMGET(4,7) ) // Bolt
		{
			lpObj->HaveWeaponInHand = false;
		}
		else if ( iType == 6 ) // Shield
		{
			lpObj->HaveWeaponInHand = false;
		}
	}
	// -------------------------------------------------------
	lpObj->AddLife = 0;
	lpObj->AddMana = 0;
	lpObj->MonsterDieGetMoney = 0;
	lpObj->MonsterDieGetLife = 0;
	lpObj->MonsterDieGetMana = 0;
	lpObj->DamageReflect = 0;
	lpObj->DamageMinus = 0;
	lpObj->SkillLongSpearChange = false;

	if ( lpObj->m_iItemEffectValidTime > 0 )
	{
		g_ItemAddOption.PrevSetItemLastEffectForHallowin(lpObj);
	}

	int iItemIndex;
	BOOL bIsChangeItem;	// lc34

	for ( iItemIndex=0; iItemIndex<MAX_PLAYER_EQUIPMENT;iItemIndex++)
	{
		if ( lpObj->pInventory[iItemIndex].IsItem() != FALSE )
		{
			lpObj->pInventory[iItemIndex].m_IsValidItem = true;
		}
	}

	do
	{
		lpObj->SetOpAddMaxAttackDamage = 0;
		lpObj->SetOpAddMinAttackDamage = 0;
		lpObj->SetOpAddDamage = 0;
		lpObj->SetOpIncAGValue = 0;
		lpObj->SetOpAddCriticalDamageSuccessRate = 0;
		lpObj->SetOpAddCriticalDamage = 0;
		lpObj->SetOpAddExDamageSuccessRate = 0;
		lpObj->SetOpAddExDamage = 0;
		lpObj->SetOpAddSkillAttack = 0;
		lpObj->AddStrength = 0;
		lpObj->AddDexterity = 0;
		lpObj->AddVitality = 0;
		lpObj->AddEnergy = 0;
		lpObj->AddBP = 0;
		lpObj->iAddShield = 0;
		lpObj->SetOpAddAttackDamage = 0;
		lpObj->SetOpAddDefence = 0;
		lpObj->SetOpAddMagicPower = 0;
		lpObj->SetOpAddDefenceRate = 0;
		lpObj->SetOpIgnoreDefense = 0;
		lpObj->SetOpDoubleDamage = 0;
		lpObj->SetOpTwoHandSwordImproveDamage = 0;
		lpObj->SetOpImproveSuccessAttackRate = 0;
		lpObj->SetOpReflectionDamage = 0;
		lpObj->SetOpImproveSheldDefence = 0;
		lpObj->SetOpDecreaseAG = 0;
		lpObj->SetOpImproveItemDropRate = 0;
		lpObj->IsFullSetItem = false;
		memset(lpObj->m_AddResistance, 0, sizeof(lpObj->m_AddResistance));
		bIsChangeItem = 0;
		gObjCalcSetItemStat(lpObj);
		gObjCalcSetItemOption(lpObj);

		for (iItemIndex=0;iItemIndex<MAX_PLAYER_EQUIPMENT;iItemIndex++)
		{
			if ( lpObj->pInventory[iItemIndex].IsItem() != FALSE && lpObj->pInventory[iItemIndex].m_IsValidItem != false )
			{
				if ( gObjValidItem( lpObj, &lpObj->pInventory[iItemIndex], iItemIndex) != FALSE )
				{
					lpObj->pInventory[iItemIndex].m_IsValidItem = true;
				}
				else
				{
					lpObj->pInventory[iItemIndex].m_IsValidItem  = false;
					bIsChangeItem = TRUE;
				}
			}
		}
	}
	while ( bIsChangeItem != FALSE );

	Strength = lpObj->Strength + lpObj->AddStrength;
	Dexterity = lpObj->Dexterity + lpObj->AddDexterity;
	Vitality = lpObj->Vitality + lpObj->AddVitality;
	Energy = lpObj->Energy + lpObj->AddEnergy;
	Leadership = lpObj->Leadership + lpObj->AddLeadership;

	switch ( lpObj->Class )
	{
	case CLASS_WIZARD:
		lpObj->m_AttackDamageMinRight = (Strength / 8);
		lpObj->m_AttackDamageMaxRight = (Strength / 4);
		lpObj->m_AttackDamageMinLeft = (Strength / 8);
		lpObj->m_AttackDamageMaxLeft = (Strength / 4);
		break;
	case CLASS_KNIGHT:
		lpObj->m_AttackDamageMinRight = Strength / 6;
		lpObj->m_AttackDamageMaxRight = Strength / 4;
		lpObj->m_AttackDamageMinLeft = Strength / 6;
		lpObj->m_AttackDamageMaxLeft = Strength / 4;
		break;
	case CLASS_ELF:
		if ( (Right->m_Type >= ITEMGET(4,8) && Right->m_Type < ITEMGET(4,15) ) ||
			 (Left->m_Type >= ITEMGET(4,0) && Left->m_Type < ITEMGET(4,7)) ||
			  Right->m_Type == ITEMGET(4,16) ||
			  Left->m_Type == ITEMGET(4,17) ||
			  Right->m_Type == ITEMGET(4,18) ||
			  Right->m_Type == ITEMGET(4,19) ||
			  Left->m_Type == ITEMGET(4,20) ||
			  Left->m_Type == ITEMGET(4,21) ||
			  Left->m_Type == ITEMGET(4,22) ||
			  Left->m_Type == ITEMGET(4,23) ||
			  Left->m_Type == ITEMGET(4,24) )
		{
			if ( (Right->IsItem() != FALSE && Right->m_IsValidItem == false) || (Left->IsItem() != FALSE && Left->m_IsValidItem == false) )
			{
				lpObj->m_AttackDamageMinRight = (Dexterity + Strength ) / 7;
				lpObj->m_AttackDamageMaxRight = (Dexterity + Strength ) / 4;
				lpObj->m_AttackDamageMinLeft = (Dexterity + Strength ) / 7;
				lpObj->m_AttackDamageMaxLeft = (Dexterity + Strength ) / 4;
			}
			else
			{
				lpObj->m_AttackDamageMinRight = (Dexterity / 7) + (Strength / 14);
				lpObj->m_AttackDamageMaxRight = (Dexterity / 4) + (Strength / 8 );
				lpObj->m_AttackDamageMinLeft = (Dexterity / 7) + (Strength / 14);
				lpObj->m_AttackDamageMaxLeft = (Dexterity / 4) + (Strength / 8 );
			}
		}
		else
		{
			lpObj->m_AttackDamageMinRight = (Dexterity + Strength) / 7;
			lpObj->m_AttackDamageMaxRight = (Dexterity + Strength) / 4;
			lpObj->m_AttackDamageMinLeft = (Dexterity + Strength) / 7;
			lpObj->m_AttackDamageMaxLeft = (Dexterity + Strength) / 4;
		}
		break;
	case CLASS_MAGUMSA:
		lpObj->m_AttackDamageMinRight = (Strength / 6) + (Energy / 12);
		lpObj->m_AttackDamageMaxRight = (Strength / 4) + (Energy / 8);
		lpObj->m_AttackDamageMinLeft = (Strength / 6) + (Energy / 12);
		lpObj->m_AttackDamageMaxLeft = (Strength / 4) + (Energy / 8);
		break;
	case CLASS_DARKLORD:
		lpObj->m_AttackDamageMinRight = (Strength / 7) + (Energy / 14);
		lpObj->m_AttackDamageMaxRight = (Strength / 5) + (Energy / 10);
		lpObj->m_AttackDamageMinLeft = (Strength / 7) + (Energy / 14);
		lpObj->m_AttackDamageMaxLeft = (Strength / 5) + (Energy / 10);
		break;
	case CLASS_SUMMONER:
		lpObj->m_AttackDamageMinRight = (Strength / 8) + (Energy / 12);
		lpObj->m_AttackDamageMaxRight = (Strength / 4) + (Energy / 8);
		lpObj->m_AttackDamageMinLeft = (Strength / 8) + (Energy / 12);
		lpObj->m_AttackDamageMaxLeft = (Strength / 4) + (Energy / 8);
		break;
	case CLASS_FIGHTER:
		lpObj->m_AttackDamageMinRight = (Strength / 6) + (Energy / 12);
		lpObj->m_AttackDamageMaxRight = (Strength / 4) + (Energy / 8);
		lpObj->m_AttackDamageMinLeft = (Strength / 6) + (Energy / 12);
		lpObj->m_AttackDamageMaxLeft = (Strength / 4) + (Energy / 8);
		break;
	}
	
	if ( Wings->IsItem() != FALSE && Wings->m_IsValidItem != false ) 
	{
		Wings->PlusSpecial(&lpObj->m_AttackDamageMinRight, 80);
		Wings->PlusSpecial(&lpObj->m_AttackDamageMaxRight, 80);
		Wings->PlusSpecial(&lpObj->m_AttackDamageMinLeft, 80);
		Wings->PlusSpecial(&lpObj->m_AttackDamageMaxLeft, 80);
	}

	int AddLeadership = 0;

	if ( Wings->IsItem() != FALSE && Wings->m_IsValidItem != false)
	{
		AddLeadership += Wings->m_Leadership;
	}

	if ( Right->m_Type != -1 )
	{
		if ( Right->m_IsValidItem != false )
		{
			if ( Right->m_Type >= ITEMGET(5,0) && Right->m_Type <= ITEMGET(6,0) ) // Check this
			{
				lpObj->m_AttackDamageMinRight += Right->m_DamageMin / 2;
				lpObj->m_AttackDamageMaxRight += Right->m_DamageMax / 2;
			}
			else
			{
				lpObj->m_AttackDamageMinRight += Right->m_DamageMin;
				lpObj->m_AttackDamageMaxRight += Right->m_DamageMax;
			}
		}

		if ( Right->m_SkillChange != FALSE )
		{
			lpObj->SkillLongSpearChange = true;
		}

		Right->PlusSpecial(&lpObj->m_AttackDamageMinRight, 80);
		Right->PlusSpecial(&lpObj->m_AttackDamageMaxRight, 80);
	}
		
	if ( Left->m_Type != -1 )
	{
		if ( Left->m_IsValidItem != false)
		{
			lpObj->m_AttackDamageMinLeft += Left->m_DamageMin;
			lpObj->m_AttackDamageMaxLeft += Left->m_DamageMax;
		}

		Left->PlusSpecial(&lpObj->m_AttackDamageMinLeft, 80);
		Left->PlusSpecial(&lpObj->m_AttackDamageMaxLeft, 80);
	}

	lpObj->m_CriticalDamage = 0;
	lpObj->m_ExcelentDamage = 0;

	if ( Wings->IsItem() != FALSE && Wings->m_IsValidItem != false )
	{
		Wings->PlusSpecial(&lpObj->m_MagicDamageMin, 81);
		Wings->PlusSpecial(&lpObj->m_MagicDamageMax, 81);
		Wings->PlusSpecial(&lpObj->m_CriticalDamage, 84);
	}
	if ( Right->IsItem() != FALSE && Right->m_IsValidItem != false )
	{
		Right->PlusSpecial(&lpObj->m_CriticalDamage, 84);
	}
	if ( Left->IsItem() != FALSE && Left->m_IsValidItem != false )
	{
		Left->PlusSpecial(&lpObj->m_CriticalDamage, 84);
	}
	if ( Helm->IsItem() != FALSE && Helm->m_IsValidItem != false )
	{
		Helm->PlusSpecial(&lpObj->m_CriticalDamage, 84);
	}
	if ( Armor->IsItem() != FALSE && Armor->m_IsValidItem != false )
	{
		Armor->PlusSpecial(&lpObj->m_CriticalDamage, 84);
	}
	if ( Pants->IsItem() != FALSE && Pants->m_IsValidItem != false )
	{
		Pants->PlusSpecial(&lpObj->m_CriticalDamage, 84);
	}
	if ( Gloves->IsItem() != FALSE && Gloves->m_IsValidItem != false )
	{
		Gloves->PlusSpecial(&lpObj->m_CriticalDamage, 84);
	}
	if ( Boots->IsItem() != FALSE && Boots->m_IsValidItem != false )
	{
		Boots->PlusSpecial(&lpObj->m_CriticalDamage, 84);
	}
	lpObj->m_MagicDamageMin = Energy / 9;
	lpObj->m_MagicDamageMax = Energy / 4;


	if ( Right->m_Type != -1 )
	{
		if ( Right->m_Type == ITEMGET(0,31) ||
			 Right->m_Type == ITEMGET(0,21) ||
			 Right->m_Type == ITEMGET(0,23) ||
			 Right->m_Type == ITEMGET(0,25) ||
			 Right->m_Type == ITEMGET(0,28) ) 
		{
			Right->PlusSpecial(&lpObj->m_MagicDamageMin, 80);
			Right->PlusSpecial(&lpObj->m_MagicDamageMax, 80);
		}
		else
		{
			Right->PlusSpecial(&lpObj->m_MagicDamageMin, 81);
			Right->PlusSpecial(&lpObj->m_MagicDamageMax, 81);
		}
	}

	lpObj->m_AttackRating = (Strength + Dexterity) / 2;
	if (lpObj->Class != CLASS_FIGHTER) // Rage Fighter - No Gloves
	{
		if ( Gloves->IsItem() != FALSE && Gloves->m_IsValidItem != false )
		{
			lpObj->m_AttackRating += Gloves->ItemDefense();
		}
	}
	// ----------------------------------------
	// Attack Speed
	// ---------------------------------------- 
	switch ( lpObj->Class )
	{
	case CLASS_WIZARD:
		lpObj->m_AttackSpeed = Dexterity / 20;
		lpObj->m_MagicSpeed = Dexterity / 10;
		break;
	case CLASS_KNIGHT:
		lpObj->m_AttackSpeed = Dexterity / 15;
		lpObj->m_MagicSpeed = Dexterity / 20;
		break;
	case CLASS_ELF:
		lpObj->m_AttackSpeed = Dexterity / 50;
		lpObj->m_MagicSpeed = Dexterity / 50;
		break;
	case CLASS_MAGUMSA:
		lpObj->m_AttackSpeed = Dexterity / 15;
		lpObj->m_MagicSpeed = Dexterity / 20;
		break;
	case CLASS_DARKLORD:
		lpObj->m_AttackSpeed = Dexterity / 10;
		lpObj->m_MagicSpeed = Dexterity / 10;
		break;
	case CLASS_SUMMONER:
		lpObj->m_AttackSpeed = Dexterity / 20;
		lpObj->m_MagicSpeed = Dexterity / 20;
		break;
	case CLASS_FIGHTER:
		lpObj->m_AttackSpeed = Dexterity / 15;
		lpObj->m_MagicSpeed = Dexterity / 20;
		break;
	}
	
	bool bRight = false;
	bool bLeft = false;
	// ---------------------------------------- 
	// Check if have weapon in Right Hand
	// ---------------------------------------- 
	if ( Right->m_Type != ITEMGET(4,7) && Right->m_Type != ITEMGET(4,15) && Right->m_Type >= ITEMGET(0,0) && Right->m_Type < ITEMGET(6,0) )
	{
		if ( Right->m_IsValidItem != false )
		{
			bRight = true;
		}
	}
	// ---------------------------------------- 
	// Check if have weapon in Left Hand
	// ---------------------------------------- 
	if ( Left->m_Type != ITEMGET(4,7) && Left->m_Type != ITEMGET(4,15) && Left->m_Type >= ITEMGET(0,0) && Left->m_Type < ITEMGET(6,0) )
	{
		if ( Left->m_IsValidItem != false )
		{
			bLeft = true;
		}
	}

	if ( bRight != false && bLeft != false )
	{
		lpObj->m_AttackSpeed += (Right->m_AttackSpeed + Left->m_AttackSpeed)/2;
		lpObj->m_MagicSpeed += (Right->m_AttackSpeed + Left->m_AttackSpeed)/2;
	}
	else if ( bRight!= false )
	{
		lpObj->m_AttackSpeed += Right->m_AttackSpeed;
		lpObj->m_MagicSpeed += Right->m_AttackSpeed;
	}
	else if ( bLeft != false )
	{
		lpObj->m_AttackSpeed += Left->m_AttackSpeed;
		lpObj->m_MagicSpeed += Left->m_AttackSpeed;
	}

	if ( lpObj->Class != CLASS_FIGHTER ) // Rage Fighter - No Gloves
	{
		if ( Gloves->m_Type != -1 )
		{
			if ( Gloves->m_IsValidItem != false )
			{
				lpObj->m_AttackSpeed += Gloves->m_AttackSpeed;
				lpObj->m_MagicSpeed += Gloves->m_AttackSpeed;
			}
		}
	}

	if ( Amulet->m_Type != -1 ) // Pendant
	{
		if ( Amulet->m_IsValidItem != false )
		{
			lpObj->m_AttackSpeed += Amulet->m_AttackSpeed;
			lpObj->m_MagicSpeed += Amulet->m_AttackSpeed;
		}
	}
	// ----------------------------------------
	// Wizard Ring Effect
	// ----------------------------------------
	if ( (lpObj->pInventory[10].IsItem() == TRUE && lpObj->pInventory[10].m_Type == ITEMGET(13,20) && lpObj->pInventory[10].m_Level == 0 && lpObj->pInventory[10].m_Durability > 0.0f ) || (lpObj->pInventory[11].IsItem() == TRUE && lpObj->pInventory[11].m_Type == ITEMGET(13,20) && lpObj->pInventory[11].m_Level == 0 && lpObj->pInventory[11].m_Durability > 0.0f ) )
	{
		lpObj->m_AttackDamageMinRight += lpObj->m_AttackDamageMinRight * 10 / 100;
		lpObj->m_AttackDamageMaxRight += lpObj->m_AttackDamageMaxRight * 10 / 100;
		lpObj->m_AttackDamageMinLeft += lpObj->m_AttackDamageMinLeft * 10 / 100;
		lpObj->m_AttackDamageMaxLeft += lpObj->m_AttackDamageMaxLeft * 10 / 100;
		lpObj->m_MagicDamageMin += lpObj->m_MagicDamageMin * 10 / 100;
		lpObj->m_MagicDamageMax += lpObj->m_MagicDamageMax * 10 / 100;
		lpObj->m_AttackSpeed += 10;
		lpObj->m_MagicSpeed += 10;
	}
	// ----------------------------------------
	// Speed Hack Detect
	// ----------------------------------------
	switch ( lpObj->Class )
	{
	case CLASS_WIZARD:
		lpObj->m_DetectSpeedHackTime = (gAttackSpeedTimeLimit - (lpObj->m_MagicSpeed*2 * gDecTimePerAttackSpeed) );
		break;
	case CLASS_KNIGHT:
		lpObj->m_DetectSpeedHackTime = (gAttackSpeedTimeLimit - (lpObj->m_AttackSpeed * gDecTimePerAttackSpeed) );
		break;
	case CLASS_ELF:
		lpObj->m_DetectSpeedHackTime = (gAttackSpeedTimeLimit - (lpObj->m_AttackSpeed * gDecTimePerAttackSpeed) );
		break;
	case CLASS_MAGUMSA:
		lpObj->m_DetectSpeedHackTime = (gAttackSpeedTimeLimit - (lpObj->m_AttackSpeed * gDecTimePerAttackSpeed) );
		break;
	case CLASS_DARKLORD:
		lpObj->m_DetectSpeedHackTime = (gAttackSpeedTimeLimit - (lpObj->m_AttackSpeed * gDecTimePerAttackSpeed) );
		break;
	case CLASS_SUMMONER:
		lpObj->m_DetectSpeedHackTime = (gAttackSpeedTimeLimit - (lpObj->m_MagicSpeed*2 * gDecTimePerAttackSpeed) );
		break;
	case CLASS_FIGHTER:
		lpObj->m_DetectSpeedHackTime = (gAttackSpeedTimeLimit - (lpObj->m_MagicSpeed*2 * gDecTimePerAttackSpeed) );
		break;
	}
	
	if ( lpObj->m_DetectSpeedHackTime < gMinimumAttackSpeedTime )
	{
		lpObj->m_DetectSpeedHackTime = gMinimumAttackSpeedTime;
	}
	// ----------------------------------------
	// Successful Blocking
	// ----------------------------------------
	switch ( lpObj->Class )
	{
	case CLASS_WIZARD:		lpObj->m_SuccessfulBlocking = Dexterity / 3;	break;
	case CLASS_KNIGHT:		lpObj->m_SuccessfulBlocking = Dexterity / 3;	break;
	case CLASS_ELF:			lpObj->m_SuccessfulBlocking = Dexterity / 4;	break;
	case CLASS_MAGUMSA:		lpObj->m_SuccessfulBlocking = Dexterity / 3;	break;
	case CLASS_DARKLORD:	lpObj->m_SuccessfulBlocking = Dexterity / 7;	break;
	case CLASS_SUMMONER:	lpObj->m_SuccessfulBlocking = Dexterity / 3;	break;
	case CLASS_FIGHTER:		lpObj->m_SuccessfulBlocking = Dexterity / 5;	break;
	}
	
	if ( Left->m_Type != -1 )
	{
		if ( Left->m_IsValidItem != false )
		{
			lpObj->m_SuccessfulBlocking += Left->m_SuccessfulBlocking;
			Left->PlusSpecial(&lpObj->m_SuccessfulBlocking, 82);
		}
	}
	// ----------------------------------------
	// Character Set & Succesful Blocking
	// ----------------------------------------
	bool Success = true;

	if ( lpObj->Class == CLASS_MAGUMSA ) // Magic Gladiator (No Helmet)
	{
		for ( int j=3;j<=6;j++)
		{
			if ( lpObj->pInventory[j].m_Type == -1 )
			{
				Success = false;
				break;
			}

			if ( lpObj->pInventory[j].m_IsValidItem == false )
			{
				Success = false;
				break;
			}
		}
	}
	else if ( lpObj->Class == CLASS_FIGHTER ) // Rage Fighter (No Gloves)
	{
		for ( int l=2;l<6;l++)
		{
			if ( l != 5 )
			{
				if ( lpObj->pInventory[l].m_Type == -1 )
				{
					Success = false;
					break;
				}

				if ( lpObj->pInventory[l].m_IsValidItem == false )
				{
					Success = false;
					break;
				}
			}
		}

	}
	else // Dark Wizard, Dark Knight, Dark Lord, Elf, Summoner (All Set)
	{
		for  ( int k=2;k<=6;k++)
		{
			if ( lpObj->pInventory[k].m_Type == -1 )
			{
				Success = false;
				break;
			}

			if ( lpObj->pInventory[k].m_IsValidItem == false )
			{
				Success = false;
				break;
			}
		}
	}

	int Level11Count = 0;
	int Level10Count = 0;
	int Level12Count = 0;
	int Level13Count = 0;
	int Level14Count = 0;
	int Level15Count = 0;

	if ( Success != false )
	{
		int in;

		if ( lpObj->Class == CLASS_MAGUMSA ) // Magic Gladiator (No Helmet)
		{
			in = Armor->m_Type % MAX_SUBTYPE_ITEMS;

			if ( in != ITEMGET(0,15) &&
				 in != ITEMGET(0,20) &&
				 in != ITEMGET(0,23) &&
				 in != ITEMGET(0,32) &&
				 in != ITEMGET(0,37) )
			{
				Success = false;
			}
			else
			{
				Level15Count++;

				for (int m=3;m<=6;m++)
				{
					if ( in != ( lpObj->pInventory[m].m_Type % MAX_SUBTYPE_ITEMS) )
					{
						Success = false;
					}
					if ( lpObj->pInventory[m].m_Level > 14 )
					{
						Level15Count++;
					}
					else if ( lpObj->pInventory[m].m_Level > 13 )
					{
						Level14Count++;
					}
					else if ( lpObj->pInventory[m].m_Level > 12 )
					{
						Level13Count++;
					}
					else if ( lpObj->pInventory[m].m_Level > 11 )
					{
						Level12Count++;
					}
					else if ( lpObj->pInventory[m].m_Level > 10 )
					{
						Level11Count++;
					}
					else if ( lpObj->pInventory[m].m_Level > 9 )
					{
						Level10Count++;
					}
				}
			}
		}
		if ( lpObj->Class == CLASS_FIGHTER ) // Rage Fighter (No Gloves)
		{
			in = Boots->m_Type % MAX_SUBTYPE_ITEMS;

			if ( in != ITEMGET(0,59) &&
				 in != ITEMGET(0,60) &&
				 in != ITEMGET(0,61) )
			{
				Success = false;
			}
			else
			{
				Level15Count++;

				for (int m=2;m<=6;m++)
				{
					if (m != 5)
					{
						if ( in != ( lpObj->pInventory[m].m_Type % MAX_SUBTYPE_ITEMS) )
						{
							Success = false;
						}
						if ( lpObj->pInventory[m].m_Level > 14 )
						{
							Level15Count++;
						}
						else if ( lpObj->pInventory[m].m_Level > 13 )
						{
							Level14Count++;
						}
						else if ( lpObj->pInventory[m].m_Level > 12 )
						{
							Level13Count++;
						}
						else if ( lpObj->pInventory[m].m_Level > 11 )
						{
							Level12Count++;
						}
						else if ( lpObj->pInventory[m].m_Level > 10 )
						{
							Level11Count++;
						}
						else if ( lpObj->pInventory[m].m_Level > 9 )
						{
							Level10Count++;
						}
					}
				}
			}
		}
		else // Dark Knight, Dark Wizard, Elf, Dark Lord, Summoner (All Set)
		{
			in = lpObj->pInventory[2].m_Type % MAX_SUBTYPE_ITEMS;

			for (int m=2;m<=6;m++)
			{
				if ( in !=  ( lpObj->pInventory[m].m_Type % MAX_SUBTYPE_ITEMS) )
				{
					Success = false;
				}
				if ( lpObj->pInventory[m].m_Level > 14 )
				{
					Level15Count++;
				}
				else if ( lpObj->pInventory[m].m_Level > 13 )
				{
					Level14Count++;
				}
				else if ( lpObj->pInventory[m].m_Level > 12 )
				{
					Level13Count++;
				}
				else if ( lpObj->pInventory[m].m_Level > 11 )
				{
					Level12Count++;
				}
				else if ( lpObj->pInventory[m].m_Level > 10 )
				{
					Level11Count++;
				}
				else if ( lpObj->pInventory[m].m_Level > 9 )
				{
					Level10Count++;
				}
			}
		}

		if ( Success != false )	// #warning unuseful if
		{
			lpObj->m_SuccessfulBlocking += lpObj->m_SuccessfulBlocking / 10;
		}
	}
	// ----------------------------------------
	// Character Defense
	// ----------------------------------------
	switch ( lpObj->Class )
	{
	case CLASS_WIZARD:		lpObj->m_Defense = Dexterity / 4;	break;
	case CLASS_KNIGHT:		lpObj->m_Defense = Dexterity / 3;	break;
	case CLASS_ELF:			lpObj->m_Defense = Dexterity / 10;	break;
	case CLASS_MAGUMSA:		lpObj->m_Defense = Dexterity / 4;	break;
	case CLASS_DARKLORD:	lpObj->m_Defense = Dexterity / 7;	break;
	case CLASS_SUMMONER:	lpObj->m_Defense = Dexterity / 4;	break;
	case CLASS_FIGHTER:		lpObj->m_Defense = Dexterity / 4;	break;
	}
	
	if ( lpObj->Class == CLASS_MAGUMSA ) // Magic Gladiator (No Helm)
	{
		lpObj->m_Defense += Armor->ItemDefense();
		lpObj->m_Defense += Pants->ItemDefense();
		lpObj->m_Defense += Gloves->ItemDefense();
		lpObj->m_Defense += Boots->ItemDefense();
		lpObj->m_Defense += Left->ItemDefense();
		lpObj->m_Defense += Wings->ItemDefense();
	}
	else if ( lpObj->Class == CLASS_FIGHTER ) // Rage Fighter (No Gloves)
	{
		lpObj->m_Defense += Helm->ItemDefense();
		lpObj->m_Defense += Armor->ItemDefense();
		lpObj->m_Defense += Pants->ItemDefense();
		lpObj->m_Defense += Boots->ItemDefense();
		lpObj->m_Defense += Left->ItemDefense();
		lpObj->m_Defense += Wings->ItemDefense();
	}
	else // Dark Wizard, Dark Knight, Elf, Dark Lord, Summoner (All Set)
	{
		lpObj->m_Defense += Helm->ItemDefense();
		lpObj->m_Defense += Armor->ItemDefense();
		lpObj->m_Defense += Pants->ItemDefense();
		lpObj->m_Defense += Gloves->ItemDefense();
		lpObj->m_Defense += Boots->ItemDefense();
		lpObj->m_Defense += Left->ItemDefense();
		lpObj->m_Defense += Wings->ItemDefense();
	}

	if ( Helper->IsItem() != FALSE )
	{
		if ( Helper->m_Type == ITEMGET(13,4) && Helper->m_Durability > 0.0f ) // Dark Horse
		{
			lpObj->m_Defense += INT( Dexterity / 20 + 5 + Helper->m_PetItem_Level * 2 );
		}
	}

	if ( (Level15Count + Level14Count + Level13Count + Level12Count + Level11Count + Level10Count) >= 5 )
	{
		if ( Success != false )
		{
			if ( Level15Count == 5 )
			{
				lpObj->m_Defense += lpObj->m_Defense * 30 / 100;
			}
			else if ( Level14Count == 5 || (Level14Count + Level15Count) == 5 )
			{
				lpObj->m_Defense += lpObj->m_Defense * 25 / 100;
			}
			else if ( Level13Count == 5 || (Level13Count + Level14Count + Level15Count) == 5 )
			{
				lpObj->m_Defense += lpObj->m_Defense * 20 / 100;
			}
			else if ( Level12Count == 5 || (Level12Count + Level13Count + Level14Count + Level15Count) == 5 )
			{
				lpObj->m_Defense += lpObj->m_Defense * 15 / 100;
			}
			else if ( Level11Count == 5 || (Level11Count + Level12Count + Level13Count + Level14Count + Level15Count) == 5 )
			{
				lpObj->m_Defense += lpObj->m_Defense * 10 / 100;
			}
			else if ( Level10Count == 5 || (Level10Count + Level11Count + Level12Count + Level13Count + Level14Count + Level15Count) == 5)
			{
				lpObj->m_Defense += lpObj->m_Defense * 5 / 100;
			}
		}
	}

	lpObj->m_Defense = lpObj->m_Defense * 10 / 20;
	// ----------------------------------------
	// Transformation Rings
	// ----------------------------------------
	if ( lpObj->m_Change == 9 ) // Thunder Lich Change
	{
		// Add Magic Power Here
	}
	else if ( lpObj->m_Change == 41 ) // Death Cow Change
	{
		lpObj->AddLife = ((int)(lpObj->MaxLife * 20.0f))/100;
	}
	else if ( lpObj->m_Change == 372 ) // Don't Know
	{
		lpObj->m_Defense += lpObj->m_Defense / 10;
		lpObj->AddLife += lpObj->Level;
	}
	// ----------------------------------------
	// Pets
	// ----------------------------------------
	if ( Helper->m_Type == ITEMGET(13,0) ) // Guardian Angel
	{
		lpObj->AddLife += 50;
	}
	else if ( Helper->m_Type == ITEMGET(13,1) ) // Imp
	{
		//Add 30% to Attack
		lpObj->m_AttackDamageMinLeft	+= (lpObj->m_AttackDamageMinLeft*30)/100;
		lpObj->m_AttackDamageMaxLeft	+= (lpObj->m_AttackDamageMaxLeft*30)/100;
		lpObj->m_AttackDamageMinRight	+= (lpObj->m_AttackDamageMinRight*30)/100;
		lpObj->m_AttackDamageMaxRight	+= (lpObj->m_AttackDamageMaxRight*30)/100;
		//Add 30% to Magic Attack
		lpObj->m_MagicDamageMin			+= (lpObj->m_MagicDamageMin*30)/100;
		lpObj->m_MagicDamageMax			+= (lpObj->m_MagicDamageMax*30)/100;
	}
	else if ( Helper->m_Type == ITEMGET(13,3) ) // Dinorant
	{
		//Helper->PlusSpecial(&lpObj->AddBP, 103 );
		//Add 15% to Attack
		lpObj->m_AttackDamageMinLeft	+= (lpObj->m_AttackDamageMinLeft*15)/100;
		lpObj->m_AttackDamageMaxLeft	+= (lpObj->m_AttackDamageMaxLeft*15)/100;
		lpObj->m_AttackDamageMinRight	+= (lpObj->m_AttackDamageMinRight*15)/100;
		lpObj->m_AttackDamageMaxRight	+= (lpObj->m_AttackDamageMaxRight*15)/100;
		//Add 15% to Magic Attack
		lpObj->m_MagicDamageMin			+= (lpObj->m_MagicDamageMin*15)/100;
		lpObj->m_MagicDamageMax			+= (lpObj->m_MagicDamageMax*15)/100;
	}
	else if ( Helper->m_Type == ITEMGET(13,64) ) // Demon
	{
		//Add 40% to Attack
		lpObj->m_AttackDamageMinLeft	+= (lpObj->m_AttackDamageMinLeft*40)/100;
		lpObj->m_AttackDamageMaxLeft	+= (lpObj->m_AttackDamageMaxLeft*40)/100;
		lpObj->m_AttackDamageMinRight	+= (lpObj->m_AttackDamageMinRight*40)/100;
		lpObj->m_AttackDamageMaxRight	+= (lpObj->m_AttackDamageMaxRight*40)/100;
		//Add +10 to Attack Speed
		lpObj->m_MagicSpeed += 10;
		lpObj->m_AttackSpeed += 10;
		//Add 40% to Magic Attack
		lpObj->m_MagicDamageMin			+= (lpObj->m_MagicDamageMin*40)/100;
		lpObj->m_MagicDamageMax			+= (lpObj->m_MagicDamageMax*40)/100;
	}
	else if ( Helper->m_Type == ITEMGET(13,65) ) // Spirit Guardian
	{
		lpObj->AddLife					+= 50;
	}
	else if ( Helper->m_Type == ITEMGET(13,80) ) // Pet Panda
	{
		lpObj->m_Defense				+= 50;
	}
	else if ( Helper->m_Type == ITEMGET(13,123) ) // Skeleton Pet
	{
		//Add 20% to Attack
		lpObj->m_AttackDamageMinLeft	+= (lpObj->m_AttackDamageMinLeft*20)/100;
		lpObj->m_AttackDamageMaxLeft	+= (lpObj->m_AttackDamageMaxLeft*20)/100;
		lpObj->m_AttackDamageMinRight	+= (lpObj->m_AttackDamageMinRight*20)/100;
		lpObj->m_AttackDamageMaxRight	+= (lpObj->m_AttackDamageMaxRight*20)/100;
		//Add +10 to Attack Speed
		lpObj->m_MagicSpeed += 10;
		lpObj->m_AttackSpeed += 10;
		//Add 20% to Magic Attack
		lpObj->m_MagicDamageMin			+= (lpObj->m_MagicDamageMin*20)/100;
		lpObj->m_MagicDamageMax			+= (lpObj->m_MagicDamageMax*20)/100;
	}
	int addlife = 0;
	int addmana = 0;

	Wings->PlusSpecial(&addlife, 100);
	Wings->PlusSpecial(&addmana, 101);
	Wings->PlusSpecial(&AddLeadership, 105);
	lpObj->AddLeadership = AddLeadership;
	lpObj->AddLife += addlife;
	lpObj->AddMana += addmana;

	if ( lpObj->Type == OBJ_USER )
	{
		gDarkSpirit[lpObj->m_Index].Set(lpObj->m_Index, &lpObj->pInventory[1]);
	}

	Amulet->PlusSpecialPercentEx(&lpObj->AddBP, lpObj->MaxBP, 173);
	Ring01->PlusSpecialPercentEx(&lpObj->AddMana, lpObj->MaxMana, 172);
	Ring02->PlusSpecialPercentEx(&lpObj->AddMana, lpObj->MaxMana, 172);

	CItem * rItem[3];
	int comparecount = 0;
	
	rItem[0] = &lpObj->pInventory[10];
	rItem[1] = &lpObj->pInventory[11];
	rItem[2] = &lpObj->pInventory[9];

#define GET_MAX_RESISTANCE(x,y,z) ( ( ( ( (x) > (y) ) ? (x) : (y) ) > (z) ) ? ( ( (x) > (y) ) ? (x) : (y) ) : (z) )	

	lpObj->m_Resistance[1] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[1], rItem[1]->m_Resistance[1], rItem[2]->m_Resistance[1]);
	lpObj->m_Resistance[0] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[0], rItem[1]->m_Resistance[0], rItem[2]->m_Resistance[0]);
	lpObj->m_Resistance[2] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[2], rItem[1]->m_Resistance[2], rItem[2]->m_Resistance[2]);
	lpObj->m_Resistance[3] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[3], rItem[1]->m_Resistance[3], rItem[2]->m_Resistance[3]);
	lpObj->m_Resistance[4] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[4], rItem[1]->m_Resistance[4], rItem[2]->m_Resistance[4]);
	lpObj->m_Resistance[5] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[5], rItem[1]->m_Resistance[5], rItem[2]->m_Resistance[5]);
	lpObj->m_Resistance[6] = GET_MAX_RESISTANCE(rItem[0]->m_Resistance[6], rItem[1]->m_Resistance[6], rItem[2]->m_Resistance[6]);


	g_Item380System.ApplyFor380Option(lpObj);
	g_kJewelOfHarmonySystem.SetApplyStrengthenItem(lpObj);
	gItemSocket.ApplyEffect(lpObj);
	gSkillTree.ApplyEffect(lpObj);

	GObjExtItemApply(lpObj);
	gObjSetItemApply(lpObj);
	gObjNextExpCal(lpObj);

	if ( (Left->m_Type >= ITEMGET(4,0) && Left->m_Type < ITEMGET(4,7) ) ||
		  Left->m_Type == ITEMGET(4,17) ||
		  Left->m_Type == ITEMGET(4,20) ||
		  Left->m_Type == ITEMGET(4,21) ||
		  Left->m_Type == ITEMGET(4,22) ||
		  Left->m_Type == ITEMGET(4,23) ||
		  Left->m_Type == ITEMGET(4,24)  )
	{
		if ( Right->m_Type == ITEMGET(4,15) && Right->m_Level == 1 )
		{
			lpObj->m_AttackDamageMinLeft += (WORD)(lpObj->m_AttackDamageMinLeft * 0.03f + 1.0f);
			lpObj->m_AttackDamageMaxLeft += (WORD)(lpObj->m_AttackDamageMaxLeft * 0.03f + 1.0f);
		}
		else if ( Right->m_Type == ITEMGET(4,15) && Right->m_Level == 2 )
		{
			lpObj->m_AttackDamageMinLeft += (WORD)(lpObj->m_AttackDamageMinLeft * 0.05f + 1.0f);
			lpObj->m_AttackDamageMaxLeft += (WORD)(lpObj->m_AttackDamageMaxLeft * 0.05f + 1.0f);
		}
	}
	else if ( (Right->m_Type >= ITEMGET(4,8) && Right->m_Type < ITEMGET(4,15) ) ||
		      (Right->m_Type >= ITEMGET(4,16) && Right->m_Type < ITEMGET(5,0)) )
	{
		if ( Left->m_Type == ITEMGET(4,7) && Left->m_Level == 1 )
		{
				lpObj->m_AttackDamageMinRight += (WORD)(lpObj->m_AttackDamageMinRight * 0.03f + 1.0f);
				lpObj->m_AttackDamageMaxRight += (WORD)(lpObj->m_AttackDamageMaxRight * 0.03f + 1.0f);
		}
		else if ( Left->m_Type == ITEMGET(4,7) && Left->m_Level == 2 )
		{
				lpObj->m_AttackDamageMinRight += (WORD)(lpObj->m_AttackDamageMinRight * 0.05f + 1.0f);
				lpObj->m_AttackDamageMaxRight += (WORD)(lpObj->m_AttackDamageMaxRight * 0.05f + 1.0f);
		}
	}

	if ( lpObj->Class == CLASS_KNIGHT || lpObj->Class == CLASS_MAGUMSA || lpObj->Class == CLASS_DARKLORD || lpObj->Class == CLASS_FIGHTER )
	{
		if ( Right->m_Type != -1 && Left->m_Type != -1 )
		{
			if ( Right->m_Type >= ITEMGET(0,0) && Right->m_Type < ITEMGET(4,0) && Left->m_Type >= ITEMGET(0,0) && Left->m_Type < ITEMGET(4,0) )
			{
				lpObj->m_AttackDamageMinRight = lpObj->m_AttackDamageMinRight * 55 / 100;
				lpObj->m_AttackDamageMaxRight = lpObj->m_AttackDamageMaxRight * 55 / 100;
				lpObj->m_AttackDamageMinLeft = lpObj->m_AttackDamageMinLeft * 55 / 100;
				lpObj->m_AttackDamageMaxLeft = lpObj->m_AttackDamageMaxLeft * 55 / 100;
			}
		}
	}

	if ( lpObj->m_iItemEffectValidTime > 0 )
	{
		g_ItemAddOption.NextSetItemLastEffectForHallowin(lpObj);
	}

	gObjCalcShieldPoint(lpObj);

	if ( lpObj->iShield > ( lpObj->iMaxShield + lpObj->iAddShield ) )
	{
		lpObj->iShield = lpObj->iMaxShield + lpObj->iAddShield ;
		GCReFillSend(lpObj->m_Index, lpObj->Life, 0xFF, 0, lpObj->iShield);
	}

	GCReFillSend(lpObj->m_Index, lpObj->MaxLife + lpObj->AddLife, 0xFE, 0, lpObj->iMaxShield + lpObj->iAddShield);
	GCManaSend(lpObj->m_Index, lpObj->MaxMana + lpObj->AddMana, 0xFE, 0, lpObj->MaxBP + lpObj->AddBP);
}
Exemplo n.º 21
0
bool CItemAddOption::_ClearItemEffect(LPOBJ lpObj, int iEffectOption, int iOptionType, int iEffectType, int iEffectValue) //GS-CS Decompiled 100% PS: Only MapMoveBound Removed. Struct preserved.
{
	if ( iEffectType <= 0 )
		return false;

	switch ( iEffectType )
	{
		case ADD_OPTION_LIFE:
			lpObj->AddLife -= iEffectValue;

			if ( (lpObj->AddLife + lpObj->MaxLife ) < lpObj->Life )
				lpObj->Life = lpObj->AddLife + lpObj->MaxLife;

			GCReFillSend(lpObj->m_Index, lpObj->Life, 0xFF, 0, lpObj->iShield);
			GCReFillSend(lpObj->m_Index, lpObj->MaxLife + lpObj->AddLife, 0xFE, 0, lpObj->iMaxShield + lpObj->iAddShield);
			break;

		case ADD_OPTION_MANA:
			lpObj->AddMana -= iEffectValue;

			if ( (lpObj->AddMana + lpObj->MaxMana ) < lpObj->Mana )
				lpObj->Mana = lpObj->AddMana + lpObj->MaxMana;


			GCManaSend(lpObj->m_Index, lpObj->Mana, -1, 0, lpObj->BP);
			GCManaSend(lpObj->m_Index, lpObj->AddMana + lpObj->MaxMana, 0xFE, 0, lpObj->MaxBP + lpObj->AddBP);
			break;

		case ADD_OPTION_ATTACK_DAMAGE:
			lpObj->m_AttackDamageMaxLeft -= iEffectValue;
			lpObj->m_AttackDamageMinLeft -= iEffectValue;
			lpObj->m_AttackDamageMaxRight -= iEffectValue;
			lpObj->m_AttackDamageMinRight -= iEffectValue;
			lpObj->m_MagicDamageMin -= iEffectValue;
			lpObj->m_MagicDamageMax -= iEffectValue;
			break;

		case ADD_OPTION_SPEED:
			lpObj->m_AttackSpeed -= iEffectValue;
			lpObj->m_MagicSpeed -= iEffectValue;
			break;

		case ADD_OPTION_EXPERIENCE:
			lpObj->m_wExprienceRate = 100;
			lpObj->m_btMoveMapBound = 0;
			break;

		case ADD_OPTION_DROP_RATE:
			lpObj->m_wItemDropRate = 100;
			lpObj->m_btMoveMapBound = 0;
			break;

		case 8:
			lpObj->m_wExprienceRate = 100;
			lpObj->m_btMoveMapBound = 0;
			break;

		case ADD_OPTION_DEFENSE:
			lpObj->m_Defense -= iEffectValue * 10 / 20;
			break;

		case ADD_OPTION_STRENGTH:
			lpObj->Strength -= iEffectValue;
			break;

		case ADD_OPTION_DEXTERITY:
			lpObj->Dexterity -= iEffectValue;
			break;

		case ADD_OPTION_VITALITY:
			lpObj->Vitality -= iEffectValue;
			break;

		case ADD_OPTION_ENERGY:
			lpObj->Energy -= iEffectValue;
			break;

		case ADD_OPTION_LEADERSHIP:
			lpObj->Leadership -= iEffectValue;
			break;
		case ADD_OPTION_FORCE:
			lpObj->m_AttackDamageMaxLeft -= iEffectValue;
			lpObj->m_AttackDamageMinLeft -= iEffectValue;
			lpObj->m_AttackDamageMaxRight -= iEffectValue;
			lpObj->m_AttackDamageMinRight -= iEffectValue;
			break;
		case ADD_OPTION_MAGIC:
			lpObj->m_MagicDamageMin -= iEffectValue;
			lpObj->m_MagicDamageMax -= iEffectValue;
			break;
		case ADD_OPTION_MOVEABLE:
			lpObj->m_btMoveMapBound = 0;
			//Do nothing cuz mapmovebound is removed
			break;
		case ADD_OPTION_MASTEREXPERIENCE:
			lpObj->m_wMasterExperienceRate = 100;
			break;
		case ADD_OPTION_CRITICALDMG:
			lpObj->m_CriticalDamage -= iEffectValue;
			break;
		case ADD_OPTION_EXCDMG:
			lpObj->m_ExcelentDamage -= iEffectValue;
			break;

		default:
			return false;
	}

	LogAddTD("[ItemAddOption] (%s)(%s) Clear Effect: %d Value: %d", lpObj->AccountID, lpObj->Name, iEffectType, iEffectValue);

	return true;
}
Exemplo n.º 22
0
//005535a0	-> 100%
int	CMasterLevelSystem::MasterLevelUp(LPOBJ lpObj, __int64 iAddExp, bool bEventMapReward, int iMonsterType)	//OK
{
	if( !this->IsMasterLevelUser(lpObj) )
	{
		return false;
	}
	int m_maxMasterLevel = GetPrivateProfileInt("Common", "MaxMasterLevel", 200, gDirPath.GetNewPath("MasterSystem.cfg"));
	int numCoded = 201;
	if (m_maxMasterLevel >= numCoded || m_maxMasterLevel <= 0){
		int m_maxMasterLevel = 200;
		
	}
	// ----
	if (lpObj->m_nMasterLevel >= m_maxMasterLevel)
	{
		GCServerMsgStringSend(lMsg.Get(1136), lpObj->m_Index, 1);
		return false;
	}
	// ----
	if( bEventMapReward )	//-> New
	{
		iAddExp = iAddExp;	//???
	}
	else
	{
#ifdef GENS
		if( gGensSystem.IsMapBattleZone(lpObj->MapNumber) )	//-> Original g_GensSystem maybe
		{
			iAddExp = iAddExp * (this->m_fAddExpRate + g_MLBattleZoneAddExp);
		}
		else
		{
			iAddExp = iAddExp * this->m_fAddExpRate;
		}
#else
		iAddExp = iAddExp * this->m_fAddExpRate;
#endif
	}
	// ----
	if( lpObj->m_MPSkillOpt.MpsPlusExp > 0 )
	{
		iAddExp += iAddExp * lpObj->m_MPSkillOpt.MpsPlusExp / 100;
	}
	// ----
	if( iAddExp > 0 )
	{
		gObjSetExpPetItem(lpObj->m_Index, iAddExp);
		// ----
		LogAddTD("ML Experience : Map[%d]-(%d,%d) [%s][%s](%d) %I64d %I64d MonsterIndex : %d",	//-> Updated
          lpObj->MapNumber, lpObj->X, lpObj->Y, lpObj->AccountID,lpObj->Name,
          lpObj->m_nMasterLevel, lpObj->m_i64MasterLevelExp, iAddExp, iMonsterType);
		// ----
		if( iAddExp + lpObj->m_i64MasterLevelExp >= lpObj->m_i64NextMasterLevelExp )
		{
			iAddExp = 0;
			// -----
			int m_masterPointsPerLvl = GetPrivateProfileInt("Common", "MasterPointsPerLvl", 100, gDirPath.GetNewPath("MasterSystem.cfg"));
			int numCodeds = 101;
			if (m_maxMasterLevel >= numCodeds)
			{
				int m_masterPointsPerLvl = 1;
			}
			// -----
			lpObj->m_i64MasterLevelExp	= lpObj->m_i64NextMasterLevelExp;
			lpObj->m_nMasterLevel++;
			lpObj->m_iMasterLevelPoint += m_masterPointsPerLvl;	//-> In future can use it for change ml point per level)
			// -----
			gObjCalCharacter(lpObj->m_Index);
			// -----
			lpObj->MaxLife				+= DCInfo.DefClass[ lpObj->Class ].LevelLife;
			lpObj->MaxMana				+= DCInfo.DefClass[ lpObj->Class ].LevelMana;
			lpObj->Life					= lpObj->AddLife + lpObj->MaxLife;
			lpObj->Mana					= lpObj->AddMana + lpObj->MaxMana;
			// -----
			gObjCalcShieldPoint(lpObj);
			lpObj->iShield				= lpObj->iAddShield + lpObj->iMaxShield;
			// -----
			this->gObjNextMLExpCal(lpObj);
			// ----
			gObjCalcMaxLifePower(lpObj->m_Index);
			gObjSetBP(lpObj->m_Index);
			GJSetCharacterInfo(lpObj, lpObj->m_Index, 0, 0);
			this->GCMasterLevelUpInfo(lpObj);
			GCReFillSend(lpObj->m_Index, lpObj->Life, 0xFF, 0, lpObj->iShield);
			GCManaSend(lpObj->m_Index, lpObj->Mana, 0xFF, 0, lpObj->BP);	//-> Original name ->_BP
		}
		else
		{
			lpObj->m_i64MasterLevelExp += iAddExp;
		}
		// ----
		GCSendExp_INT64(lpObj->m_Index, 65535, iAddExp, 0, 0);		
	}
	// ----
	return true;
}
Exemplo n.º 23
0
//00553d40	-> 100%
void CMasterLevelSystem::DGAnsMasterLevelInfo(BYTE * aRecv)	//OK
{
	if( !aRecv )
	{
		return;
	}
	// ----
	MLP_ANS_MASTERLEVEL_INFO * lpRecvMsg = (MLP_ANS_MASTERLEVEL_INFO*)aRecv;
	// ----
	if( !gObjIsConnectedGP(lpRecvMsg->iUserIndex) )
	{
		return;
	}
	// ----
	int iIndex	= lpRecvMsg->iUserIndex;
	LPOBJ lpObj	= &gObj[lpRecvMsg->iUserIndex];
	// ---
	if( lpObj->m_bMasterLevelDBLoad )
	{
		return;
	}
	// ----
	if( !lpRecvMsg->btResult )
	{
		LogAddTD("[%s][%s] MasterLevel Info Load Fail", lpObj->AccountID, lpObj->Name);	//-> New
		return;
	}
	// ----
	if( lpRecvMsg->btResult == 1 )
	{
		if( lpObj->m_iMasterLevelPoint + lpRecvMsg->nMLPoint != lpRecvMsg->nMLevel )	//-> New (be good use MASTER_MAX_POINT for check)
		{
			LogAddTD("[%s][%s] MasterLevel Info Mismatch!! - Point(%d), Use Point(%d), Level(%d)",
				lpObj->AccountID, lpObj->Name,
				lpRecvMsg->nMLPoint, lpObj->m_bMasterLevelDBLoad, lpRecvMsg->nMLevel);
		}
		// ----
		lpObj->m_bMasterLevelDBLoad = 1;
		// ----
		if( lpRecvMsg->nMLevel == 0 && lpRecvMsg->i64NextMLExp == 0 )
		{
			lpObj->m_nMasterLevel			= lpRecvMsg->nMLevel;
			lpObj->m_i64MasterLevelExp		= lpRecvMsg->i64MLExp;
			lpObj->m_i64NextMasterLevelExp	= m_i64MasterLevelExpTlb[1];
			lpObj->m_iMasterLevelPoint		= lpRecvMsg->nMLPoint;
			// ----
			LogAddTD("[%s][%s] MasterLevel Info First Set [MLevel:%d][MLExp:%I64d][m_i64NextMasterLevelExp:%I64d][MLPoint:%d]",
				lpObj->AccountID, lpObj->Name, lpObj->m_nMasterLevel, 
				lpObj->m_i64MasterLevelExp, lpObj->m_i64NextMasterLevelExp, lpObj->m_iMasterLevelPoint);
			// ----
			this->GDReqMasterLevelInfoSave(lpObj);
		}
		else
		{
			lpObj->m_nMasterLevel			= lpRecvMsg->nMLevel;
			lpObj->m_i64MasterLevelExp		= lpRecvMsg->i64MLExp;
			lpObj->m_i64NextMasterLevelExp	= lpRecvMsg->i64NextMLExp;
			lpObj->m_iMasterLevelPoint		= lpRecvMsg->nMLPoint;
			// ----
			LogAddTD("[%s][%s] Recv MasterLevel Info [MLevel:%d][MLExp:%I64d][m_i64NextMasterLevelExp:%I64d][MLPoint:%d]", 
				lpObj->AccountID, lpObj->Name, lpObj->m_nMasterLevel, 
				lpObj->m_i64MasterLevelExp, lpObj->m_i64NextMasterLevelExp, lpObj->m_iMasterLevelPoint);
			// ----
			this->GDReqMasterLevelInfoSave(lpObj);
		}
		// ----
		lpObj->MaxLife = DCInfo.DefClass[lpObj->Class].Life + (lpObj->Level + lpObj->m_nMasterLevel - 1) * DCInfo.DefClass[lpObj->Class].LevelLife  + ((lpObj->Vitality - DCInfo.DefClass[lpObj->Class].Vitality ) * DCInfo.DefClass[lpObj->Class].VitalityToLife);
		// ----
		if( lpObj->Life > lpObj->MaxLife + lpObj->AddLife )
		{
			lpObj->Life = lpObj->MaxLife;
		}
		// ----
		lpObj->MaxMana = DCInfo.DefClass[lpObj->Class].Mana + (lpObj->Level + lpObj->m_nMasterLevel - 1) * DCInfo.DefClass[lpObj->Class].LevelMana  + ((lpObj->Energy - DCInfo.DefClass[lpObj->Class].Energy ) * DCInfo.DefClass[lpObj->Class].EnergyToMana);
		// ----
		if( lpObj->Mana > lpObj->MaxMana + lpObj->AddMana )
		{
			lpObj->Mana = lpObj->MaxMana;
		}
		// ----
		gObjCalcMaxLifePower(lpObj->m_Index);
		gObjSetBP(lpObj->m_Index);
		gObjCalcShieldPoint(lpObj);
		// ----
		lpObj->iShield = lpObj->iMaxShield + lpObj->iAddShield;
		// ----
		LogAddTD("[%s][%s] Reset Max Value For MasterLevel [MaxLife:%d][MaxMana:%d][MaxSD:%d]", lpObj->AccountID, lpObj->Name, lpObj->MaxLife, lpObj->MaxMana, lpObj->iShield);
		// ----
		this->GCMasterLevelInfo(lpObj);
		// ----
		GCReFillSend(lpObj->m_Index, lpObj->Life, -1, 0, lpObj->iShield);
		GCManaSend(lpObj->m_Index, lpObj->Mana, -1, 0, lpObj->BP);
	}
	// ----
	gObjCalCharacter(lpObj->m_Index);
	// -----
	gObjCalcMLSkillItemOption(lpObj);
	g_MasterSkillSystem.CGReqGetMasterLevelSkillTree(lpObj->m_Index);
}
Exemplo n.º 24
0
void CGuardianStatue::GuardianStatueAct(int iIndex)
{
	if ( !gObjIsConnected(iIndex))
		return;

	LPOBJ lpObj = &gObj[iIndex];

	if ( lpObj->VPCount < 1 ) 
		return;

	int tObjNum = -1;

	for (int i=0;i<MAX_VIEWPORT;i++)
	{
		tObjNum = lpObj->VpPlayer[i].number;

		if ( tObjNum >= 0 )
		{
			if ( gObj[tObjNum].Type == OBJ_USER && gObj[tObjNum].Live )
			{
				if ( gObj[tObjNum].m_btCsJoinSide == 1 )
				{
					if ( abs(lpObj->Y - gObj[tObjNum].Y) <= 3 &&
						 abs(lpObj->X - gObj[tObjNum].X) <= 3 )
					{
						BOOL bLifeChange = FALSE;
						BOOL bManaChange = FALSE;
						BOOL bBpChange = FALSE;

						/*gObj[tObjNum].Life += 100.0f;
						gObj[tObjNum].Mana += 100.0f;
						gObj[tObjNum].BP += 100;*/

						if ( gObj[tObjNum].Life < (gObj[tObjNum].MaxLife + gObj[tObjNum].AddLife))
						{
							gObj[tObjNum].Life += ( ( gObj[tObjNum].MaxLife + gObj[tObjNum].AddLife ) * (lpObj->m_btCsNpcRgLevel+1) ) / 100.0f;

							if ( gObj[tObjNum].Life > (gObj[tObjNum].MaxLife + gObj[tObjNum].AddLife))
								gObj[tObjNum].Life = gObj[tObjNum].MaxLife + gObj[tObjNum].AddLife;

							bLifeChange = TRUE;
						}

						if ( gObj[tObjNum].Mana < (gObj[tObjNum].MaxMana + gObj[tObjNum].AddMana))
						{
							gObj[tObjNum].Mana += ( ( gObj[tObjNum].MaxMana + gObj[tObjNum].AddMana ) * (lpObj->m_btCsNpcRgLevel+1) ) / 100.0f;

							if ( gObj[tObjNum].Mana > (gObj[tObjNum].MaxMana + gObj[tObjNum].AddMana))
								gObj[tObjNum].Mana = gObj[tObjNum].MaxMana + gObj[tObjNum].AddMana;

							bManaChange = TRUE;
						}

						if ( gObj[tObjNum].BP < (gObj[tObjNum].MaxBP + gObj[tObjNum].AddBP))
						{
							gObj[tObjNum].BP += ( ( gObj[tObjNum].MaxBP + gObj[tObjNum].AddBP ) * (lpObj->m_btCsNpcRgLevel+1) ) / 100;

							if ( gObj[tObjNum].BP > (gObj[tObjNum].MaxBP + gObj[tObjNum].AddBP))
								gObj[tObjNum].BP = gObj[tObjNum].MaxBP + gObj[tObjNum].AddBP;

							bBpChange = TRUE;
						}

						if (bLifeChange )
							GCReFillSend(tObjNum, (WORD)gObj[tObjNum].Life, 0xFF, 1, gObj[tObjNum].iShield);

						if (bManaChange ||bBpChange ) 
							GCManaSend(tObjNum, (short)gObj[tObjNum].Mana, 0xFF, 0, gObj[tObjNum].BP);
					}
				}
			}
		}
	}
}
Exemplo n.º 25
0
void CLifeStone::LifeStoneAct(int iIndex)
{
	if(gObjIsConnected(iIndex) == FALSE)
		return;

	LPOBJ lpObj = &gObj[iIndex];
	lpObj->m_iCreatedActivationTime++;

	BYTE btCreationState = lpObj->m_btCreationState;

	if(lpObj->m_iCreatedActivationTime < 60)
	{
		lpObj->m_btCreationState = lpObj->m_iCreatedActivationTime / 12;
	}
	else
	{
		lpObj->m_btCreationState = 5;
	}

	if(btCreationState != lpObj->m_btCreationState)
	{
		GCSendObjectCreationState(iIndex);
	}

	if(lpObj->m_btCreationState < 5)
		return;

	if(lpObj->VPCount < 1)
		return;

	int tObjNum = -1;

	for(int i = 0; i < MAX_VIEWPORT; i++)
	{
		tObjNum = lpObj->VpPlayer[i].number;

		if(tObjNum >= 0 
			&& gObj[tObjNum].Type == OBJ_USER
			&& gObj[tObjNum].Live != FALSE 
			&& gObj[tObjNum].m_btCsJoinSide == lpObj->m_btCsJoinSide
			&& abs(lpObj->Y - gObj[tObjNum].Y) <= 3
			&& abs(lpObj->X - gObj[tObjNum].X) <= 3)
		{
			int bLifeChange = FALSE;
			int bManaChange = FALSE;
			int bBpChange = FALSE;

			if(gObj[tObjNum].Life < gObj[tObjNum].MaxLife + gObj[tObjNum].AddLife)
			{
				gObj[tObjNum].Life += (gObj[tObjNum].MaxLife + gObj[tObjNum].AddLife) / 100.0f;// + gObj[tObjNum].Life;

				if(gObj[tObjNum].Life > gObj[tObjNum].MaxLife + gObj[tObjNum].AddLife)
				{
					gObj[tObjNum].Life = gObj[tObjNum].MaxLife + + gObj[tObjNum].AddLife;
				}

				bLifeChange = TRUE;
			}

			if(gObj[tObjNum].Mana < gObj[tObjNum].MaxMana + gObj[tObjNum].AddMana)
			{
				gObj[tObjNum].Mana += (gObj[tObjNum].MaxMana + gObj[tObjNum].AddMana) / 100.0f;// + gObj[tObjNum].Mana;

				if(gObj[tObjNum].Mana > gObj[tObjNum].MaxMana + gObj[tObjNum].AddMana)
				{
					gObj[tObjNum].Mana = gObj[tObjNum].MaxMana + gObj[tObjNum].AddMana;
				}

				bManaChange = TRUE;
			}

			if(gObj[tObjNum].BP < gObj[tObjNum].MaxBP + gObj[tObjNum].AddBP)
			{
				gObj[tObjNum].BP += (gObj[tObjNum].MaxBP + gObj[tObjNum].AddBP) / 100;// + gObj[tObjNum].BP;

				if(gObj[tObjNum].BP > gObj[tObjNum].MaxBP + gObj[tObjNum].AddBP)
				{
					gObj[tObjNum].BP = gObj[tObjNum].MaxBP + gObj[tObjNum].AddBP;
				}

				bBpChange = TRUE;
			}

			if(bLifeChange != FALSE)
			{
				GCReFillSend(tObjNum,(WORD)gObj[tObjNum].Life,0xFF,1,gObj[tObjNum].iShield);
			}

			if(bManaChange != FALSE || bBpChange != FALSE)
			{
				GCManaSend(tObjNum,(WORD)gObj[tObjNum].Mana,0xFF,0,gObj[tObjNum].BP);
			}
		}
	}
}
Exemplo n.º 26
0
void CSantaEvent::LittleSantaBuffer(LPOBJ lpObj,int Type)
{
	switch ( Type )
	{
	case 0:
		gSantaEvent.LittleSantaCancelBuffer(lpObj);
		GCStateInfoSend(lpObj,1,92);
		lpObj->LittleSantaTime1 = 30*60;
		lpObj->AddLife+=500;
		GCReFillSend(lpObj->m_Index,lpObj->MaxLife+lpObj->AddLife,0xFE,0,lpObj->iMaxShield+lpObj->iAddShield);
		break;
	case 1:
		gSantaEvent.LittleSantaCancelBuffer(lpObj);
		GCStateInfoSend(lpObj,1,95);
		lpObj->LittleSantaTime2 = 30*60;
		lpObj->m_Defense+=100;
		break;
	case 2:
		lpObj->Life = lpObj->MaxLife+lpObj->AddLife;
		GCReFillSend(lpObj->m_Index, lpObj->Life, 0xFF, 0, lpObj->iShield);
		break;
	case 3:
		lpObj->Mana = lpObj->MaxMana+lpObj->AddMana;
		GCManaSend(lpObj->m_Index,lpObj->Mana,0xFF,0,lpObj->BP);
		break;
	case 4:
		gSantaEvent.LittleSantaCancelBuffer(lpObj);
		GCStateInfoSend(lpObj,1,93);
		lpObj->LittleSantaTime3 = 30*60;
		lpObj->AddMana+=500;
		GCManaSend(lpObj->m_Index,lpObj->MaxMana+lpObj->AddMana,0xFE,0,lpObj->MaxBP+lpObj->AddBP);
		break;
	case 5:
		gSantaEvent.LittleSantaCancelBuffer(lpObj);
		GCStateInfoSend(lpObj,1,96);
		lpObj->LittleSantaTime4 = 30*60;
		lpObj->m_AttackSpeed+=15;
		lpObj->m_MagicSpeed+=15;
		break;
	case 6:
		gSantaEvent.LittleSantaCancelBuffer(lpObj);
		GCStateInfoSend(lpObj,1,94);
		lpObj->LittleSantaTime5 = 30*60;
		lpObj->m_AttackDamageLeft+=30;
		lpObj->m_AttackDamageRight+=30;
		lpObj->m_AttackDamageMinLeft+=30;
		lpObj->m_AttackDamageMaxLeft+=30;
		lpObj->m_AttackDamageMinRight+=30;
		lpObj->m_AttackDamageMaxRight+=30;
		lpObj->m_AttackDamageMax+=30;
		lpObj->m_AttackDamageMin+=30;
		lpObj->m_MagicDamageMax+=30;
		lpObj->m_MagicDamageMin+=30;
		break;
	case 7:
		gSantaEvent.LittleSantaCancelBuffer(lpObj);
		GCStateInfoSend(lpObj,1,97);
		lpObj->LittleSantaTime6 = 30*60;
		break;
	}
}