XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
Anerel

offline
Опыт: 219
Активность:
распределение опыта!Помогите со спелом!
Суть в том, например в доте герой мепо или геомансер. Ульт у него создает полноценую копию у которой есть спеллы(почти герой), но при убийстве юнита опыт не делиться на 2-3-4 человек, а дается каждому поровну, не зависимо на каком расстоянии они от друг друга и от убитого юнита!Помогите осуществить эту фишку с опытом!

Отредактировано Anerel, 22.12.2012 в 13:04.
Старый 22.12.2012, 12:55
DemoN2099
annihilator
offline
Опыт: 4,418
Активность:
Что вам нужно? Распределение опыта вне зависимости от расстояния? Если да - вам в игровые константы.
Старый 22.12.2012, 13:18
Anerel

offline
Опыт: 219
Активность:
Нет! смотри есть два героя они в бою, при убийстве юнита им дается по 50% каждому опыта с юнита(делится в 2 раза) а мне надо чтоб им давало 100% каждому, при этом не сколько бы героев рядом не было давало каждому по 100% и если один герой в бою, а другой на расстоянии при котором герой не получает опыт, первый убивая юнита добавлял себе и 2 герою опыт!
Старый 22.12.2012, 13:23
Romeno

offline
Опыт: 3,167
Активность:
Это всё, скорее всего, совсем не просто и, к тому же, как система распределения опыта работает в доте, а тем более у мепо, сказать просто так ничего не изучив, думаю не получится. Придётся самому изучить эту систему, а ещё вероятно и jass.
Тебе в помощь проект OpenDota
Не уверен был ли в версии 6.41 мепо, но какая то система распределения опыта, скорее всего там реализована.
Старый 22.12.2012, 13:24
Anerel

