Пример #1
0
void CCrywolf::SetCrywolfAllCommonMonsterState(int iMonsterState, int iMode)
{
	for ( int i=0;i<this->m_ObjCommonMonster.m_iObjCount ; i++)
	{
		if ( !gObjIsConnected(this->m_ObjCommonMonster.m_iObjIndex[i]) )
			break;

		LPOBJ lpObj = &gObj[this->m_ObjCommonMonster.m_iObjIndex[i]];

		if ( iMode == 0 )
		{
			lpObj->m_ViewSkillState &= ~iMonsterState;
			GCStateInfoSend(lpObj, 0, lpObj->m_ViewSkillState);
		}
		else if ( iMode == 1 )
		{
			lpObj->m_ViewSkillState |= iMonsterState;
			GCStateInfoSend(lpObj, 1, lpObj->m_ViewSkillState);
		}
	}
}
Пример #2
0
void CCrywolfAltar::SetAltarViewState(int iClass, int iAltarState)
{
	int iAltarNumber = this->GetAlatarNumber(iClass);
	CCrywolfAltarInfo * AltarInfo = &this->m_AltarInfo[iAltarNumber];

	if ( AltarInfo->m_iAltarIndex == -1 )
		return;

	memset(gObj[AltarInfo->m_iAltarIndex].m_ViewSkillState, 0, sizeof(gObj[AltarInfo->m_iAltarIndex].m_ViewSkillState));
	gObj[AltarInfo->m_iAltarIndex].m_ViewSkillState[eVS_POTION_SOUL] = 1;
	GCStateInfoSend(&gObj[AltarInfo->m_iAltarIndex], 1, eVS_POTION_SOUL);
}
Пример #3
0
BOOL TMonsterAIElement::ApplyElementHealSelf(int iIndex, int iTargetIndex, TMonsterAIState * pAIState)
{
	LPOBJ lpObj = &gObj[iIndex];
	UTIL.SendCrywolfChattingMsg(iIndex, "Element-셀프치료");

	lpObj->Life += lpObj->Life * 20.0f / 100.0f;
	UTIL.SendCrywolfChattingMsg(iIndex, "HP : %d", (int)lpObj->Life);
	lpObj->m_ViewSkillState |= 8;
	GCStateInfoSend(lpObj, 1, lpObj->m_ViewSkillState);

	return FALSE;
}
Пример #4
0
BOOL CCrywolfAltar::SetAltarUserIndex(int iAltarObjIndex, int iClass, int iUserIndex)
{
	int iAltarNumber = this->GetAlatarNumber(iClass);
	CCrywolfAltarInfo * AltarInfo = &this->m_AltarInfo[iAltarNumber];
	DWORD dwCurrentTime = GetTickCount();

	if ( gObjIsConnected(AltarInfo->m_iUserIndex) != FALSE )
	{
		MsgOutput(iUserIndex, lMsg.Get(MSGGET(12, 253)), iAltarNumber);
		return FALSE;
	}

	if ( (dwCurrentTime-AltarInfo->m_dwLastValidContractTime) < 10000 )
	{
		MsgOutput(iUserIndex, lMsg.Get(MSGGET(12, 254)), iAltarNumber);
		return FALSE;
	}

	if ( AltarInfo->m_iContractCount > MAX_ALTAR_CONTRACTS ) 
	{
		MsgOutput(iUserIndex, lMsg.Get(MSGGET(12, 255)), iAltarNumber);
		return FALSE;
	}

	if ( abs(gObj[iAltarObjIndex].Y - gObj[iUserIndex].Y) > 0 || abs(gObj[iAltarObjIndex].X - gObj[iUserIndex].X) > 0 )
	{
		MsgOutput(iUserIndex, lMsg.Get(MSGGET(13, 0)), iAltarNumber);
		return FALSE;
	}

	AltarInfo->SetAltarState(2);
	AltarInfo->m_iUserIndex = iUserIndex;
	AltarInfo->m_dwAppliedContractTime = dwCurrentTime;
	AltarInfo->m_dwValidContractTime = dwCurrentTime + 5000;	// It Get Active after 5 Seconds
	AltarInfo->m_dwLastValidContractTime = dwCurrentTime;
	AltarInfo->m_iContractCount++;

	memset(gObj[iAltarObjIndex].m_ViewSkillState, 0, sizeof(gObj[iAltarObjIndex].m_ViewSkillState));
	gObj[iAltarObjIndex].m_ViewSkillState[eVS_ALTAR_ATTEMP_CONTRACT] = 1;
	GCStateInfoSend(&gObj[iAltarObjIndex], 1, eVS_ALTAR_VALID_CONTRACT);

	UTIL.SendCrywolfUserAnyMsg(2, lMsg.Get(MSGGET(13, 1)), gObj[AltarInfo->m_iUserIndex].Name, iAltarNumber);

	CLog.LogAdd("[ Crywolf ][Altar Op.] [%s][%s] Attempt to contract Altar[%d]",
		gObj[AltarInfo->m_iUserIndex].AccountID, gObj[AltarInfo->m_iUserIndex].Name,
		iAltarNumber);

	MsgOutput(iUserIndex, lMsg.Get(MSGGET(13, 2)));
	MsgOutput(iUserIndex, lMsg.Get(MSGGET(13, 3)));

	return TRUE;
}
Пример #5
0
void CCrywolfAltar::ResetAltar(int iClass)
{
	int iAltarNumber = this->GetAlatarNumber(iClass);
	CCrywolfAltarInfo * AltarInfo = &this->m_AltarInfo[iAltarNumber];

	if ( AltarInfo->m_iAltarIndex == -1 )
		return;

	memset(gObj[AltarInfo->m_iAltarIndex].m_ViewSkillState, 0, sizeof(gObj[AltarInfo->m_iAltarIndex].m_ViewSkillState));
	GCStateInfoSend(&gObj[AltarInfo->m_iAltarIndex], 0, 0); // CHECAR

	AltarInfo->Reset();
}
BOOL TMonsterSkillElement::ApplyElementStun(int iIndex, int iTargetIndex)
{
	LPOBJ lpObj = &gObj[iIndex];
	LPOBJ lpTargetObj = &gObj[iTargetIndex];
	lpTargetObj->m_iSkillStunTime = this->m_iContinuanceTime;

	lpTargetObj->m_ViewSkillState[eVS_STUN] = 1;
	GCStateInfoSend(lpTargetObj, 1, eVS_STUN);

	gObjSetPosition(iTargetIndex, lpTargetObj->X, lpTargetObj->Y);

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

	lpTargetObj->m_MonsterSkillElementInfo.m_iSkillElementImmuneNumber = this->m_iNullifiedSkill;
	lpTargetObj->m_MonsterSkillElementInfo.m_iSkillElementImmuneTime = this->m_iContinuanceTime;

	lpTargetObj->m_ViewSkillState[eVS_ELEMENT_INMUNE] = 1;
	GCStateInfoSend(lpTargetObj, 1, eVS_ELEMENT_INMUNE);

	return FALSE;
}
void gObjSendBuffList(LPOBJ lpObj)
{
	if(lpObj == NULL)
		return;

	if(lpObj->Type != OBJ_USER)
		return;

	if(lpObj->btEffectCount <= 0)
		return;

	for(int i = 0; i < MAX_STATE_COUNT; i++)
	{
		if(lpObj->pEffectInfo[i].btEffectNum != NULL)
			GCStateInfoSend(lpObj, 1, lpObj->pEffectInfo[i].btEffectNum);
	}
}
Пример #9
0
BOOL NpcShadowPhantom(LPOBJ lpNpc, LPOBJ lpObj)
{
	if ( gObjIsConnected(lpObj->m_Index) == FALSE )
	{
		return TRUE;
	}

	if ( lpObj->Level > MAX_NPC_PHANTOM_BUFFER )
	{
		GCServerCmd(lpObj->m_Index, 0x0D, 0, 0);
		
		return TRUE;
	}

	lpObj->m_iSkillNPCHelpTime = GetTickCount();
	lpObj->m_iSkillNPCDefense = lpObj->Level / 5 + 50;	// FORMULA
	lpObj->m_iSkillNPCAttack = lpObj->Level / 3 + 45;	// FORMULA

	lpObj->m_ViewSkillState[eVS_NPC_HELP] = 1;
	GCStateInfoSend(lpObj, 1, eVS_NPC_HELP);

	return TRUE;
}
Пример #10
0
void CCrywolfAltar::SetAltarValidContract(int iAltarObjIndex, int iClass)
{
	int iAltarNumber = this->GetAlatarNumber(iClass);
	CCrywolfAltarInfo * AltarInfo = &this->m_AltarInfo[iAltarNumber];

	if ( AltarInfo->GetAltarState() != 2 )
		return;

	if ( AltarInfo->m_dwValidContractTime < (int)GetTickCount() )
	{
		MsgOutput(AltarInfo->m_iUserIndex, lMsg.Get(MSGGET(12, 251)), iAltarNumber);
		UTIL.SendCrywolfUserAnyMsg(2, lMsg.Get(MSGGET(12, 252)), gObj[AltarInfo->m_iUserIndex].Name, iAltarNumber);

		CLog.LogAdd("[ Crywolf ][Altar Op.]  [%s][%s] Set Valid Contract Altar[%d]",
			gObj[AltarInfo->m_iUserIndex].AccountID, gObj[AltarInfo->m_iUserIndex].Name, iAltarNumber);

		AltarInfo->SetAltarState(1);

		memset(gObj[iAltarObjIndex].m_ViewSkillState,0, sizeof(gObj[iAltarObjIndex].m_ViewSkillState));
		gObj[iAltarObjIndex].m_ViewSkillState[eVS_ALTAR_VALID_CONTRACT] = 1;
		GCStateInfoSend(&gObj[iAltarObjIndex], 1, eVS_ALTAR_VALID_CONTRACT);
	}
}
Пример #11
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);
	}
}
Пример #12
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;
	}
}
Пример #13
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;
	
}
Пример #14
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;
	}
}
Пример #15
0
bool CObjBaseAttack::ResistanceCheck(LPOBJ lpObj, LPOBJ lpTargetObj, int skill)
{
	bool bResult = true;
	// ----
	switch ( skill )
	{
	// ---- Poison
	case 1:
		if ( lpTargetObj->m_PoisonType == 0 )
		{
			if ( retResistance(lpTargetObj, 1) == 0 )
			{
				lpTargetObj->m_PoisonType = 1;
				lpTargetObj->m_PoisonBeattackCount = 20;
				lpTargetObj->lpAttackObj = lpObj;
				lpTargetObj->m_ViewSkillState[eVS_POISON] = 1;
			}
			else
			{
				bResult = false;
			}	
		}
		else
		{
			bResult = false;
		}
		break;
	// ---- Lightning
	case 3:
		if ( retResistance(lpTargetObj, 2) == 0 )
		{
			gObjAddMsgSendDelay(lpTargetObj, 2, lpObj->m_Index, 150, 0);
		}
		else
		{
			bResult = false;
		}
		break;
		// ---- Decay
	case 38:
		if ( lpTargetObj->m_PoisonType == 0 || lpTargetObj->m_PoisonType == 1 )
		{
			if ( retResistance(lpTargetObj, 1) == 0 )
			{
				lpTargetObj->m_PoisonType = 38;
				lpTargetObj->m_PoisonBeattackCount = 10;
				lpTargetObj->lpAttackObj = lpObj;
				lpTargetObj->m_ViewSkillState[eVS_POISON] = 1;
				GCStateInfoSend(lpTargetObj, 1, eVS_POISON);				
			}
			else
			{
				bResult = false;
			}
		}
		else
		{
			bResult = false;
		}
		break;
	// ---- Earthquake
	case 62:
		gObjBackSpring2(lpTargetObj, lpObj, 3);
		break;
	// ---- Ice, Ice Storm, Chain Drive
	case 7:
	case 39:
	case 262:
		if (lpTargetObj->m_ColdBeattackCount == 0 )
		{
			if ( retResistance(lpTargetObj, 0) == 0 )
			{
				lpTargetObj->m_ColdBeattackCount = 10;
				lpTargetObj->lpAttackObj = lpObj;
				lpTargetObj->DelayActionTime = 800;
				lpTargetObj->DelayLevel = 1;
				lpTargetObj->m_IceType = skill;
				GCStateInfoSend(lpTargetObj, 1, eVS_ICE);
			}
			else
			{
				bResult = false;
			}
		}
		else
		{
			bResult = false;
		}
		break;
	// ---- Weapon Skills
	case 19:
	case 20:
	case 21:
	case 22:
	case 23:
	case 260:
	case 261:
		gObjAddMsgSendDelay(lpTargetObj, 2, lpObj->m_Index, 150, 0);
		break;
	// ---- Ice Arrow
	case 51:
		bResult = false;
		break;
	}
	// ----
	return bResult;
}
Пример #16
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;
	
}
Пример #17
0
void TMonsterAI::ProcessStateMsg(LPOBJ lpObj, int iMsgCode, int iIndex, int aMsgSubCode)
{
	switch ( iMsgCode )
	{
		case 1:
			gObjMonsterDieGiveItem(lpObj, &gObj[iIndex]);
			break;

		case 2:
			if ( gObj[iIndex].Live != FALSE )
			{
				gObjBackSpring(lpObj, &gObj[iIndex]);
			}
			break;

		case 3:
			if ( lpObj->TargetNumber != -1 )
			{
				lpObj->m_Agro.DelAgro(lpObj->TargetNumber);
			}

			lpObj->TargetNumber = -1;
			lpObj->LastAttackerID = -1;
			lpObj->m_ActState.Emotion = 0;
			lpObj->m_ActState.Attack = 0;
			lpObj->m_ActState.Move = 0;
			lpObj->NextActionTime = 1000;
			break;

		case 4:
			lpObj->m_ActState.Emotion = 3;
			lpObj->m_ActState.EmotionCount = 1;
			break;

		case 55:
			gObjAttack(lpObj, &gObj[iIndex], NULL, FALSE, FALSE, 0, FALSE);
			break;

		case 56:
			{
				LPOBJ lpTargetObj = &gObj[iIndex];
				
				if ( lpTargetObj->m_PoisonType == 0 )
				{
					if ( retResistance(lpTargetObj, 1) == FALSE )
					{
						lpTargetObj->m_PoisonType = 1;
						lpTargetObj->m_PoisonBeattackCount = aMsgSubCode;
						lpTargetObj->lpAttackObj = lpObj;
						lpTargetObj->m_ViewSkillState[eVS_POISON] = 1;
						GCStateInfoSend(lpTargetObj, 1, eVS_POISON);
					}
				}
			}
			break;

		case 57:
			{
				LPOBJ lpTargetObj = &gObj[iIndex];
				gObjBackSpring2(lpTargetObj, lpObj, aMsgSubCode);
			}
			break;
	}
}