• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

Dziwny problem z atrybutami itemów.

GarQet

Own3d!
Joined
Feb 10, 2009
Messages
1,381
Solutions
14
Reaction score
81
Siema, mam mały problem. Chodzi o to, że itemy nie uodparniają od obrażeń.
Items.xml:
Code:
	<item id="2469" name="dragon scale legs">
		<attribute key="weight" value="4800"/>
		<attribute key="armor" value="10"/>
		<attribute key="absorbPercentAll" value="25"/>
		<attribute key="slotType" value="legs"/>
	</item>

Movements.xml:
Code:
	<movevent type="Equip" itemid="2492" slot="armor" level="50" event="script" value="dragonscalelegs.lua"/>
	<movevent type="DeEquip" itemid="2492" slot="armor" event="function" value="onDeEquipItem"/>

Dragonscalelegs.lua:
Code:
function onEquip(cid, item, slot) 

	if(getPlayerStorageValue(cid, 2469) ~= 1) then
		doPlayerSendTextMessage(cid, 25, "Nie mozesz ich zakladac.")
		doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF)
	else
		return TRUE
	end
end

Po założeniu tych legów i spełnieniu warunków skryptu, dmg w gracza są takie same jakby nie miał tych legów na sobie. Jeszcze wspomnę, że w grze normalnie się wyświetla:
Code:
18:01 You see dragon scale legs (Arm:10, protection all +25%).
It can only be wielded properly by players of level 50 or higher.
It weighs 48.00 oz.

Jakieś pomysły?
 
movements sa zle zrobione

<movevent type="Equip" itemid="2492" slot="armor" event="function" value="onEquipItem"/>
<movevent type="DeEquip" itemid="2492" slot="armor" event="function" value="onDeEquipItem"/>

nie musisz wtedy robic osobnego movementu

a jezeli chcesz dodac jakis storage to nie mozesz zrobic tego w ten sposob, chyba, ze bys zedytowal skrypt onEquipItem i tam dal if itemid ="2492" i tam te swoje warunki
 
Last edited:
slot="armor"

zrobiłeś dsle dla armora nice dude

Lua:
	<movevent type="Equip" itemid="2469" slot="legs" level="50" event="function" value="onEquipItem">
	</movevent>
	<movevent type="DeEquip" itemid="2469" slot="legs" event="function" value="onDeEquipItem"/>

Lua:
	<item id="2469" name="dragon scale legs">
		<attribute key="weight" value="4800"/>
		<attribute key="armor" value="10"/>
		<attribute key="absorbPercentAll" value="25"/>
		<attribute key="slotType" value="legs"/>
		<attribute key="showattributes" value="1"/>
	</item>
 
Last edited:
i bardzo dobrze ze ci nie działa widze takie otsy ze 25% od wszystkie spodnie same to idz w chu dodaj jeszcze armor 25 od all helm tarcze i chuj
 
a chuj ci do tego boxer ? jak widzisz takie otsy to nie graj na nich i tyle ? czy po prostu zazdrość? stwórz lepszy.
 
Gdzie znajde "skrypt"
value="onEquipItem"
?

Ew. może zna ktoś jakąś funkcję która dodaje graczowi te atrybuty co są wpisane w items.xml (absorbPercentAll)?
 
moze sprobuj dac jedna linie z onequipitem a druga na swoj skrypt, probowales chociaz czy tak podziala? Sposob taki se ale moze podziala
 
Próbowałem, wywala błąd, że takie triki są niedozwolone.
 
i bardzo dobrze ze ci nie działa widze takie otsy ze 25% od wszystkie spodnie same to idz w chu dodaj jeszcze armor 25 od all helm tarcze i chuj

on przynajmniej tworzy cos swojego nie tak jak ty wszystko z neta ;o
 
w DEV masz możliwość wywołania onEquipItem w skrypcie
w reszcie po prostu dodaj atrybut nawet "whateva" który gdy jest obecny wymaga storaga i tyle(tak, wymaga to edycji źródła)(tak, da się inaczej ale to nie ma sensu)
 
