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

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

Ответ
 
влад10011

offline
Опыт: 2,337
Активность:
функция SelectUnitForPlayerSingle
Здрасте,
Я сделал 1 систему, с использованием SelectUnitForPlayerSingle но столкнулся с проблемой: эта функция не работает в мультиплеере.
Как заставить работать SelectUnitForPlayerSingle в мультиплеере игре?(или чем можно её заменить)
Старый 21.04.2013, 19:48
Hanabishi
COOL STATUS
offline
Опыт: отключен
Если раскрыть
function SelectUnitForPlayerSingle takes unit whichUnit, player whichPlayer returns nothing
    if (GetLocalPlayer() == whichPlayer) then
        // Use only local code (no net traffic) within this block to avoid desyncs.
        call ClearSelection()
        call SelectUnit(whichUnit, true)
    endif
endfunction
А вообще должна работать вроде как
Старый 21.04.2013, 20:07
влад10011

offline
Опыт: 2,337
Активность:
да я знаю как она в раскрытом виде, просто у меня не работает и я хотел узнать как это исправить.
Моя система состоит в том чтобы при клике на врага от выделенного дружественного летел снаряд и сразу заново выбирался тот юнит от которого шёл выстрел, но это работает только в одиночной игре =(
В мультиплеере это действие не происходит.
Старый 21.04.2013, 20:31
Borodach

offline
Опыт: 5,794
Активность:
Может так сделать....
call SelectUnit( whichUnit, GetLocalPlayer() == whichPlayer )
Старый 21.04.2013, 22:44
Zetox

offline
Опыт: 1,738
Активность:
Цитата:
Сообщение от Borodach
Может так сделать....

call SelectUnit( whichUnit, GetLocalPlayer() == whichPlayer )


ни в коем случае.
Старый 21.04.2013, 22:49
IceFog

offline
Опыт: 6,486
Активность:
Что не работает? Происходит десинхронизация?
И скинь свою систему, иначе как тебе помогут?
Старый 22.04.2013, 00:00
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
влад10011, ну как не работает? мб весь триггер или функция не работает, поток рвется из за корявого условия и тп... Код пожалуйста в студию, мы протестуем и скажем работает или нет!
P.S у меня всегда эта БЖ работала корректно
Старый 22.04.2013, 02:46
влад10011

offline
Опыт: 2,337
Активность:
Система очень старая. Делал для себя, так что написано без отступов и тд Х_Х
((кат
((код
library Weapon initializer Init uses Timers {
define private on=true
define private off=false
define {
private dum='h000'
private Abil='A001'
private Abil2='A002'
private Damage=55.00
private Range=250.00
private FlyHeight=150.00
private Speed=15.00
private Distance=999999.00 Максимальная дальнасть снаряда
Define
private AttackType=HERO
private At=on
private ABIL=on
private RangeZ=on
}
define private AttackTypes(type)=ATTACK_TYPE_##type
globals
private unit array Caster,Dummy,Select[12],Selected[12],GetLastSelectUnit[12]
private real array X,Y,Z,DummyDist,DummyDist2,DummyZ
private boolean array Bool
private integer C=0
private timer Timer=CreateTimer()
private unit Unit
endglobals
private void Damageee() {
unit u=GetEnumUnit()
if(GetRandomInt(1,100)<=5) {
BashUnit(u,0.10)
}
UnitDamageTarget(Unit,u,Damage,true,false,AttackTypes(AttackType),DAMAGE_TYPE_FIRE,WEAPON_TYPE_WHOKN​OWS)
u=null
}
private boolean Filt() {
return IsUnitEnemy(GetFilterUnit(),GetOwningPlayer(Unit))==true
}
private void Move() {
integer i=1
unit u=null
group g=null
loop {
u=Dummy[i]
real d=DistXY(GetUnitX(u),GetUnitY(u),X[i],Y[i])
if d>=55.00 or GetUnitFlyHeight(u)>Z[i] {
real a=Atan2(Y[i]-GetUnitY(u),X[i]-GetUnitX(u))
real x=GetUnitX(u)+Speed*Cos(a)
real y=GetUnitY(u)+Speed*Sin(a)
SetUnitX(u,x);
SetUnitY(u,y);
SetUnitFacing(u,57.296*a)
if(d<55.00 and Bool[i]==true) {
Bool[i]=false;
X[i]=x+(Speed*1.50)*Cos(a);
Y[i]=y+(Speed*1.50)*Sin(a)
}
DummyDist[i]-=Speed
SetUnitFlyHeight(u,(4.*(DummyZ[i]+FlyHeight)/DummyDist2[i])*(DummyDist2[i]-DummyDist[i])*(DummyDist[​i]/DummyDist2[i]),0.) else
Unit=Caster[i]
g=CreateGroup();
GroupEnumUnitsInRange(g,X[i],Y[i],Range,Condition(function Filt))
ForGroup(g,function Damageee)
DestroyGroup(g)
KillUnit(u)
if i!=C then
Dummy[i]=Dummy[C]
DummyZ[i]=DummyZ[C]
DummyDist[i]=DummyDist[C]
DummyDist2[i]=DummyDist2[C]
X[i]=X[C]
Y[i]=Y[C]
Z[i]=Z[C]
Bool[i]=Bool[C]
Caster[i]=Caster[C]
endif
C--
}
i++
ifloop i>C
}
if C==0
PauseTimer(Timer)
endif
u=null
g=null
}
private void Clear() {
timer t=GetExpiredTimer()
integer i=GetNumTimer(t)
if (GetWidgetLife(Select[i])<=0.450 and Selected[i]!=null) or Selected[i]!=null {
Select[i]=Selected[i]
Selected[i]=null
DestroyTimer(t);
t=CreateTimer()
TimerStartEx(t,0.1,false,function Clear,i)
} elseif GetWidgetLife(Select[i])<=0.450 and Selected[i]==null {
DestroyTimer(t)
Select[i]=null
Selected[i]=null
} else {
DestroyTimer(t);
t=CreateTimer()
TimerStartEx(t,0.1,false,function Clear,i)
}
t=null
}
private void LastAttack() {
timer t=GetTimer;
integer i=GetNumTimer(t);
SpeedAttackWeapon[i]=LastSpeedAttack[i];
DestroyTimer(t);
}
#if ABIL==true
private boolean Start() {
unit u=GetSpellAbilityUnit()
integer i=GetPlayerId(GetOwningPlayer(u))
if GetSpellAbilityId()==Abil {
SelectUnitForPlayerSingle(u,Player(i));
UnitRemoveAbility(u,Abil)
UnitAddAbility(u,Abil2)
} elseif GetSpellAbilityId()==Abil2 {
UnitRemoveAbility(u,Abil2)
UnitAddAbility(u,Abil)
}
u=null
return false
}
#endif
private boolean Con() {
unit u=GetTriggerUnit()
timer t
integer i=GetPlayerId(GetTriggerPlayer())
if IsUnitSelected(u,GetOwningPlayer(u))==true {
GetLastSelectUnit[i]=u
}
if IsUnitSelected(u,GetOwningPlayer(u))==true and Select[i]==null and GetUnitAbilityLevel(u,Abil2)>0 {
Select[i]=u
set t=CreateTimer();
TimerStartEx(t,0.1,false,function Clear,i)
} elseif IsUnitSelected(u,GetOwningPlayer(u))==true and Select[i]!=null and GetUnitAbilityLevel(u,Abil2)>0 {
set Selected[i]=u
} elseif Select[i]!=null and Select[i]==GetLastSelectUnit[i] and IsUnitEnemy(u,GetOwningPlayer(Select[i])) and GetUnitAbilityLevel(Select[i],Abil2)>0 {
SelectUnitForPlayerSingle(Select[i],Player(i));
if HaveSavedInteger(BASH_HashSTUUUUUUN,H2I(u),1)==false and SpeedAttackWeapon[i]>0. {
LastSpeedAttack[i]=SpeedAttackWeapon[i];
set t=CreateTimer();
TimerStartEx(t,SpeedAttackWeapon[i],false,function LastAttack,i)
SpeedAttackWeapon[i]=0.;
C++
Caster[C]=Select[i]
X[C]=GetUnitX(u)
Y[C]=GetUnitY(u)
Bool[C]=true
#if RangeZ==true
Z[C]=GetUnitFlyHeight(u)+55.55
# else
Z[C]=9.0
#endif
real a=57.296*Atan2(Y[C]-GetUnitY(u),X[C]-GetUnitX(u))
real d=DistXY(GetUnitX(Select[i]),GetUnitY(Select[i]),X[C],Y[C])
if d>Distance then
#if At==true
Z[C]=a+GetRandomReal(0.,360.)
X[C]=GetUnitX(Select[i])+Distance*Cos(Z[C])
Y[C]=GetUnitY(Select[i])+Distance*Sin(Z[C])
Z[C]=9.0
d=Distance
# else
RemoveUnit(Dummy[C])
C--
return false
#endif
endif
SetUnitAnimation(Select[i],"attack")
Dummy[C]=CreateUnit(Player(i),dum,GetUnitX(Select[i]),GetUnitY(Select[i]),a)
SetUnitX(Dummy[C],GetUnitX(Select[i]))
SetUnitY(Dummy[C],GetUnitY(Select[i]))
SetUnitFacing(Dummy[C],a)
UnitAddAbility(Dummy[C], 'Amrf')
UnitRemoveAbility(Dummy[C], 'Amrf')
SetUnitFlyHeight(Dummy[C],GetUnitFlyHeight(Select[i])+150.00,0.)
DummyDist[C]=d
DummyDist2[C]=d
DummyZ[C]=GetUnitFlyHeight(Select[i])+150.00
if C==1 {
TimerStart(Timer,0.025,true,function Move)
}
}
}
u=null
return false
}
private void Init() {
SpeedAttackWeapon[0]=1.
SpeedAttackWeapon[1]=1.
SpeedAttackWeapon[2]=1.
SpeedAttackWeapon[3]=1.
SpeedAttackWeapon[4]=1.
SpeedAttackWeapon[5]=1.
SpeedAttackWeapon[6]=1.
SpeedAttackWeapon[7]=1.
SpeedAttackWeapon[8]=1.
SpeedAttackWeapon[9]=1.
SpeedAttackWeapon[10]=1.
SpeedAttackWeapon[11]=1.
SpeedAttackWeapon[12]=1.
trigger t=CreateTrigger()
integer i=0
trigger t2=CreateTrigger()
#if ABIL==true
TriggerRegisterAnyUnitEventBJ(t2, EVENT_PLAYER_UNIT_SPELL_EFFECT)
TriggerAddCondition(t2,Condition(function Start))
# else
DestroyTrigger(t2)
#endif
loop
Select[i]=null
Selected[i]=null
TriggerRegisterPlayerUnitEvent(t,Player(i), EVENT_PLAYER_UNIT_SELECTED, null)
i++
ifloop i>11
endloop
TriggerAddCondition(t,Condition(function Con))
t=null
t2=null
}
}
))
))

Отредактировано ScorpioT1000, 22.04.2013 в 16:15.
Старый 22.04.2013, 15:58
agentex

offline
Опыт: 34,834
Активность:
событие EVENT_PLAYER_UNIT_SELECTED и сосбтвенно SelectUnit выполняются с задержкой, возможно в этом причина
Старый 22.04.2013, 22:15
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
((код jass
GetWidgetLife(Select[i])<=0.450 and Selected[i]!=null) or Selected[i]!=null
))
странное условие...
мб лучше так
((код jass
IsUnitType(Select[i], UNIT_TYPE_DEAD) and Select[i]!=null) or Selected[i]!=null
))
quq_CCCP добавил:
И кстати а отладочные сообщения вы использовать не пробовали?

Отредактировано Doc, 23.04.2013 в 10:58.
Старый 23.04.2013, 02:33
влад10011

offline
Опыт: 2,337
Активность:
quq_CCCP:
IsUnitType(Select[i], UNIT_TYPE_DEAD) and Select[i]!=null) or Selected[i]!=null
а разница?
quq_CCCP:
И кстати а отладочные сообщения вы использовать не пробовали?
Ты имеешь в виду каждый раз хостовать её в мультиплеере, чтобы посмотреть на отладочные сообщения? О_О
(так как в одиночной нет смысла, потому что работает)
agentex, ты частично прав, я заметил что событие вообще не происходит Х_Х
В чём может быть проблема?
Старый 23.04.2013, 12:50
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
влад10011, давай хостанёшь и проверим... Что же там не так, и кстати мб вызывать через таймер функции SelectUnit и тд...
Старый 23.04.2013, 15:25
влад10011

offline
Опыт: 2,337
Активность:
В общем, карты у меня больше нет(жёсткий диск умер), тему можно закрывать...
Старый 03.05.2013, 12:55
Ответ

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

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

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

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



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