+ Antworten
Ergebnis 1 bis 12 von 12
  1. #1
    Bauer Avatar von esmebritt
    Registriert seit
    10.01.2008
    Beiträge
    516

    Standard TravelingSalesman funzt auf keiner map

    Ich hab da ein blödes Problem: Habe jetzt diverse Versuche auf verschiedenen - eigens dafür angelegten - maps durch, den Hafenhändler zu aktivieren. Der soll per Quest aufgerufen werden: Reward_MapScriptFunktion "Seehandel".

    Hier die dazu gehörige Funktion:

    function Seehandel()
    ActivateTravelingSalesman( 8,
    {
    {5,{{Goods.G_Stone, 10},{Goods.G_Iron, 10}}},
    {10,{{Goods.G_Carcass, 10},{Goods.G_Beer, 1}}}
    })
    end

    (In einer früheren Map funzte das Ganze überhaupt nicht - da lag es aber wohl an der leider komplett zerschossenen map (hatte da vermutlich zu viel in den Terris rumgefeatured.)

    In allen jetzt eigens dafür kurz gebastelten maps kommt die Debug-Meldung:
    "Only one merchant ship is supportet at the moment".

    Hab die einfache Variante mit einem TradeShipMoveTo und einem TradeShipSpawn.
    Beide ohne Hindernisse dazwischen, beide auf der map und nicht außerhalb.

    Ist mein edi kaputt?? oder bin ich einfach zu dusslig? Zweite Frage bitte nicht nur mit "Ja" beantworten

  2. #2
    Schwertkämpfer Avatar von trabbi
    Registriert seit
    09.03.2006
    Beiträge
    4,437

    Standard AW: TravelingSalesman funzt auf keiner map

    kanns nicht im Einzelnen jetzt nachvollziehen,
    aber die Debug-Meldung ist doch Eindeutig!
    Zum Zeitpunkt des Questaufrufs ist der Salesman noch auf hoher See

    Deine Warenzuweisungen sollten aktiv werden, wenn der Händler in Richtung Hafen unterwegs ist.
    trabbi
    Was ist Theorie, - Wenns klappen soll und es klappt nie
    Was ist Praxis, - Frag nicht so dumm, wenns klappt und Du weißt nicht warum

  3. #3
    Bauer Avatar von esmebritt
    Registriert seit
    10.01.2008
    Beiträge
    516

    Standard AW: TravelingSalesman funzt auf keiner map

    Ach trabbi *seufz* - du munterst mich richtig auf ... geht dann in etwa so weiter: "... und dann ist er in einen schweren Sturm geraten, hat alle Waren verloren und traut sich nicht mehr nach Hause in den Hafen ..."

  4. #4
    Schwertkämpfer Avatar von trabbi
    Registriert seit
    09.03.2006
    Beiträge
    4,437

    Standard AW: TravelingSalesman funzt auf keiner map

    aber die originale function kennst Du schon ?
    halt ohne Questaufruf, da bin ich mir aber auch nicht Sicher,
    ob das überhaupt per Quest geht ??

    denn der salesmann wird doch in einem bestimmten Monat gestartet

    Code:
    --xxxxxxxxxxxxxxxxxxxxxxx--TravelingSalesman--xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx--
    --  Das muss in das globale Skript:
    TravelingSalesman = {
        Loop = "TravelingSalesman_Loop",
        List = {}
    };
    function TravelingSalesman:new(_player, _offerTable, _duration, _path, _noWave)
        _path = _path or ShipPath[_player];
        if not _path then
            -- use BB traveling salesman script instead
            ActivateTravelingSalesman(_player, _offerTable, _duration);
            return;
        end 
        if (g_TravelingSalesman and g_TravelingSalesman.PlayerID) then
            Logic.DEBUG_AddNote("DEBUG: You must either use a BB traveling salesman or a new salesman");
        elseif TravelingSalesman.List[_player] then
            Logic.DEBUG_AddNote("DEBUG: There is already a traveling salesman for player " .. _player);
            return;
        end 
        -- don't allow BB traveling salesman now
        g_TravelingSalesman = {}; 
        -- create new salesman and initialize
        local travelingSalesman = {};
        Table_Copy(travelingSalesman, self);
        travelingSalesman.PlayerID = _player;
        travelingSalesman.Storehouse = Logic.GetStoreHouse(_player);
        travelingSalesman.Status = g_TravelingSalesmanStatus.Sailing;
        travelingSalesman.ActiveTime = (_duration or 1) * Logic.GetMonthDurationInSeconds();
        travelingSalesman.OfferTable = {};
        travelingSalesman.CreateWave = not _noWave; -- standard: Use ship wave 
        for i = 1, #_offerTable do
            local month = _offerTable[i][1];
            travelingSalesman.OfferTable[month] = _offerTable[i][2];
        end
        travelingSalesman.Path = _path;
        travelingSalesman.SpawnPoint = travelingSalesman.Path[1];
        travelingSalesman.DestinationPoint = travelingSalesman.Path[#travelingSalesman.Path];
        if travelingSalesman.SpawnPoint == travelingSalesman.Destination then
            Logic.DEBUG_AddNote("DEBUG: Destination is spawn point?");
        end 
        -- don't allow sale
        for pId = 1, 8 do
            Logic.SetTraderPlayerState(travelingSalesman.Storehouse, pId, 8); --2
        end 
        -- setup the player
        SetupPlayer(_player, "H_NPC_Generic_Trader", "XTradeShipX", "TravelingSalesmanColor") 
        -- start job
        travelingSalesman.Job = Trigger.RequestTrigger(Events.LOGIC_EVENT_EVERY_SECOND, nil, self.Loop, 1, 0, { JobQueue_AddParameter(travelingSalesman) }); 
        -- add to list
        TravelingSalesman.List[_player] = travelingSalesman; 
        -- return!
        return travelingSalesman;
    end
    function TravelingSalesman:Sail()
        local currMonth = Logic.GetCurrentMonth();
        for month, offers in pairs(self.OfferTable) do
            if month == currMonth then
                -- create offers
                g_TravelingSalesman = { StorehouseID = self.Storehouse };
                GenerateTravelingSalesManOffersForMonth(offers); 
                -- create ship (and wave)
                local x, y = Logic.GetEntityPosition(self.SpawnPoint);
                local orientation = Logic.GetEntityOrientation(self.SpawnPoint);
                self.Ship = Logic.CreateEntity(Entities.D_X_TradeShip, x, y, orientation, self.PlayerID);
                self.ShipPathInstance = Path:new(self.Ship, self.Path, false, true, self.ShipArrived, self.Left, true, nil, self, 500); 
                if self.CreateWave then
                    self.Wave = Logic.CreateEntity(Entities.E_Kogge, x, y, orientation, self.PlayerID);
                    self.WavePathInstance = Path:new(self.Wave, self.Path, false, true, self.WaveArrived, nil, true, nil, nil, 500);
                end 
                self.Status = g_TravelingSalesmanStatus.OnHisWay; 
                -- message of salesman
                Logic.ExecuteInLuaLocalState("LocalScriptCallback_QueueVoiceMessage(".. self.PlayerID ..", 'TravelingSalesmanSpotted')");
                -- callback
                if Mission_Callback_TravelingSalesman then
                    Mission_Callback_TravelingSalesman(self.Status, self.PlayerID);
                end
                return;
            end
        end
    end
    function TravelingSalesman.ShipArrived(_path, _destPoint)
        local self = _path.TagData; 
        -- timestamp
        self.StartOfActiveTime = Logic.GetTime(); 
        -- allow selling
        for pId = 1, 8 do
            Logic.SetTraderPlayerState(self.Storehouse, pId, 0);
        end
        QuestTemplate:New("TravelingSalesman",
            self.PlayerID,
            1,
            { {Objective.Object, { _destPoint } } },
            { { Triggers.Time, 0 } },
            self.ActiveTime
        );
        if Mission_Callback_TravelingSalesman then
            Mission_Callback_TravelingSalesman(self.Status, self.PlayerID);
        end
        self.Status = g_TravelingSalesmanStatus.AtHarbour; 
        -- hack to circumvent Trigger.DisableTrigger() problem and to rotate the entity (Logic.MoveEntity() seems to be called to the current position after this function is called)
        Trigger.RequestTrigger(Events.LOGIC_EVENT_EVERY_TURN, nil, "HACK_TravelingSalesman_RotateEntityAndDisableTrigger", 1, 0, { _path.Job, _path.Entity, Logic.GetEntityOrientation(_destPoint) });
    end 
    function TravelingSalesman.WaveArrived(_path, _destPoint) 
        -- hack to circumvent Trigger.DisableTrigger() problem and to rotate the entity (Logic.MoveEntity() seems to be called to the current position after this function is called)
        Trigger.RequestTrigger(Events.LOGIC_EVENT_EVERY_TURN, nil, "HACK_TravelingSalesman_RotateEntityAndDisableTrigger", 1, 0, { _path.Job, _path.Entity, Logic.GetEntityOrientation(_destPoint) });
    end 
    function HACK_TravelingSalesman_RotateEntityAndDisableTrigger(_job, _entity, _orientation)
        Logic.RotateEntity(_entity, _orientation);
        Trigger.DisableTrigger(_job);
        return true;
    end 
    function TravelingSalesman:AtHarbour()
        -- shall it return?
        if Logic.GetTime() > self.StartOfActiveTime + self.ActiveTime then
            Trigger.EnableTrigger(self.ShipPathInstance.Job); 
            if self.Wave then
                Trigger.EnableTrigger(self.WavePathInstance.Job);
            end 
            for pId = 1, 8 do
                Logic.SetTraderPlayerState(self.Storehouse, pId, 2);
            end 
            self.Status = g_TravelingSalesmanStatus.Leaving; 
            if Mission_Callback_TravelingSalesman then
                Mission_Callback_TravelingSalesman(self.Status, self.PlayerID);
            end
        end
    end 
    function TravelingSalesman.Left(_path)
        local self = _path.TagData; 
        -- destroy ship
        Logic.DestroyEntity(self.Ship);
        self.Ship = nil;
        self.ShipPathInstance = nil; 
        -- destroy wave
        if self.Wave then
            Logic.DestroyEntity(self.Wave);
            self.Wave = nil;
            self.WavePathInstance = nil;
        end 
        -- reset state
        self.Status = g_TravelingSalesmanStatus.Sailing; 
        if Mission_Callback_TravelingSalesman then
            Mission_Callback_TravelingSalesman(self.Status, self.PlayerID);
        end
    end
    function TravelingSalesman_Loop(_index)
        local self = JobQueue_GetParameter(_index);
        -- when store house is destroyed, end 
        if Logic.IsEntityDestroyed(self.Storehouse) then
            if self.Ship and Logic.IsEntityAlive(self.Ship) then
                Logic.DestroyEntity(self.Ship);
                if self.ShipPathInstance then
                    Trigger.UnrequestTrigger(self.ShipPathInstance.Job);
                    self.ShipPathInstance = nil;
                end
                if self.CreateWave and self.Wave and Logic.IsEntityAlive(self.Wave) then
                    Logic.DestroyEntity(self.Wave);
                    if self.WavePathInstance then
                        Trigger.UnrequestTrigger(self.WavePathInstance.Job);
                        self.WavePathInstance = nil;
                    end
                end
            end
            TravelingSalesman.List[self.PlayerID] = nil; 
            JobQueue_RemoveParameter(_index);
            Logic.ExecuteInLuaLocalState("LocalScriptCallback_QueueVoiceMessage(" .. self.PlayerID .. ", 'TravelingSalesmanDestroyed')");
            return true;
        end 
        if self.Status == g_TravelingSalesmanStatus.Sailing then
            self:Sail();
        elseif self.Status == g_TravelingSalesmanStatus.AtHarbour then
            self:AtHarbour();
        elseif self.Status ~= g_TravelingSalesmanStatus.OnHisWay and self.Status ~= g_TravelingSalesmanStatus.Leaving then
            Logic.DEBUG_AddNote("DEBUG: Unknown traveling salesman state!");
        end
    end
    --  Diese Funktion generiert euch daraus einen Pfad:
    function GetEntitiesNamedWith(_name)
        local list = {};
        local i = 1;
        local bFound = true;
        while bFound do
            local entity = Logic.GetEntityIDByName(_name .. i);
            if entity ~= 0 then
                table.insert(list, entity);
            else
                bFound = false;
            end
            i = i + 1;
        end
        return list;
    end
    --------------------------------
    --    Dazu in Mission_InitMerchants() :
        TravelingSalesman:new(8, { { 4, { {Goods.G_Iron, 10}, {Goods.G_Stone, 10} } } },  nil, GetEntitiesNamedWith("Weg"))    
    --     gebraucht werden: S_ShipPath    -- benannt mit Weg1, Weg2 usw. 
    --xxxxxxxxxxxxxxxxxxxxxxxx--TravelingSalesman--Ende--xxxxxxxxxxxxxxxxxxxxxxxxxxxxx--
    Geändert von trabbi (29.04.2011 um 17:17 Uhr)
    trabbi
    Was ist Theorie, - Wenns klappen soll und es klappt nie
    Was ist Praxis, - Frag nicht so dumm, wenns klappt und Du weißt nicht warum

  5. #5
    Bauer Avatar von esmebritt
    Registriert seit
    10.01.2008
    Beiträge
    516

    Standard AW: TravelingSalesman funzt auf keiner map

    Hab doch - wie oben gesagt - die einfache Version drin, nicht die von OMD. Da reicht, soweit ich weiß, doch der Aufruf "ActivateTravelingSalesman" und ja, das muss nicht unbedingt in die InitMerchants, hat mir Cine mal erklärt. Ich möchte es eben per Quest steuern und das funzt auch normalerweise...
    Es ist zum Haare raufen...

  6. #6
    Schwertkämpfer Avatar von trabbi
    Registriert seit
    09.03.2006
    Beiträge
    4,437

    Standard AW: TravelingSalesman funzt auf keiner map

    Stellt sich die Frage, ist in der von Dir verwendeten QSB der
    ActivateTravelingSalesman
    überhaupt vorhanden ??
    -----------------------
    Auf den Gedanken bin ich nun gekomen,
    weil ich grad mal mein Tutorial angesehen habe.
    Da hat KuschelUschi sowas in der Art beigeschrieben
    Geändert von trabbi (29.04.2011 um 18:08 Uhr)
    trabbi
    Was ist Theorie, - Wenns klappen soll und es klappt nie
    Was ist Praxis, - Frag nicht so dumm, wenns klappt und Du weißt nicht warum

  7. #7
    Bauer Avatar von esmebritt
    Registriert seit
    10.01.2008
    Beiträge
    516

    Standard AW: TravelingSalesman funzt auf keiner map

    Danke trabbi, dass du dir für mich die Zeit nimmst!!

    Hab QSB 3.9, ne neuere gibts ja nicht - hab auch mit der erweiterten 3.9 von Wolfi gearbeitet, ist die normale 3.9 - von ihm um einige Befehle erweitert. Außerdem fände ich es sehr seltsam, wenn die QSB den TravelingSalesman nicht kennt, wenn sie mir sagt, dass es nur ein Schiff gibt..

    Nebenbei - ich hab das Gefühl, ich wandele auf KuschelUschis Spuren, was die Fehlerhäufung angeht
    Geändert von esmebritt (29.04.2011 um 18:37 Uhr) Grund: t - rabbi mal wieder großgeschrieben

  8. #8
    Schwertkämpfer Avatar von trabbi
    Registriert seit
    09.03.2006
    Beiträge
    4,437

    Standard AW: TravelingSalesman funzt auf keiner map



    hat Sombeline denn keinen Ansatz parat ?
    -----------------
    denn ich bin so gut wie raus, bei S6
    keine Ahnung mehr, ich schau nur in meine gesammelten Werke
    trabbi
    Was ist Theorie, - Wenns klappen soll und es klappt nie
    Was ist Praxis, - Frag nicht so dumm, wenns klappt und Du weißt nicht warum

  9. #9
    Bauer Avatar von esmebritt
    Registriert seit
    10.01.2008
    Beiträge
    516

    Standard AW: TravelingSalesman funzt auf keiner map

    Zitat Zitat von trabbi Beitrag anzeigen


    hat Sombeline denn keinen Ansatz parat ?
    Weiß nicht, hab sie noch nicht belästigt - die hat so mit ihrer map zu tun... Huhuuuu, CHRISTEL!!!

    -----------------
    Zitat Zitat von trabbi Beitrag anzeigen
    denn ich bin so gut wie raus, bei S6
    keine Ahnung mehr, ich schau nur in meine gesammelten Werke
    ... und das ist so schade, grade jetzt, wo ich doch langsam auf meine Füße komme

  10. #10
    Sombeline
    Gast

    Standard AW: TravelingSalesman funzt auf keiner map

    Hihi ihr beiden,

    sorry bin momentan mit dem Kopf woanders (Esme weiss warum?)
    Wir telen morgen mal - ok.

  11. #11
    Bauer Avatar von esmebritt
    Registriert seit
    10.01.2008
    Beiträge
    516

    Standard AW: TravelingSalesman funzt auf keiner map

    @Sombeline: Danke dir bimo.
    Trotzdem, wer noch ne Idee für mich hat, immer raus damit - sieht für mich nämlich momentan so aus, als müsste ich ne komplette Neuinstallation machen, warum auch immer...

  12. #12
    Bauer Avatar von esmebritt
    Registriert seit
    10.01.2008
    Beiträge
    516

    Standard AW: TravelingSalesman funzt auf keiner map

    ... und wieder mal Lehrgeld bezahlt in Sachen "wenn kopieren, dann bitte sauber und extrem konzentriert arbeiten" - danke Sombeline!!! Du bist ein Schatz!

    Bin wohl immer noch zu wuschig für die Scripts... hab mir da heute - nach Beseitigung der Fehler - doch tatsächlich noch weitere Baustellen eröffnet - es aber allein geschafft, sie sauber zu fegen - ich lerne .

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

     

Ähnliche Themen

  1. S3 Multiplayer funzt nicht mehr
    Von Boss_Sha im Forum Siedler 3 Multiplayer
    Antworten: 1
    Letzter Beitrag: 28.06.2009, 21:33
  2. Keiner liebt mich ......
    Von saladin im Forum Probleme Wünsche Ideen
    Antworten: 1
    Letzter Beitrag: 28.10.2008, 17:53
  3. Antworten: 2
    Letzter Beitrag: 18.01.2008, 19:56

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein