Problem z AddCom w grze Multiplayer

Wszelkie pytania na temat SAIL'a i modowania OW.
JohnRambozinho
Soldier level 0
Soldier level 0
Poland
Posty: 3
Rejestracja: Sat May 05, 2018 3:08 pm

Problem z AddCom w grze Multiplayer

Post autor: JohnRambozinho »

Od jakiegoś czasu zajmuję się modem, którego głównym zamysłem jest gra podobna do tego co oferuje mod Cooperation, jednak na nowych, zaprojektowanych przeze mnie mapach i skupiająca się raczej na pokonaniu wspólnymi siłami potężnego komputerowego przeciwnika. Pisząc misję napotkałem dziwny błąd, który występuje tylko w grze wieloosobowej, mianowicie funkcja AddCom multiplikuje się przez ilość żywych graczy obecnych w grze. Najlepszym przykładem jest rozkaz budowy pojazdów fabryce, w edytorze działa jak powinien ale na multi polecenie wykona się tyle razy ilu graczy jest w grze. Podobnie wygląda wytyczanie ścieżek - jednostki wykonują pętlę. Dotyczy to tylko tej funkcji, samo Com działa jak powinno. Wiem, że jestem w stanie to obejść nieco zmieniając kod, zastanawiam się tylko czy spotkał się ktoś z czymś podobnym i ewentualnie znalazł przyczynę/rozwiązanie problemu?

Mam steamową wersję OW spatchowaną do 3.0.7.211, problem występował też w wersji, która obecnie jest na steamie (2.0.6.143).
User avatar
Serpent
Soldier level 10
Soldier level 10
Estonia
Posty: 4175
Rejestracja: Tue Jul 07, 2009 9:13 pm
Location: Polska - EuroStan ZSRE
Kontakt:

Re: Problem z AddCom w grze Multiplayer

Post autor: Serpent »

Pokaż swój kod.
Epickie teksty:
Marek1906: jak zrobic aby sail był zielony?
Kvantovy: Wszystko normalne, wszystko w koło było dziwne
Kvantovy:: To jest fajne, że to nie jest takie głupie
Kvantovy:: remove sos from kanapeczka
Kvantovy:: zdarzają się rzezy które sie filozofom nie śniły
Cenwen: problemem jest gejostwo
"Taki z niego fizyk jak ze mnie baletnica" - Profesor Scholtze o Kvantovym.
JAKBYŁ BYM CZECHEM TO BYM ROZŁOŻYŁ NAMIOT ~Kvanciak
JohnRambozinho
Soldier level 0
Soldier level 0
Poland
Posty: 3
Rejestracja: Sat May 05, 2018 3:08 pm

Re: Problem z AddCom w grze Multiplayer

Post autor: JohnRambozinho »

Poniżej dwa najważniejsze fragmenty kodu, w załączniku cały kod. Od paru dni próbuje dojść co może powodować tą multiplikację, ale nie mam pojęcia.


Spoiler:
every 2$0 marked 5 do

begin

disable(5);

//PRODUKCJA NA ATAKI LEWY GORA I LEWY DOL

Randomize;
produkcja(rufab1);
produkcja2(arfab1);
produkcja(rufab2);
produkcja2(arfab2);


wait(0$30);

comlinkto(FilterUnitsInArea(fab2, [[f_type,unit_vehicle],[f_side,8]]),leg_mech[1]);
comlinkto(FilterUnitsInArea(fab4, [[f_type,unit_vehicle],[f_side,8]]),leg_mech[1]);

wait(0$30);

comlinkto(FilterUnitsInArea(fab2, [[f_type,unit_vehicle],[f_side,8]]),leg_mech[1]);
comlinkto(FilterUnitsInArea(fab4, [[f_type,unit_vehicle],[f_side,8]]),leg_mech[1]);

wait(0$30);

comlinkto(FilterUnitsInArea(fab2, [[f_type,unit_vehicle],[f_side,8]]),leg_mech[1]);
comlinkto(FilterUnitsInArea(fab4, [[f_type,unit_vehicle],[f_side,8]]),leg_mech[1]);