Nie wiem czy dobrze to wy edytowałem, jest ktoś w stanie pomóc? Dodany kod przeze mnie jest pogrubiony.
Code:
bool MoveEvent::EquipItem(MoveEvent* moveEvent, Player* player, Item* item, slots_t slot, bool isCheck)
{
[B]	std::string str;
	getStorage("2469", str);
	int32_t storage = atoi(str.c_str());[/B]

	if(player->isItemAbilityEnabled(slot))
		return true;

	if(!player->hasFlag(PlayerFlag_IgnoreEquipCheck) && moveEvent->getWieldInfo() != 0)
	{
		if(player->getLevel() < (uint32_t)moveEvent->getReqLevel() || player->getMagicLevel() < (uint32_t)moveEvent->getReqMagLv())
			return false;

		if(moveEvent->isPremium() && !player->isPremium())
			return false;

		if(!moveEvent->getVocEquipMap().empty() && moveEvent->getVocEquipMap().find(player->getVocationId()) == moveEvent->getVocEquipMap().end())
			return false;
			
[B]		if(storage == 1 && Item::items[item->2469()])
			return false;[/B]
	}

	if(isCheck)
		return true;

	const ItemType& it = Item::items[item->getID()];
	if(it.transformEquipTo)
	{
		Item* newItem = g_game.transformItem(item, it.transformEquipTo);
		g_game.startDecay(newItem);
	}

	player->setItemAbility(slot, true);
	if(it.abilities.invisible)
	{
		Condition* condition = Condition::createCondition((ConditionId_t)slot, CONDITION_INVISIBLE, -1, 0);
		player->addCondition(condition);
	}

	if(it.abilities.manaShield)
	{
		Condition* condition = Condition::createCondition((ConditionId_t)slot, CONDITION_MANASHIELD, -1, 0);
		player->addCondition(condition);
	}

	if(it.abilities.speed)
		g_game.changeSpeed(player, it.abilities.speed);

	if(it.abilities.conditionSuppressions)
	{
		player->setConditionSuppressions(it.abilities.conditionSuppressions, false);
		player->sendIcons();
	}

	if(it.abilities.regeneration)
	{
		Condition* condition = Condition::createCondition((ConditionId_t)slot, CONDITION_REGENERATION, -1, 0);
		if(it.abilities.healthGain)
			condition->setParam(CONDITIONPARAM_HEALTHGAIN, it.abilities.healthGain);

		if(it.abilities.healthTicks)
			condition->setParam(CONDITIONPARAM_HEALTHTICKS, it.abilities.healthTicks);

		if(it.abilities.manaGain)
			condition->setParam(CONDITIONPARAM_MANAGAIN, it.abilities.manaGain);

		if(it.abilities.manaTicks)
			condition->setParam(CONDITIONPARAM_MANATICKS, it.abilities.manaTicks);

		player->addCondition(condition);
	}

	bool needUpdateSkills = false;
	for(uint32_t i = SKILL_FIRST; i <= SKILL_LAST; ++i)
	{
		if(it.abilities.skills[i])
		{
			player->setVarSkill((skills_t)i, it.abilities.skills[i]);
			if(!needUpdateSkills)
				needUpdateSkills = true;
		}

		if(it.abilities.skillsPercent[i])
		{
			player->setVarSkill((skills_t)i, (int32_t)(player->getSkill((skills_t)i, SKILL_LEVEL) * ((it.abilities.skillsPercent[i] - 100) / 100.f)));
			if(!needUpdateSkills)
				needUpdateSkills = true;
		}
	}

	if(needUpdateSkills)
		player->sendSkills();

	bool needUpdateStats = false;
	for(uint32_t s = STAT_FIRST; s <= STAT_LAST; ++s)
	{
		if(it.abilities.stats[s])
		{
			player->setVarStats((stats_t)s, it.abilities.stats[s]);
			if(!needUpdateStats)
				needUpdateStats = true;
		}

		if(it.abilities.statsPercent[s])
		{
			player->setVarStats((stats_t)s, (int32_t)(player->getDefaultStats((stats_t)s) * ((it.abilities.statsPercent[s] - 100) / 100.f)));
			if(!needUpdateStats)
				needUpdateStats = true;
		}
	}

	if(needUpdateStats)
		player->sendStats();

	return true;
}
 
Wykleiłem z przykładu obok ^^
Jak nie pójdzie, to może wiesz jak zrobić żeby poszło?
 
Back
Top Bottom