void CClient::SkillUp(skillIndexes skillindex, int skillups) {
	int   iWeaponIndex;

	if (!m_bIsInitComplete) return;
	if ((skillindex < 0) || (skillindex >= MAXSKILLTYPE)) return;
	if (IsDead()) return;

	if (m_cSkillMastery[skillindex] == 0) return;

	int multiplier = GetSkillMultiplier(skillindex);

	if(m_cSkillMastery[skillindex]>=100) {
		return;
	}
	if(skillups*multiplier > GetSSNToSkillUp(skillindex)) { // should skill up
		if(CanSkillUp(skillindex)) { // if we can skillup, we do
			m_iSkillSSN[skillindex] = 0;
			m_cSkillMastery[skillindex]++;
			if (m_sItemEquipmentStatus[ EQUIPPOS_TWOHAND ] != -1) {
				iWeaponIndex = m_sItemEquipmentStatus[ EQUIPPOS_TWOHAND ];
				if (m_pItemList[iWeaponIndex]->m_sRelatedSkill == skillindex) {
					m_iHitRatio++;
				}
			}
			if (m_sItemEquipmentStatus[ EQUIPPOS_RHAND ] != -1) {
				iWeaponIndex = m_sItemEquipmentStatus[ EQUIPPOS_RHAND ];
				if (m_pItemList[iWeaponIndex]->m_sRelatedSkill == skillindex) {
					m_iHitRatio++;
				}
			}
			CheckTotalSkillMasteryPoints(skillindex);
			// notify of the skillup
			g_gameCopy->SendNotifyMsg(NULL, this->m_handle, NOTIFY_SKILL, skillindex, m_cSkillMastery[skillindex], NULL, NULL);
			return;
		} // if not, we ignore it
	} else { // we get a lil closer to skill up
		m_iSkillSSN[skillindex]+=skillups*multiplier;
	}
}
Esempio n. 2
0
	void FishingAction(CCharEntity* PChar, FISHACTION action, uint16 stamina)
	{
		uint16 MessageOffset = GetMessageOffset(PChar->getZone());

		switch (action)
		{
		case FISHACTION_CHECK:
		{

								 if (CheckFisherLuck(PChar))
								 {
									 // send messages
									 if (catchtype[0] >= 0)
									 {
										 PChar->animation = ANIMATION_FISHING_FISH;
										 if (catchtype[0] == 0)
										 {
											 if (catchsize[0] == 1)
											 {
												 // Large Fish: "Something caught the hook!!!"
												 PChar->pushPacket(new CMessageTextPacket(PChar, MessageOffset + 0x32));
											 }
											 else
											 {
												 // Small Fish: "Something caught the hook!"	
												 PChar->pushPacket(new CMessageTextPacket(PChar, MessageOffset + 0x08));
											 }
										 }
										 if (catchtype[0] >= 1 && catchtype[0] < 3)
										 {
											 // Non-fish targets: "You feel something pulling at your line."
											 PChar->pushPacket(new CMessageTextPacket(PChar, MessageOffset + 0x33));
										 }
										 if (catchtype[0] == 3)
										 {
											 // Monster: "Something clamps onto your line ferociously!"	
											 PChar->pushPacket(new CMessageTextPacket(PChar, MessageOffset + 0x34));
										 }
										 PChar->pushPacket(new CFishingPacket(catchtype[0], catchsize[0]));
									 }
								 }
								 else
								 {
									 // Message: "You didn't catch anything."

									 PChar->animation = ANIMATION_FISHING_STOP;
									 PChar->pushPacket(new CMessageTextPacket(PChar, MessageOffset + 0x04));
								 }
		}
			break;
		case FISHACTION_FINISH:
		{

								  // you have a 15% change to break the rod, Line or loose a catch while reeling it in.
								  if (rand() % 100 <= 15 && catchtype[0] <= 1 && stamina == 0)
								  {
									  DSP_DEBUG_BREAK_IF(PChar->UContainer->GetType() != UCONTAINER_FISHING);
									  DSP_DEBUG_BREAK_IF(PChar->UContainer->GetItem(0) == NULL);
									  CItem* PFish = PChar->UContainer->GetItem(0);
									  
									  int messageID = Breakage(PChar, PFish->getID());
									  
									  if (messageID == 1)
									  {
										  // Message: "Your rod breaks. Whatever caught the hook was pretty big"
										  PChar->animation = ANIMATION_FISHING_ROD_BREAK;
										  PChar->pushPacket(new CMessageTextPacket(PChar, MessageOffset + 0x11));
									  }
									  if (messageID == 2)
									  {
										  // Message: "Your line breaks!"
										  PChar->animation = ANIMATION_FISHING_LINE_BREAK;
										  PChar->pushPacket(new CMessageTextPacket(PChar, MessageOffset + 0x06));
									  }
									  
									  if (messageID == 3)
									  {
										  // Message: "You lost your catch Whatever caught thr hook was too small to catch with this rod"
										  PChar->animation = ANIMATION_FISHING_LINE_BREAK;
										  PChar->pushPacket(new CMessageTextPacket(PChar, MessageOffset + 0x13));
									  }

									  PChar->pushPacket(new CMessageTextPacket(PChar, MessageOffset + 0x09));
									  PChar->animation = ANIMATION_FISHING_STOP;
									  PChar->UContainer->Clean();
									  catchlevel[0] = 0;
									  break;
								  }

								  if (stamina == 0)
								  {
									  DSP_DEBUG_BREAK_IF(PChar->UContainer->GetType() != UCONTAINER_FISHING);
									  DSP_DEBUG_BREAK_IF(PChar->UContainer->GetItem(0) == NULL);
									  CItem* PFish = PChar->UContainer->GetItem(0);
									  								  
									  if (catchtype[0] == 3)
									  {
										  PChar->animation = ANIMATION_FISHING_MONSTER;
									  }
									  else
									  {
										  PChar->animation = ANIMATION_FISHING_CAUGHT;
									  }
									  									  
									  if (catchtype[0] == 3)
									  {
										  // Message: "You caught  a monster"
										  PChar->loc.zone->PushPacket(PChar, CHAR_INRANGE_SELF, new CCaughtFishPacket(PChar, 0x01, mobid[0], MessageOffset + 0x05));
										  SpawnCatch(PChar, mobid[0]);
									  }

									  if (catchtype[0] <= 2)
									  {
										  if (catchtype[0] == 2)
										  {
											  int GilChance = rand() % 100 ;
											  if (GilChance <= 10)
											  {
												  // Give 100 Gil if gillchance <= 10%
												  charutils::UpdateItem(PChar, LOC_INVENTORY, 0, 100);
												  PChar->loc.zone->PushPacket(PChar, CHAR_INRANGE_SELF, new CCaughtFishPacket(PChar, 0x01, 0x0000FFFF, MessageOffset + 0x27));
												  PChar->loc.zone->PushPacket(PChar, CHAR_INRANGE_SELF, new CCaughtFishPacket(PChar, 0x64, 0x0000FFFF, MessageOffset + 0x26));
											  }
											  else
											  {     
												    // give 1 Gil
												  charutils::UpdateItem(PChar, LOC_INVENTORY, 0, 1);
												  PChar->loc.zone->PushPacket(PChar, CHAR_INRANGE_SELF, new CCaughtFishPacket(PChar, 0x01, 0x0000FFFF, MessageOffset + 0x27));
												  PChar->loc.zone->PushPacket(PChar, CHAR_INRANGE_SELF, new CCaughtFishPacket(PChar, 0x01, 0x0000FFFF, MessageOffset + 0x26));
											  }

										  }
										  else
										  {
											  if (CanSkillUp(PChar) == 0)
											  {
												  // Message: " You lost your catch due to lack of skill."
												  PChar->pushPacket(new CMessageTextPacket(PChar, MessageOffset + 0x14));
											  }
											  else
											  {
												  // if type is 0:fish or 1:item add item to invintory
												  charutils::AddItem(PChar, LOC_INVENTORY, PFish->getID(), 1);
												  PChar->loc.zone->PushPacket(PChar, CHAR_INRANGE_SELF, new CCaughtFishPacket(PChar, 0x01, PFish->getID(), MessageOffset + 0x27));
											  }
										  }
									  }

									  if (PFish->isType(ITEM_USABLE))
									  {
										  LureLoss(PChar, false);
									  }
									  delete PFish;
								  }
								  else if (stamina <= 0x64)
								  {
									  // Message: "Your line breaks!"
									  PChar->animation = ANIMATION_FISHING_LINE_BREAK;
									  LureLoss(PChar, true);
									  PChar->pushPacket(new CMessageTextPacket(PChar, MessageOffset + 0x06));
								  }
								  else if (stamina <= 0x100)
								  {
									  // Message: "You give up!"
									  PChar->animation = ANIMATION_FISHING_STOP;

									  if (PChar->UContainer->GetType() == UCONTAINER_FISHING &&
										  LureLoss(PChar, false))
									  {
										  PChar->pushPacket(new CMessageTextPacket(PChar, MessageOffset + 0x24));
									  }
									  else {
										  PChar->pushPacket(new CMessageTextPacket(PChar, MessageOffset + 0x25));
									  }
								  }
								  else
								  {
									  // Message: "You lost your catch!"
									  PChar->animation = ANIMATION_FISHING_STOP;
									  LureLoss(PChar, false);
									  PChar->pushPacket(new CMessageTextPacket(PChar, MessageOffset + 0x09));
								  }
								  PChar->UContainer->Clean();
		}
			break;
		case FISHACTION_WARNING:
		{
								   // Message: "You don't know how much longer you can keep this one on the line..."
								   PChar->pushPacket(new CMessageTextPacket(PChar, MessageOffset + 0x28));
								   return;
		}
			break;
		case FISHACTION_END:
		{
							   // skillup
							   PChar->animation = ANIMATION_NONE;

							   if (catchtype[0] == 0 && catchlevel[0] >= 1 && CanSkillUp(PChar) == 1)
							   {

								   uint8  skillRank = PChar->RealSkills.rank[SKILL_FSH];
								   uint16 maxSkill = (skillRank + 1) * 100;

								   int32  charSkill = PChar->RealSkills.skill[SKILL_FSH];

								   
								   int skillAmount = rand() % 5;
								   
								   if (skillAmount > 0)
								   {
									   if ((skillAmount + charSkill) > maxSkill)
									   {
										   skillAmount = maxSkill - charSkill;
									   }

									   if (skillAmount > 0)
									   {
										   PChar->RealSkills.skill[SKILL_FSH] += skillAmount;
										   PChar->pushPacket(new CMessageBasicPacket(PChar, PChar, SKILL_FSH, skillAmount, 38));

										   charutils::SaveCharSkills(PChar, SKILL_FSH);
									   }

									   if ((charSkill / 10) < (charSkill + skillAmount) / 10)
									   {
										   PChar->WorkingSkills.skill[SKILL_FSH] += 0x20;

										   PChar->pushPacket(new CCharSkillsPacket(PChar));
										   PChar->pushPacket(new CMessageBasicPacket(PChar, PChar, SKILL_FSH, (charSkill + skillAmount) / 10, 53));
									   }

								   }
								    catchlevel[0] = 0;
							   }
							   

		}
			break;
		}

		PChar->status = STATUS_UPDATE;

		PChar->pushPacket(new CCharUpdatePacket(PChar));
		PChar->pushPacket(new CCharSyncPacket(PChar));
	}