wait(0$30);

comlinkto(FilterUnitsInArea(fab2, [[f_type,unit_vehicle],[f_side,8]]),leg_mech[1]);
comlinkto(FilterUnitsInArea(fab4, [[f_type,unit_vehicle],[f_side,8]]),leg_mech[1]);

wait(1$0);


comagressivemove(FilterUnitsInArea(fab1, [[f_type,unit_vehicle],[f_side,8],[f_not,[f_weapon,ru_cargo_bay]]]),176,77);
comagressivemove(FilterUnitsInArea(fab2, [[f_type,unit_vehicle],[f_side,8],[f_not,[f_weapon,ru_cargo_bay]]]),176,77);

comagressivemove(FilterUnitsInArea(fab3, [[f_type,unit_vehicle],[f_side,8],[f_not,[f_weapon,ru_cargo_bay]]]),218,208);
comagressivemove(FilterUnitsInArea(fab4, [[f_type,unit_vehicle],[f_side,8],[f_not,[f_weapon,ru_cargo_bay]]]),218,208);



wait(1$0);

wozy1atk:=FilterUnitsInArea(atk1, [[f_type,unit_vehicle],[f_side,8],[f_not,[f_weapon,ru_cargo_bay]]]); //RU
wozy2atk:=FilterUnitsInArea(atk2, [[f_type,unit_vehicle],[f_side,8],[f_not,[f_weapon,ru_cargo_bay]]]); //AR


//PRODUKCJA NA ATAKI PRAWY GORA I PRAWY DOL


produkcja(rufab1);
produkcja2(arfab1);
produkcja(rufab2);
produkcja2(arfab2);


wait(0$30);

comlinkto(FilterUnitsInArea(fab2, [[f_type,unit_vehicle],[f_side,8]]),leg_mech[2]);
comlinkto(FilterUnitsInArea(fab4, [[f_type,unit_vehicle],[f_side,8]]),leg_mech[2]);

wait(0$30);

comlinkto(FilterUnitsInArea(fab2, [[f_type,unit_vehicle],[f_side,8]]),leg_mech[2]);
comlinkto(FilterUnitsInArea(fab4, [[f_type,unit_vehicle],[f_side,8]]),leg_mech[2]);

wait(0$30);

comlinkto(FilterUnitsInArea(fab2, [[f_type,unit_vehicle],[f_side,8]]),leg_mech[2]);
comlinkto(FilterUnitsInArea(fab4, [[f_type,unit_vehicle],[f_side,8]]),leg_mech[2]);

wait(0$30);

comlinkto(FilterUnitsInArea(fab2, [[f_type,unit_vehicle],[f_side,8]]),leg_mech[2]);
comlinkto(FilterUnitsInArea(fab4, [[f_type,unit_vehicle],[f_side,8]]),leg_mech[2]);

wait(1$0);


comagressivemove(FilterUnitsInArea(fab1, [[f_type,unit_vehicle],[f_side,8],[f_not,[f_weapon,ru_cargo_bay]]]),253,110);
comagressivemove(FilterUnitsInArea(fab2, [[f_type,unit_vehicle],[f_side,8],[f_not,[f_weapon,ru_cargo_bay]]]),253,110);

comagressivemove(FilterUnitsInArea(fab3, [[f_type,unit_vehicle],[f_side,8],[f_not,[f_weapon,ru_cargo_bay]]]),311,193);
comagressivemove(FilterUnitsInArea(fab4, [[f_type,unit_vehicle],[f_side,8],[f_not,[f_weapon,ru_cargo_bay]]]),311,193);



wait(1$0);

wozy3atk:=FilterUnitsInArea(atk3, [[f_type,unit_vehicle],[f_side,8],[f_not,[f_weapon,ru_cargo_bay]]]); //RU
wozy4atk:=FilterUnitsInArea(atk4, [[f_type,unit_vehicle],[f_side,8],[f_not,[f_weapon,ru_cargo_bay]]]); //AR


wait(0$5);


comagressivemove(wozy1atk,22,13);

comagressivemove(wozy2atk,168,301);

