влад10011
offline
Опыт:
2,337Активность: |
функция SelectUnitForPlayerSingle
Здрасте, Я сделал 1 систему, с использованием SelectUnitForPlayerSingle но столкнулся с проблемой: эта функция не работает в мультиплеере. Как заставить работать SelectUnitForPlayerSingle в мультиплеере игре?(или чем можно её заменить) |
21.04.2013, 19:48 | #1
+1/−1
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Hanabishi
COOL STATUS
offline
Опыт: отключен
|
Если раскрыть
А вообще должна работать вроде как |
21.04.2013, 20:07 | #2
+1/−1
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
влад10011
offline
Опыт:
2,337Активность: |
да я знаю как она в раскрытом виде, просто у меня не работает и я хотел узнать как это исправить. Моя система состоит в том чтобы при клике на врага от выделенного дружественного летел снаряд и сразу заново выбирался тот юнит от которого шёл выстрел, но это работает только в одиночной игре =( В мультиплеере это действие не происходит. |
21.04.2013, 20:31 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Borodach
offline
Опыт:
6,328Активность: |
Может так сделать....
|
21.04.2013, 22:44 | #4
+0/−2
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Zetox
offline
Опыт:
1,698Активность: |
Цитата:
ни в коем случае. |
|
21.04.2013, 22:49 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
IceFog
offline
Опыт:
8,002Активность: |
Что не работает? Происходит десинхронизация? И скинь свою систему, иначе как тебе помогут? |
22.04.2013, 00:00 | #6
+0/−2
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
quq_CCCP
Я белый и пушистый!
offline
Опыт:
94,598Активность: |
влад10011, ну как не работает? мб весь триггер или функция не работает, поток рвется из за корявого условия и тп... Код пожалуйста в студию, мы протестуем и скажем работает или нет! P.S у меня всегда эта БЖ работала корректно |
22.04.2013, 02:46 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
влад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_WHOKNOWS) 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 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
agentex
offline
Опыт:
34,534Активность: |
событие EVENT_PLAYER_UNIT_SELECTED и сосбтвенно SelectUnit выполняются с задержкой, возможно в этом причина |
22.04.2013, 22:15 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
quq_CCCP
Я белый и пушистый!
offline
Опыт:
94,598Активность: |
((код 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 | #10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
влад10011
offline
Опыт:
2,337Активность: |
quq_CCCP:
а разница? quq_CCCP: Ты имеешь в виду каждый раз хостовать её в мультиплеере, чтобы посмотреть на отладочные сообщения? О_О (так как в одиночной нет смысла, потому что работает) agentex, ты частично прав, я заметил что событие вообще не происходит Х_Х В чём может быть проблема? |
23.04.2013, 12:50 | #11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
quq_CCCP
Я белый и пушистый!
offline
Опыт:
94,598Активность: |
влад10011, давай хостанёшь и проверим... Что же там не так, и кстати мб вызывать через таймер функции SelectUnit и тд... |
23.04.2013, 15:25 | #12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
влад10011
offline
Опыт:
2,337Активность: |
В общем, карты у меня больше нет(жёсткий диск умер), тему можно закрывать... |
03.05.2013, 12:55 | #13
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|