offline
Опыт: 219
Активность:
Я и сам знаю ,что это скорей всего через отлов опыта !Моя система не катит ! решил порыскать в поиске по форуму только CHS(Просто надеялся что есть вариант по легче!)Да, Меппо был я им тогда первый раз поиграл в 6.41.Если мне кто то объяснит что где какая строчка, часть я понимаю часть нет(
» code
// Objects used:
// 'H00J' = Geomancer
// 'tgxp' = Boots of Speed
// 'hlst' = Power Treads
// 'tlum' = Boots of Travel
// 'A0N8' = Poof (Geomancer : Meepo)
// 'A0NB' = Earthbind (Geomancer : Meepo)
// 'A0N7' = Geostrike (Geomancer : Meepo)
// 'Aamk' = Attribute Bonus (Shadow Priest : Dazzle)
// 'A0MW' = Divided We Stand (Geomancer : Meepo)

// DEBUG Trigger Number : 300
function Divided_We_Stand_ShareExp takes nothing returns nothing
	local string lsq=H2Tx(GetTriggeringTrigger())
	local player lEk=GetPlayer(lsq,"PlayerVar")
	local string lsQ=H2Tx(lEk)
	local unit lgg=GetUnit(lsQ,"Kobold0")
	local unit lgG=GetUnit(lsQ,"Kobold1")
	local unit lgh=GetUnit(lsQ,"Kobold2")
	local unit lgH=GetUnit(lsQ,"Kobold3")
	local string lsr=H2Tx(lgg)
	local string lsR=H2Tx(lgG)
	local string lss=H2Tx(lgh)
	local string lsS=H2Tx(lgH)
	local integer lst=GetInteger(lsr,"XPEarned")
	local integer lsT=GetInteger(lsr,"XPGiven")
	local integer lsu=GetInteger(lsR,"XPEarned")
	local integer lsU=GetInteger(lsR,"XPGiven")
	local integer lsv=GetInteger(lss,"XPEarned")
	local integer lsV=GetInteger(lss,"XPGiven")
	local integer lsw=GetInteger(lsS,"XPEarned")
	local integer lsW=GetInteger(lsS,"XPGiven")
	local integer lsx=GetHeroXP(lgg)
	local integer lsX=GetHeroXP(lgG)
	local integer lsy=GetHeroXP(lgh)
	local integer lsY=GetHeroXP(lgH)
	local integer lsz=lsx-lst-lsT
	local integer lsZ=lsX-lsu-lsU
	local integer ls0=lsy-lsv-lsV
	local integer ls1=lsY-lsw-lsW
	set lst=lst+lsz
	set lsu=lsu+lsZ
	set lsv=lsv+ls0
	set lsw=lsw+ls1
	if lgg!=null then
		call AddHeroXP(lgG,lsz,false)
		if GetHeroXP(lgG)!=lsX then
			set lsU=lsU+lsz
		endif
		call AddHeroXP(lgh,lsz,false)
		if GetHeroXP(lgh)!=lsy then
			set lsV=lsV+lsz
		endif
		call AddHeroXP(lgH,lsz,false)
		if GetHeroXP(lgH)!=lsY then
			set lsW=lsW+lsz
		endif
	endif
	if lgG!=null then
		call AddHeroXP(lgg,lsZ,false)
		if GetHeroXP(lgg)!=lsx then
			set lsT=lsT+lsZ
		endif
		call AddHeroXP(lgh,lsZ,false)
		if GetHeroXP(lgh)!=lsy then
			set lsV=lsV+lsZ
		endif
		call AddHeroXP(lgH,lsZ,false)
		if GetHeroXP(lgH)!=lsY then
			set lsW=lsW+lsZ
		endif
	endif
	if lgh!=null then
		call AddHeroXP(lgG,ls0,false)
		if GetHeroXP(lgG)!=lsX then
			set lsU=lsU+ls0
		endif
		call AddHeroXP(lgg,ls0,false)
		if GetHeroXP(lgg)!=lsx then
			set lsT=lsT+ls0
		endif
		call AddHeroXP(lgH,ls0,false)
		if GetHeroXP(lgH)!=lsY then
			set lsW=lsW+ls0
		endif
	endif
	if lgH!=null then
		call AddHeroXP(lgG,ls1,false)
		if GetHeroXP(lgG)!=lsX then
			set lsU=lsU+ls1
		endif
		call AddHeroXP(lgh,ls1,false)
		if GetHeroXP(lgh)!=lsy then
			set lsV=lsV+ls1
		endif
		call AddHeroXP(lgg,ls1,false)
		if GetHeroXP(lgg)!=lsx then
			set lsT=lsT+ls1
		endif
	endif
	call SetInteger(lsr,"XPEarned",lst)
	call SetInteger(lsr,"XPGiven",lsT)
	call SetInteger(lsR,"XPEarned",lsu)
	call SetInteger(lsR,"XPGiven",lsU)
	call SetInteger(lss,"XPEarned",lsv)
	call SetInteger(lss,"XPGiven",lsV)
	call SetInteger(lsS,"XPEarned",lsw)
	call SetInteger(lsS,"XPGiven",lsW)
endfunction

function Divided_We_Stand_KillEveryOne takes nothing returns nothing
	local unit lgE=GetTriggerUnit()
	local string lf5=H2Tx(GetOwningPlayer(lgE))
	local unit lgg=GetUnit(lf5,"Kobold0")
	local unit lgG=GetUnit(lf5,"Kobold1")
	local unit lgh=GetUnit(lf5,"Kobold2")
	local unit lgH=GetUnit(lf5,"Kobold3")
	local boolean lia=false
	call DisableTrigger(udg_triggerl004)
	if lgg!=null and lgg!=lgE then
		call KillUnit(lgg)
	endif
	if lgG!=null and lgG!=lgE then
		call KillUnit(lgG)
	endif
	if lgh!=null and lgh!=lgE then
		call KillUnit(lgh)
	endif
	if lgH!=null and lgH!=lgE then
		call KillUnit(lgH)
	endif
	call EnableTrigger(udg_triggerl004)
endfunction

function Divided_We_Stand_NotIlluGeo takes nothing returns boolean
	return Divided_We_Stand_IsGeomancer(GetTriggerUnit())and IsUnitIllusion(GetTriggerUnit())==false
endfunction

function Divided_We_Stand_Boots takes nothing returns nothing
	local unit lgi=GetTriggerUnit()
	local integer lii=0
	local boolean lF3=false
	local boolean lF4=false
	local boolean lF5=false
	local string lsQ=H2Tx(GetOwningPlayer(lgi))
	local unit lgg=GetUnit(lsQ,"Kobold0")
	local unit lgG=GetUnit(lsQ,"Kobold1")
	local unit lgh=GetUnit(lsQ,"Kobold2")
	local unit lgH=GetUnit(lsQ,"Kobold3")
	local integer lkf
	local boolean ls7=false
	local integer ls8=0
	local integer ls9=0
	local integer lSa=0
	call DisableTrigger(GetTriggeringTrigger())
	if GetUnitTypeId(lgi)=='H00J'then
		call UnitRemoveItemFromSlot(lgi,0)
		call EnableTrigger(GetTriggeringTrigger())
		return
	endif
	if not(GetItemTypeId(GetManipulatedItem())=='tgxp'or GetItemTypeId(GetManipulatedItem())=='hlst'or GetItemTypeId(GetManipulatedItem())=='tlum')then
		call EnableTrigger(GetTriggeringTrigger())
		return
	endif
	if GetTriggerEventId()==EVENT_PLAYER_UNIT_DROP_ITEM then
		set ls7=true
	endif
	loop
		exitwhen lii>5
		set lkf=GetItemTypeId(UnitItemInSlot(lgi,lii))
		if lkf=='tgxp'then
			set ls8=ls8+1
			if(not(ls7 and lkf==GetItemTypeId(GetManipulatedItem())))or(ls8>1 and lkf==GetItemTypeId(GetManipulatedItem()))then
				set lF3=true
			endif
		endif
		if lkf=='hlst'then
			set ls9=ls9+1
			if(not(ls7 and lkf==GetItemTypeId(GetManipulatedItem())))or(ls9>1 and lkf==GetItemTypeId(GetManipulatedItem()))then
				set lF4=true
			endif
		endif
		if lkf=='tlum'then
			set lSa=lSa+1
			if(not(ls7 and lkf==GetItemTypeId(GetManipulatedItem())))or(lSa>1 and lkf==GetItemTypeId(GetManipulatedItem()))then
				set lF5=true
			endif
		endif
		set lii=lii+1
	endloop
	call RemoveItem(UnitRemoveItemFromSlot(lgG,0))
	if lgh!=null then
		call RemoveItem(UnitRemoveItemFromSlot(lgh,0))
	endif
	if lgh!=null then
		call RemoveItem(UnitRemoveItemFromSlot(lgH,0))
	endif
	if lF5 then
		call UnitAddItem(lgG,CreateItem('tlum',0,0))
		if lgh!=null then
			call UnitAddItem(lgh,CreateItem('tlum',0,0))
		endif
		if lgH!=null then
			call UnitAddItem(lgH,CreateItem('tlum',0,0))
		endif
	elseif lF4 then
		call UnitAddItem(lgG,CreateItem('hlst',0,0))
		if lgh!=null then
			call UnitAddItem(lgh,CreateItem('hlst',0,0))
		endif
		if lgH!=null then
			call UnitAddItem(lgH,CreateItem('hlst',0,0))
		endif
	elseif lF3 then
		call UnitAddItem(lgG,CreateItem('tgxp',0,0))
		if lgh!=null then
			call UnitAddItem(lgh,CreateItem('tgxp',0,0))
		endif
		if lgH!=null then
			call UnitAddItem(lgH,CreateItem('tgxp',0,0))
		endif
	endif
	call EnableTrigger(GetTriggeringTrigger())
endfunction

function Divided_We_Stand_GeomancerNotIllusion takes nothing returns boolean
	return Divided_We_Stand_IsGeomancer(GetTriggerUnit())and IsUnitIllusion(GetTriggerUnit())==false
endfunction

function Divided_We_Stand_EventsHandle takes nothing returns nothing
	local trigger ltt
	set ltt=CreateTrigger()
	call TriggerRegisterTimerEvent(ltt,.1,true)
	call TriggerAddAction(ltt,function Divided_We_Stand_ShareExp)
	call SetHandle(H2Tx(ltt),"PlayerVar",GetOwningPlayer(GetTriggerUnit()))
	call SetHandle(H2Tx(GetOwningPlayer(GetTriggerUnit())),"Kobold|XPTrigger",ltt)
	set ltt=CreateTrigger()
	call TriggerRegisterAnyUnitEventBJ(ltt,EVENT_PLAYER_UNIT_DEATH)
	call TriggerAddAction(ltt,function Divided_We_Stand_KillEveryOne)
	call TriggerAddCondition(ltt,Condition(function Divided_We_Stand_NotIlluGeo))
	set ltt=CreateTrigger()
	call TriggerRegisterAnyUnitEventBJ(ltt,EVENT_PLAYER_UNIT_PICKUP_ITEM)
	call TriggerRegisterAnyUnitEventBJ(ltt,EVENT_PLAYER_UNIT_DROP_ITEM)
	call TriggerAddAction(ltt,function Divided_We_Stand_Boots)
	call TriggerAddCondition(ltt,Condition(function Divided_We_Stand_GeomancerNotIllusion))
	call SetHandle(H2Tx(GetOwningPlayer(GetTriggerUnit())),"Kobold|ItemTrigger",ltt)
	call ExecuteFunc("Divided_We_Stand_SavePlayerData")
endfunction

function Divided_We_Stand_CloneSkils takes integer pmR,unit pms,unit pmS returns nothing
	local integer lEq=1
	local integer lEQ=GetUnitAbilityLevel(pms,pmR)
	loop
		exitwhen lEq>lEQ
		call SelectHeroSkill(pmS,pmR)
		set lEq=lEq+1
	endloop
endfunction

function Divided_We_Stand_CloneKobold takes unit plU,unit pSE returns nothing
	call AddHeroXP(plU,GetHeroXP(pSE),false)
	call SetInteger(H2Tx(plU),"XPGiven",GetHeroXP(pSE))
	call SetInteger(H2Tx(plU),"XPEarned",0)
	call Divided_We_Stand_CloneSkils('A0N8',pSE,plU)
	call Divided_We_Stand_CloneSkils('A0NB',pSE,plU)
	call Divided_We_Stand_CloneSkils('A0N7',pSE,plU)
	call Divided_We_Stand_CloneSkils('Aamk',pSE,plU)
	call Divided_We_Stand_CloneSkils('A0MW',pSE,plU)
endfunction

function Divided_We_Stand_BootsHelper takes unit plU,unit pfU returns nothing
	local trigger ltt=GetTrigger(H2Tx(GetOwningPlayer(pfU)),"Kobold|ItemTrigger")
	local integer lii=0
	local boolean lF3=false
	local boolean lF4=false
	local boolean lF5=false
	call DisableTrigger(ltt)
	loop
		exitwhen lii>5
		if GetItemTypeId(UnitItemInSlot(pfU,lii))=='tgxp'then
			set lF3=true
		endif
		if GetItemTypeId(UnitItemInSlot(pfU,lii))=='hlst'then
			set lF4=true
		endif
		if GetItemTypeId(UnitItemInSlot(pfU,lii))=='tlum'then
			set lF5=true
		endif
		set lii=lii+1
	endloop
	if lF5 then
		call UnitAddItem(plU,CreateItem('tlum',0,0))
	elseif lF4 then
		call UnitAddItem(plU,CreateItem('hlst',0,0))
	elseif lF3 then
		call UnitAddItem(plU,CreateItem('tgxp',0,0))
	endif
	call EnableTrigger(ltt)
endfunction

function Divided_We_Stand_KoboldNew takes nothing returns nothing
	local unit lfU=GetTriggerUnit()
	local player lEk=GetOwningPlayer(lfU)
	local string lf5=H2Tx(lEk)
	local unit llU
	call Divided_We_Stand_CloneSkillBySkill(lfU,'A0MW')
	set llU=CreateUnit(GetOwningPlayer(lfU),'H00J',GetUnitX(lfU),GetUnitY(lfU),0)
	call Divided_We_Stand_CloneKobold(llU,lfU)
	call Divided_We_Stand_BootsHelper(llU,lfU)
	call SetHandle(lf5,"Kobold"+I2S(GetUnitAbilityLevel(lfU,'A0MW')),llU)
endfunction

function Trig_Duplicates_Levelling_Actions takes nothing returns nothing
	local integer lSd=GetLearnedSkill()
	if IsUnitIllusion(GetTriggerUnit())or Divided_We_Stand_IsGeomancer(GetTriggerUnit())==false then
		return
	endif
	if lSd=='A0MW'and GetUnitAbilityLevel(GetTriggerUnit(),lSd)==1 then
		call TriggerExecute(GetTrigger(H2Tx(GetOwningPlayer(GetTriggerUnit())),"Kobold|XPTrigger"))
		call SetHandle(H2Tx(GetOwningPlayer(GetTriggerUnit())),"Kobold0",GetTriggerUnit())
		call SetInteger(H2Tx(GetTriggerUnit()),"XPEarned",GetHeroXP(GetTriggerUnit()))
		call SetInteger(H2Tx(GetTriggerUnit()),"XPGiven",0)
		call DisableTrigger(GetTriggeringTrigger())
		call Divided_We_Stand_EventsHandle()
		call EnableTrigger(GetTriggeringTrigger())
	endif
	if lSd=='A0MW'then
		call TriggerExecute(GetTrigger(H2Tx(GetOwningPlayer(GetTriggerUnit())),"Kobold|XPTrigger"))
		call DisableTrigger(GetTriggeringTrigger())
		call Divided_We_Stand_KoboldNew()
		call EnableTrigger(GetTriggeringTrigger())
	endif
	if lSd=='A0N8'or lSd=='A0NB'or lSd=='A0N7'or lSd=='Aamk'then
		call TriggerExecute(GetTrigger(H2Tx(GetOwningPlayer(GetTriggerUnit())),"Kobold|XPTrigger"))
		call DisableTrigger(GetTriggeringTrigger())
		call Divided_We_Stand_CloneSkillBySkill(GetTriggerUnit(),lSd)
		call EnableTrigger(GetTriggeringTrigger())
	endif
endfunction

function StartTrigger_Duplicates_Levelling takes nothing returns nothing
	set gg_trg_Duplicates_Levelling=CreateTrigger()
	call TriggerRegisterAnyUnitEventBJ(gg_trg_Duplicates_Levelling,EVENT_PLAYER_HERO_SKILL)
	call TriggerAddAction(gg_trg_Duplicates_Levelling,function Trig_Duplicates_Levelling_Actions)
endfunction

function InitTrig_Duplicates_Levelling takes nothing returns nothing
endfunction

Отредактировано DragonSpirit, 23.12.2012 в 12:48.
Старый 22.12.2012, 13:35
DemoN2099
annihilator
offline
Опыт: 4,418
Активность:
Укатай в кат.
Старый 22.12.2012, 13:39
Romeno

offline
Опыт: 3,167
Активность:
Ковыряй сам. По этому куску кода всё не поймёшь. Надо брать весь код доты и его смотреть. Если не понятна какая то функция есть поиск по форуму. Там где вызовы call AddHeroXP оно твоё.
Старый 22.12.2012, 13:49
Anerel

offline
Опыт: 219
Активность:
Romeno:
Там где вызовы call AddHeroXP оно твоё.
Я это понял.Я не могу понять какое событие стоит!
Старый 22.12.2012, 13:56
Romeno

offline
Опыт: 3,167
Активность:
Ищи методом обратного поиска, что тут сложного? Сначала найди что выполняет эту функцию, потом что выполняет ту что выполняла ту и т.д. так дойдёшь до её упоминания в TriggerRegister.... или в каком нибудь таймере.
Старый 22.12.2012, 14:00
Киря

offline
Опыт: 769
Активность:
С геомансером, он просто ловит килл -> берет значение текущего опыта того героя, который является убийцей -> дает этот опыт всем геомансерам.
Старый 22.12.2012, 14:15
Anerel

offline
Опыт: 219
Активность:
Киря:
С геомансером, он просто ловит килл -> берет значение текущего опыта того героя, который является убийцей -> дает этот опыт всем геомансерам.
Нееее... не так всё просто!Смотри если он даёт такой же опыт всем ,то получаеться если рядом стоят 5 геомансеров, а значит опыт поделит на 5!Это будет работать только если 1 гео убивает, а остальные стоят на определенном расстоянии при котором не получают опыт.
Старый 23.12.2012, 11:44
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,586
Активность:
Anerel, Смотри, есть формула рассчёта триггерной экспы, вот у всех клонов уровень блочитчя, они не получают никакого опыта, а главный геомансер получает, и всякий раз как он получает уровень, клонам выставляется такое же кол-во експы, высчитанное по формуле и опять блочится, как в кампаниях, герою нельзя получить больше 1 уровня за главу.
Тут такой же принцип... стоит только немного подумать...
Старый 23.12.2012, 12:02
Msey
????
offline
Опыт: 67,346
Активность:
Anerel, В доте все раздается поровну тащемта. Выдавать опыт каждому гео по-своему - извращение. хоть я и знаю, что половина академии к этому относится
Старый 23.12.2012, 12:26
DioD

offline
Опыт: 45,134
Активность:
каждое мгновение мы проверяем опыт каждого геомансера, потом синхронизируем на самый большой опыт, логики на 3 строки.
Старый 23.12.2012, 13:20
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,586
Активность:
DioD, Ну каждое то перебор, достаточно каждый уровень синхронизировать, как только так сразу, от опыта же статы и скиллы не зависят, нафиг так заморачиватся?
Есть очень удобное событие триггера, Герой игрока повышает уровень
Старый 23.12.2012, 14:11
DioD

offline
Опыт: 45,134
Активность:
в источнике вдохновения автора синхронизация идёт на каждую единичку опыта, а не на уровень в целом.
Старый 23.12.2012, 14:35
Anerel

offline
Опыт: 219
Активность:
На уровень или опыт на плевать!А вот в чём проблема, я б не обращался сюда если было так легко как просто заблокать опыт!Фишка в том когда я блокирую триггерно константы этого не видят, и получается что опыт всёровно делить просто даёт только одному!
Я вот что думаю может просто сделать так!
Берём каждую 0.02 сек проверяем получение опыта и если получает опыт один то он просто раздаётся если 2 то двоим этот опыт добавляеться ещё раз а другим 2 раза больше и т.д. ...
Старый 23.12.2012, 14:57
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,586
Активность:
Anerel:
Берём каждую 0.02 сек проверяем получение опыта и если получает опыт один то он просто раздаётся если 2 то двоим этот опыт добавляется ещё раз а другим 2 раза больше и т.д. ...
Чё не 0.001?
Нафиг часто так? и раз в сек достаточно, это раз, два в библиотеке функций есть функция триггерного расчёта опыта, забабахай триггерную систему получения опыта, а стандартную отключи чтобы не мучится, в доте походу так давно сделали...
Старый 23.12.2012, 15:00
Anerel

offline
Опыт: 219
Активность:
quq_CCCP:
а стандартную отключи чтобы не мучится, в доте походу так давно сделали.
Всмысле стандартная? в константах выключить?В константах давно уже выключил!
Старый 23.12.2012, 15:59
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,586
Активность:
Anerel, Награду за килл, и фактор опыта 0, ставь,, там таблица за мобов де то есть, и общее распределения опыта, вот их надо менять и все будет норм...
Старый 23.12.2012, 16:14
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 05:17.