comagressivemove(wozy3atk,305,10);

comagressivemove(wozy4atk,455,302);


enable(5);

end;
Spoiler:
export function produkcja(fabryka);
var fabbron,fabpodwozia;

begin
randomizeall;

case rand(1,3) of
1: fabbron := ru_gun;
2: fabbron := ru_gatling_gun;
3: fabbron := ru_rocket_launcher;
end;

AddResourceType(GetBase(fabryka),mat_cans,120);
AddResourceType(GetBase(fabryka),mat_siberit,40);

wait(0$0.5);
addComConstruct(fabryka, ru_medium_tracked, engine_siberite, control_computer, fabbron);

end;


export function produkcja2(fabryka);
var fabbron,fabpodwozia;

begin
randomizeall;

fabpodwozia := ar_half_tracked;


case rand(1,4) of
1: fabbron := ar_gun;
2: fabbron := ar_gatling_gun;
3: fabbron := ar_flame_thrower;
4: fabbron := ar_rocket_launcher;
end;


AddResourceType(GetBase(fabryka),mat_cans,180);
AddResourceType(GetBase(fabryka),mat_oil,200);

wait(0$0.5);

AddComConstruct(fabryka, fabpodwozia, engine_combustion, control_remote, fabbron);


end;
Załączniki
kod.zip
(7.74 KiB) Downloaded 94 times
User avatar
Serpent
Soldier level 10
Soldier level 10
Estonia
Posty: 4175
Rejestracja: Tue Jul 07, 2009 9:13 pm
Location: Polska - EuroStan ZSRE
Kontakt:

Re: Problem z AddCom w grze Multiplayer

Post autor: Serpent »

Problem leży w tym bloku every - za dużo tam chaosu. Komendy wait pomieszane z komendami na podłączanie pojazdów i to wszystko w zapętlonym every. Każda czynność powinna być w miarę możliwości oddzielona. Przykładowo: budowę pojazdów realizuje dany fragment kodu, a podłączanie pojazdów inny. Ogółem "wait" w multiplayer to nie jest dobry pomysł.

Przykład że every działa prawidłowo w multi (za każdym razem co 12 minut budowane jest veh_counter pojazdów - bez względu na to ile graczy jest w grze):

Code: Select all

Every 12$00 trigger FilterAllUnits([[f_side, bot_side], [f_btype, b_factory]]) do
var i, tmp, p;
begin
enable;

tmp := queue_codes[rng];
p := 1;

for i = 1 to veh_counter do
    begin
    AddComConstruct(FilterAllUnits([[f_side, bot_side], [f_btype, b_factory]])[1],
                    to_produce[tmp mod 10][1],
                    to_produce[tmp mod 10][2],
                    to_produce[tmp mod 10][3],
                    to_produce[tmp mod 10][4]
                    );

    tmp := tmp / 10;
    p := p + 1;

    if p > 5 then
       begin
       p := 1;
       tmp := queue_codes[rng];
       end;
    end;

rng := rng + 1;

if rng > queue_codes then
   rng := 1;
End;
Epickie teksty:
Marek1906: jak zrobic aby sail był zielony?
Kvantovy: Wszystko normalne, wszystko w koło było dziwne
Kvantovy:: To jest fajne, że to nie jest takie głupie
Kvantovy:: remove sos from kanapeczka
Kvantovy:: zdarzają się rzezy które sie filozofom nie śniły
Cenwen: problemem jest gejostwo
"Taki z niego fizyk jak ze mnie baletnica" - Profesor Scholtze o Kvantovym.
JAKBYŁ BYM CZECHEM TO BYM ROZŁOŻYŁ NAMIOT ~Kvanciak
JohnRambozinho
Soldier level 0
Soldier level 0
Poland
Posty: 3
Rejestracja: Sat May 05, 2018 3:08 pm

Re: Problem z AddCom w grze Multiplayer

Post autor: JohnRambozinho »

Ach, rozumiem. Dzięki. Uporządkuje ten kod i mam nadzieję, że będzie śmigać.
ODPOWIEDZ