Hilfe von echten Profis benötigt



  • Hallo Community,

    ich beführchte das ich hier gleich gesteinigt werde (vermutlich nicht ganz zu Unrecht) aber trotzdem wage ich mich hier mal das Problem zu Posten und um Eure Hilfe zu bitten.
    Vorab ich hab nicht die nötige Erfahrung in C++ (muss da noch viel lernen) aber ich hab viele gefragt die mir bisher immer helfen konnten nur eben diesmal nicht - da bin ich dann auf dieses interessante Forum gestossen.

    Es geht um folgenden Patch:

    #include <ace/Singleton.h>
    #include <ace/Thread_Mutex.h>
    
    #include "DelayExecutor.h"
    
    #include <ace/Log_Msg.h>
    
    DelayExecutor*
    DelayExecutor::instance ()
    {
      return ACE_Singleton<DelayExecutor, ACE_Thread_Mutex>::instance ();
    }
    
    DelayExecutor::DelayExecutor () :
    activated_ (false),
    pre_svc_hook_ (0),
    post_svc_hook_ (0) { }
    
    DelayExecutor::~DelayExecutor ()
    {
      if (pre_svc_hook_)
        delete pre_svc_hook_;
    
      if (post_svc_hook_)
        delete post_svc_hook_;
    
      this->deactivate ();
    
      //todo probably free the queue ??
    }
    
    int
    DelayExecutor::deactivate ()
    {
      if (!this->activated ())
        return -1;
    
      this->activated (false);
    
      this->queue_.queue ()->deactivate ();
    
      this->wait ();
    
      return 0;
    }
    
    int
    DelayExecutor::svc (void)
    {
      if (pre_svc_hook_)
        pre_svc_hook_->call ();
    
      for (;;)
        {
          ACE_Method_Request* rq = this->queue_.dequeue ();
    
          if (!rq)
            break;
    
          rq->call ();
    
          delete rq;
        }
    
      if (post_svc_hook_)
        post_svc_hook_->call ();
    
      return 0;
    }
    
    int
    DelayExecutor::activate (int num_threads,
                             ACE_Method_Request* pre_svc_hook,
                             ACE_Method_Request* post_svc_hook)
    {
      if (this->activated ())
        return -1;
    
      if (num_threads < 1)
        return -1;
    
      if (pre_svc_hook_)
        delete pre_svc_hook_;
    
      if (post_svc_hook_)
        delete post_svc_hook_;
    
      this->pre_svc_hook_ = pre_svc_hook;
      this->post_svc_hook_ = post_svc_hook;
    
      this->queue_.queue ()->activate ();
    
      if( ACE_Task_Base::activate (THR_NEW_LWP | THR_JOINABLE | THR_INHERIT_SCHED,
                                      num_threads) == -1)
        return -1;
    
      this->activated(true);
    
      return true;
    }
    
    int 
    DelayExecutor::execute (ACE_Method_Request* new_req)
    {
      if(new_req == NULL)
        return -1;
    
      if(this->queue_.enqueue (new_req,
                               (ACE_Time_Value*)&ACE_Time_Value::zero) == -1)
        {
          delete new_req;
          ACE_ERROR_RETURN ((LM_ERROR,
                             ACE_TEXT ("(%t) %p\n"),
                             ACE_TEXT ("DelayExecutor::execute enqueue")),
                            -1);
        }
      return 0;
    }
    
    bool
    DelayExecutor::activated ()
    {
      return this->activated_;
    }
    
    void
    DelayExecutor::activated (bool s)
    {
      this->activated_ = s;
    }
    

    Der soll diese Datei ändern:

    Multi threaded map update patch by Derex
    
    diff -r a4257917439a src/game/CMakeLists.txt
    --- a/src/game/CMakeLists.txt	Sat Jan 10 12:14:11 2009 -0500
    +++ b/src/game/CMakeLists.txt	Sat Jan 10 12:30:14 2009 -0500
    @@ -128,6 +128,8 @@
        MapInstanced.h
        MapManager.cpp
        MapManager.h
    +   MapUpdater.cpp
    +   MapUpdater.h
        MiscHandler.cpp
        MotionMaster.cpp
        MotionMaster.h
    diff -r a4257917439a src/game/MapManager.cpp
    --- a/src/game/MapManager.cpp	Sat Jan 10 12:14:11 2009 -0500
    +++ b/src/game/MapManager.cpp	Sat Jan 10 12:30:14 2009 -0500
    @@ -32,6 +32,7 @@
     #include "CellImpl.h"
     #include "Corpse.h"
     #include "ObjectMgr.h"
    +#include "Config/ConfigEnv.h"
    
     #define CLASS_LOCK Trinity::ClassLevelLockable<MapManager, ZThread::Mutex>
     INSTANTIATE_SINGLETON_2(MapManager, CLASS_LOCK);
    @@ -68,6 +69,10 @@
             }
             i_GridStateErrorCount = 0;
         }
    +    int num_threads = sConfig.GetIntDefault ("Map.Threads", 0);
    +    // Start mtmaps if needed.
    +    if(num_threads > 0 && m_updater.activate(num_threads) == -1)
    +      abort();
    
         InitMaxInstanceId();
     }
    @@ -254,9 +259,18 @@
         for(MapMapType::iterator iter=i_maps.begin(); iter != i_maps.end(); ++iter)
         {
             checkAndCorrectGridStatesArray();                   // debugging code, should be deleted some day
    -        iter->second->Update(i_timer.GetCurrent());
    -        sWorld.RecordTimeDiff("UpdateMap %u", iter->second->GetId());
    -    }
    +        //iter->second->Update(i_timer.GetCurrent());
    +        sWorld.RecordTimeDiff("UpdateMap %u scheduled", iter->second->GetId());
    +    
    +	if(m_updater.activated())
    +		m_updater.schedule_update(*iter->second,i_timer.GetCurrent());
    +	else{
    +		iter->second->Update(i_timer.GetCurrent());
    +		sWorld.RecordTimeDiff("UpdateMap %u", iter->second->GetId());
    +		}    
    +   }
    +	if(m_updater.activated())
    +		m_updater.wait();
    
         ObjectAccessor::Instance().Update(i_timer.GetCurrent());
         sWorld.RecordTimeDiff("UpdateObjectAccessor");
    @@ -306,6 +320,9 @@
             delete i_maps.begin()->second;
             i_maps.erase(i_maps.begin());
         }
    +
    +    if(m_updater.activated())
    +      m_updater.deactivate();
     }
    
     void MapManager::InitMaxInstanceId()
    diff -r a4257917439a src/game/MapManager.h
    --- a/src/game/MapManager.h	Sat Jan 10 12:14:11 2009 -0500
    +++ b/src/game/MapManager.h	Sat Jan 10 12:30:14 2009 -0500
    @@ -27,6 +27,7 @@
     #include "Common.h"
     #include "Map.h"
     #include "GridStates.h"
    +#include "MapUpdater.h"
    
     class Transport;
    
    @@ -140,5 +141,6 @@
             IntervalTimer i_timer;
    
             uint32 i_MaxInstanceId;
    +    MapUpdater m_updater;
     };
     #endif
    diff -r a4257917439a src/game/MapUpdater.cpp
    --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    +++ b/src/game/MapUpdater.cpp	Sat Jan 10 12:30:14 2009 -0500
    @@ -0,0 +1,160 @@
    +/*
    + * Copyright (C) 2005-2008 MaNGOS <http://getmangos.com/>
    + *
    + * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
    + *
    + * This program is free software; you can redistribute it and/or modify
    + * it under the terms of the GNU General Public License as published by
    + * the Free Software Foundation; either version 2 of the License, or
    + * (at your option) any later version.
    + *
    + * This program is distributed in the hope that it will be useful,
    + * but WITHOUT ANY WARRANTY; without even the implied warranty of
    + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    + * GNU General Public License for more details.
    + *
    + * You should have received a copy of the GNU General Public License
    + * along with this program; if not, write to the Free Software
    + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    + */
    +
    +#include "MapUpdater.h"
    +
    +#include "DelayExecutor.h"
    +#include "Map.h"
    +#include "Database/DatabaseEnv.h"
    +
    +#include <ace/Guard_T.h>
    +#include <ace/Method_Request.h>
    +
    +//the reason this things are here is that i want to make
    +//the netcode patch and the multithreaded maps independant
    +//once they are merged 1 class should be used
    +class  WDBThreadStartReq1 : public ACE_Method_Request
    +{
    +public:
    +  WDBThreadStartReq1 () { }
    +  virtual int
    +  call (void)
    +  {
    +    WorldDatabase.ThreadStart ();
    +    return 0;
    +  }
    +};
    +
    +class  WDBThreadEndReq1 : public ACE_Method_Request
    +{
    +public:
    +  WDBThreadEndReq1 () { }
    +  virtual int
    +  call (void)
    +  {
    +    WorldDatabase.ThreadEnd ();
    +    return 0;
    +  }
    +};
    +
    +class MapUpdateRequest : public ACE_Method_Request
    +{
    +public:
    +  Map& m_map;
    +  MapUpdater& m_updater;
    +  ACE_UINT32 m_diff;
    +  MapUpdateRequest (Map& m,MapUpdater& u,ACE_UINT32 d) : m_map(m),m_updater(u),m_diff(d) { }
    +  virtual int
    +  call (void)
    +  {
    +    m_map.Update (m_diff);
    +    m_updater.update_finished ();
    +    return 0;
    +  }
    +};
    +
    +MapUpdater::MapUpdater () :
    +m_mutex (),
    +m_condition (m_mutex),
    +m_executor (),
    +pedning_requests (0)
    +{
    +  return;
    +}
    +
    +MapUpdater::~MapUpdater ()
    +{
    +  this->deactivate ();
    +}
    +
    +int
    +MapUpdater::activate (size_t num_threads)
    +{
    +  return this->m_executor.activate (static_cast<int> (num_threads),
    +                                    new WDBThreadStartReq1,
    +                                    new WDBThreadEndReq1);
    +}
    +
    +int
    +MapUpdater::deactivate (void)
    +{
    +  this->wait ();
    +
    +  return this->m_executor.deactivate ();
    +}
    +
    +int
    +MapUpdater::wait ()
    +{
    +  ACE_GUARD_RETURN(ACE_Thread_Mutex,guard,this->m_mutex,-1);
    +
    +  while(this->pedning_requests > 0)
    +    this->m_condition.wait ();
    +
    +  return 0;
    +}
    +
    +int
    +MapUpdater::schedule_update(Map& map, ACE_UINT32 diff)
    +{
    +  ACE_GUARD_RETURN(ACE_Thread_Mutex,guard,this->m_mutex,-1);
    +
    +  ++this->pedning_requests;
    +
    +  if( this->m_executor.execute (new MapUpdateRequest(map,*this,diff)) == -1)
    +    {
    +      ACE_DEBUG ((LM_ERROR,
    +                  ACE_TEXT ("(%t) \n"),
    +                  ACE_TEXT ("Failed to schedule Map Update")));
    +
    +      --this->pedning_requests;
    +      return -1;
    +    }
    +
    +  return 0;
    +}
    +
    +bool
    +MapUpdater::activated ()
    +{
    +  return m_executor.activated();
    +}
    +
    +void
    +MapUpdater::update_finished ()
    +{
    +  ACE_GUARD (ACE_Thread_Mutex, guard, this->m_mutex);
    +
    +  if (this->pedning_requests == 0)
    +    {
    +      ACE_ERROR ((LM_ERROR,
    +                  ACE_TEXT ("(%t)\n"),
    +                  ACE_TEXT ("MapUpdater::update_finished BUG, report to devs")));
    +
    +      return;
    +    }
    +
    +  --this->pedning_requests;
    +
    +  //TODO can more than one thread call wait (), it shouldnt happen
    +  //however I ensure if in future more than 1 thread call it by
    +  //using broadcast instead of signal ()
    +  this->m_condition.broadcast ();
    +}
    \ No newline at end of file
    diff -r a4257917439a src/game/MapUpdater.h
    --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    +++ b/src/game/MapUpdater.h	Sat Jan 10 12:30:14 2009 -0500
    @@ -0,0 +1,66 @@
    +/*
    + * Copyright (C) 2005-2008 MaNGOS <http://getmangos.com/>
    + *
    + * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
    + *
    + * This program is free software; you can redistribute it and/or modify
    + * it under the terms of the GNU General Public License as published by
    + * the Free Software Foundation; either version 2 of the License, or
    + * (at your option) any later version.
    + *
    + * This program is distributed in the hope that it will be useful,
    + * but WITHOUT ANY WARRANTY; without even the implied warranty of
    + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    + * GNU General Public License for more details.
    + *
    + * You should have received a copy of the GNU General Public License
    + * along with this program; if not, write to the Free Software
    + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    + */
    +
    +#ifndef _MAP_UPDATER_H_INCLUDED
    +#define _MAP_UPDATER_H_INCLUDED
    +
    +
    +#include <ace/Thread_Mutex.h>
    +#include <ace/Condition_Thread_Mutex.h>
    +
    +#include "DelayExecutor.h"
    +
    +class Map;
    +
    +class MapUpdater
    +{
    +public:
    +  MapUpdater ();
    +  virtual ~MapUpdater ();
    +
    +  friend class MapUpdateRequest;
    +
    +  /// schedule update on a map, the update will start
    +  /// as soon as possible ,
    +  /// it may even start before the call returns
    +  int schedule_update(Map& map, ACE_UINT32 diff);
    +
    +  /// Wait untill all pending updates finish
    +  int wait ();
    +
    +  /// Start the worker threads
    +  int activate (size_t num_threads);
    +
    +  /// Stop the worker threads
    +  int deactivate (void);
    +
    +  bool activated ();
    +
    +private:
    +  /// hook called by worker threads
    +  void update_finished ();
    +
    +  DelayExecutor m_executor;
    +  ACE_Condition_Thread_Mutex m_condition;
    +  ACE_Thread_Mutex m_mutex;
    +  size_t pedning_requests;
    +};
    +
    +#endif //_MAP_UPDATER_H_INCLUDED
    \ No newline at end of file
    diff -r a4257917439a src/shared/CMakeLists.txt
    --- a/src/shared/CMakeLists.txt	Sat Jan 10 12:14:11 2009 -0500
    +++ b/src/shared/CMakeLists.txt	Sat Jan 10 12:30:14 2009 -0500
    @@ -12,6 +12,8 @@
        ByteBuffer.h
        Common.cpp
        Common.h
    +   DelayExecutor.cpp
    +   DelayExecutor.h
        Errors.h
        Log.cpp
        Log.h
    diff -r a4257917439a src/shared/DelayExecutor.cpp
    --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    +++ b/src/shared/DelayExecutor.cpp	Sat Jan 10 12:30:14 2009 -0500
    @@ -0,0 +1,130 @@
    +#include <ace/Singleton.h>
    +#include <ace/Thread_Mutex.h>
    +
    +#include "DelayExecutor.h"
    +
    +#include <ace/Log_Msg.h>
    +
    +DelayExecutor*
    +DelayExecutor::instance ()
    +{
    +  return ACE_Singleton<DelayExecutor, ACE_Thread_Mutex>::instance ();
    +}
    +
    +DelayExecutor::DelayExecutor () :
    +activated_ (false),
    +pre_svc_hook_ (0),
    +post_svc_hook_ (0) { }
    +
    +DelayExecutor::~DelayExecutor ()
    +{
    +  if (pre_svc_hook_)
    +    delete pre_svc_hook_;
    +
    +  if (post_svc_hook_)
    +    delete post_svc_hook_;
    +
    +  this->deactivate ();
    +
    +  //todo probably free the queue ??
    +}
    +
    +int
    +DelayExecutor::deactivate ()
    +{
    +  if (!this->activated ())
    +    return -1;
    +
    +  this->activated (false);
    +
    +  this->queue_.queue ()->deactivate ();
    +
    +  this->wait ();
    +
    +  return 0;
    +}
    +
    +int
    +DelayExecutor::svc (void)
    +{
    +  if (pre_svc_hook_)
    +    pre_svc_hook_->call ();
    +
    +  for (;;)
    +    {
    +      ACE_Method_Request* rq = this->queue_.dequeue ();
    +
    +      if (!rq)
    +        break;
    +
    +      rq->call ();
    +
    +      delete rq;
    +    }
    +
    +  if (post_svc_hook_)
    +    post_svc_hook_->call ();
    +
    +  return 0;
    +}
    +
    +int
    +DelayExecutor::activate (int num_threads,
    +                         ACE_Method_Request* pre_svc_hook,
    +                         ACE_Method_Request* post_svc_hook)
    +{
    +  if (this->activated ())
    +    return -1;
    +
    +  if (num_threads < 1)
    +    return -1;
    +
    +  if (pre_svc_hook_)
    +    delete pre_svc_hook_;
    +
    +  if (post_svc_hook_)
    +    delete post_svc_hook_;
    +
    +  this->pre_svc_hook_ = pre_svc_hook;
    +  this->post_svc_hook_ = post_svc_hook;
    +
    +  this->queue_.queue ()->activate ();
    +
    +  if( ACE_Task_Base::activate (THR_NEW_LWP | THR_JOINABLE | THR_INHERIT_SCHED,
    +                                  num_threads) == -1)
    +    return -1;
    +  
    +  this->activated(true);
    +  
    +  return true;
    +}
    +
    +int 
    +DelayExecutor::execute (ACE_Method_Request* new_req)
    +{
    +  if(new_req == NULL)
    +    return -1;
    +  
    +  if(this->queue_.enqueue (new_req,
    +                           (ACE_Time_Value*)&ACE_Time_Value::zero) == -1)
    +    {
    +      delete new_req;
    +      ACE_ERROR_RETURN ((LM_ERROR,
    +                         ACE_TEXT ("(%t) %p\n"),
    +                         ACE_TEXT ("DelayExecutor::execute enqueue")),
    +                        -1);
    +    }
    +  return 0;
    +}
    +
    +bool
    +DelayExecutor::activated ()
    +{
    +  return this->activated_;
    +}
    +
    +void
    +DelayExecutor::activated (bool s)
    +{
    +  this->activated_ = s;
    +}
    \ No newline at end of file
    diff -r a4257917439a src/shared/DelayExecutor.h
    --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    +++ b/src/shared/DelayExecutor.h	Sat Jan 10 12:30:14 2009 -0500
    @@ -0,0 +1,39 @@
    +#ifndef _M_DELAY_EXECUTOR_H
    +#define    _M_DELAY_EXECUTOR_H
    +
    +#include <ace/Task.h>
    +#include <ace/Activation_Queue.h>
    +#include <ace/Method_Request.h>
    +
    +class DelayExecutor : protected ACE_Task_Base
    +{
    +public:
    +  DelayExecutor ();
    +  virtual ~DelayExecutor ();
    +
    +  static DelayExecutor* instance ();
    +
    +  /// example
    +  /// DelayExecutor::instance ()->execute(new MyRequest(myarg));
    +  /// returns -1 on failures
    +  int execute (ACE_Method_Request* new_req);
    +
    +  int activate (int num_threads = 1,
    +                ACE_Method_Request* pre_svc_hook = 0,
    +                ACE_Method_Request* post_svc_hook = 0);
    +
    +  int deactivate ();
    +
    +  bool activated ();
    +
    +  virtual int svc (void);
    +private:
    +  ACE_Activation_Queue queue_;
    +  ACE_Method_Request* pre_svc_hook_;
    +  ACE_Method_Request* post_svc_hook_;
    +
    +  void activated (bool s);
    +  bool activated_;
    +};
    +
    +#endif // _M_DELAY_EXECUTOR_H
    \ No newline at end of file
    diff -r a4257917439a src/trinitycore/trinitycore.conf.dist
    --- a/src/trinitycore/trinitycore.conf.dist	Sat Jan 10 12:14:11 2009 -0500
    +++ b/src/trinitycore/trinitycore.conf.dist	Sat Jan 10 12:30:14 2009 -0500
    @@ -1281,6 +1281,13 @@
     #
     ###################################################################################################################
    
    +###################################################################################################################
    +#        MTMAPS CONFIG
    +#   Map.Threads
    +#    Number of concurrent map update threads to run
    +#    Default: "0" - Disable mtmaps
    +###################################################################################################################
    +Map.Threads = 0
     PlayerStart.AllReputation = 0
     PlayerStart.AllSpells = 0
     PlayerStart.MapsExplored = 0
    

    Nun der Patch bricht immer in Zeile 60 zusammen.
    Bevor ich nun noch Crashlogs poste steinigt mich erstmal weil ich hier als Noob ankomm und vielleicht auch noch im falschen Bereich bin.

    Gruß Happygroover



  • *steinwerf*

    "Hilfe von echten Profis benötigt" ist kein vernünftiger Thread-Titel, da man überhaupt nicht erkennt, womit Du Hilfe benötigst.

    "Nun der Patch bricht immer in Zeile 60 zusammen." ist keine Fehlerbeschreibung.



  • Und das nächste mal, den Fehler auf diese Zeile begrenzen bzw, das was benötigt wird so eingrenzen das es trotzdem lauffähig ist.



  • *in Deckung geh*
    Der Titel ist wirklich nicht sehr aussagekräftig wie ich zugeben muss, nur wie soll ich den Thread nennen, mir fiel nix besseres ein.

    Beim Code dachte ich mir weniger ist mehr und er würde in einem Scroll-Feld erscheinen (falsch gedacht).

    Gut dann geb ich Euch doch mal nen Crash-Log-Auszug:

    (this=0x7fab94407560) at /server/wow/source/trinity.1221/src/game/MapUpdater.cpp:67#31 0x0000000000ae1e88 in DelayExecutor::svc (this=0x7fabac581ee0) at 
    /server/wow/source/trinity.1221/src/shared/DelayExecutor.cpp:60#32 0x00007fabb2fdcc6b in ACE_Task_Base::svc_run (args=<value optimized out>) at 
    ../../ace/Task.cpp:271#33 0x00007fabb2fdd7c7 in ACE_Thread_Adapter::invoke (this=0x7fabac8bffe0) at ../../ace/Thread_Adapter.cpp:95
    

    Ich Editer gerne auch den Titel oder den ersten Post wenn gewünscht.

    Gruß Happygroover


  • Administrator

    @HappyG,
    Der Code ist aber nicht wirklich wenig, oder?
    Zudem ist er schlecht formatiert, durchsetzt mit anderen Anweisungen (Makefile?) und die '+' davor stören extrem. Zudem wäre ein c/c++ Formatierung statt code deutlich angenehmer gewesen, da dann auch noch Farbe reinkommt.

    Zu deinem Crash-Log:
    Das was du hier zeigst, ist nur der Callstack. Irgendwo vor dem ersten "at" muss wohl noch eine Exception Spezifikation oder zumindest ein Name stehen. Der würde uns viel mehr nützen.

    Allerdings könnten wir dir dann auch nur Hinweise geben. Diesen riesigen Code wird wahrscheinlich niemand durchlesen, das verbratet viel zu viel Zeit.

    Aktuelle Vermutung:
    Du machst den Zeiger rq irgendwo ungültig und greifst danach darauf zu, also auf ein ungültiges Objekt -> undefiniertes Verhalten.

    Grüssli



  • Dravere schrieb:

    @HappyG,
    Der Code ist aber nicht wirklich wenig, oder?

    Der Code ist zu wenig. 😉 Es sind ja nur ein paar Funktionen einer Klasse gepostet. Der Header fehlt, man kennt die Datentypen nicht, man kann das Programm bei sich nicht zum Laufen bringen, überhaupt fehlen viele Informationen. Für diese Frage sehe ich schwarz.

    Was du meinst ist die Datei die vom eigentlichen Code gepatcht werden soll.



  • Also, so wie ich das verstanden habe, ist der Code doch gar nicht das Problem, sondern das svn commit oder so... Ist das nicht ein diff-Ergebnis?



  • Also erstmal vielen lieben Dank das Ihr hier doch Interesse an meinem Problem zeigt!

    Gut ich möchte Euch natürlich alle Infos geben die Ihr evtl braucht, tuh mich aber sehr schwer damit...kann hier keine Datei anhängen.

    Meine Crashlogs sind ja schon nicht ohne die alle zu Posten dann prügelt Ihr mich hier weg und das zu recht.
    Ich werd mal versuchen das was ich habe zum download bereit zu stellen wenn das für Euch eine Lösung wäre?

    Ich entschuldige mich nochmals wenn ich mich hier mit dem Forum noch sehr schwer tuh.

    Gruß HappyG



  • HappyG schrieb:

    ...

    Wieso fragst Du nicht bei dem Projekt nach, das Du versuchst zu ändern? Fast alle OOS-Projekte haben dafür Mailinglisten, und i.d.R. sind die Leute auch sehr hilfsbereit.



  • Na das war natürlich unsere erste Anlaufstelle.
    Das Problem dabei ist das wir einer der sehr wenigen Server sind die da eine Größenordnung der Userzahlen erreichen die andere eben nicht haben. dadurch treten bei uns dann auch Probleme auf die eben kein Anderer hat.
    Dazu noch die rasante Entwicklung bei der dann auch schon mal gesagt wird gut ihr habt nen alten Stand also ist euer Problem vielleicht Nachrangig.
    Man kann aber auch mit ständige aktuallisierungen was verschlimmbessern...also warum nicht mit etwas weiterarbeiten das an sich schon von anderen für brauchbar befunden wurde und das dann optimieren, vielleicht hilfts für die nächsten "Versionen" dann auch.

    Gruß HappyG



  • HappyG schrieb:

    Das Problem dabei ist das wir einer der sehr wenigen Server sind die da eine Größenordnung der Userzahlen erreichen die andere eben nicht haben.

    Die Userzahlen auf eurem Server haben aber rein garnichts damit zu tun warum der Patch zusammenbricht.

    Um ehrlich zu sein wundert mich sehr warum der patch "zusammenbrechen" (abstürzen?) sollte - deine Fehlermeldung (zumindest das Fragment davon, das war keine vollständige) lässt eher darauf schließen dass das nachfolgende Compilieren oder irgendein Unittest fehlschlägt.

    Dazu wäre es natürlich auch sinnvoll, die Datei so zu posten wie sie bei dir vorliegt. Laut der Fehlermeldung ist irgendwas in Zeile 67 nicht ganz koscher, allerdings ist bei dem von dir geposteten Code die entsprechende Zeile eine Leerzeile.

    Und am Ende bin ich mir relativ sicher dass die Wenigsten hier dir helfen werden einen WoW-Piratenserver zum Laufen zu kriegen. Ich persönlich hätte da Bedenken wegen Copyrights etc.



  • Ich bin jetzt kein großer WOW-Kenner, aber von Mangos hab ich schon gehört ... und das war nicht positiv.
    Die waren froh wenn es mit 20 gleichzeitigen Usern noch klappte.

    HappyG schrieb:

    Na das war natürlich unsere erste Anlaufstelle.
    Das Problem dabei ist das wir einer der sehr wenigen Server sind die da eine Größenordnung der Userzahlen erreichen die andere eben nicht haben. dadurch treten bei uns dann auch Probleme auf die eben kein Anderer hat.
    Dazu noch die rasante Entwicklung bei der dann auch schon mal gesagt wird gut ihr habt nen alten Stand also ist euer Problem vielleicht Nachrangig.
    Man kann aber auch mit ständige aktuallisierungen was verschlimmbessern...also warum nicht mit etwas weiterarbeiten das an sich schon von anderen für brauchbar befunden wurde und das dann optimieren, vielleicht hilfts für die nächsten "Versionen" dann auch.

    Gruß HappyG

    1. Ihr habt einen alten Stand, also ist es definitv nachrangig, was ihr für Probleme habt.
    ---> Updaten, Mangos ist bei weitem nicht stable und vielleicht tauscht man neue Bugs gegen alte ...

    2. Warum nicht mit einer alten Version weiterarbeiten?
    Habt ihr selbst von Mangos geforkt ? D.h. neuere(und nicht alle) Patches auf eine alte Version gespielt? - Wenn ja vergiss es, da können Abhängigkeiten drin sein, die man nicht überblickt.

    3. Meine Mangos-Bekanntschaft ist von nem "FreeShard", dessen Admin-Team keinen einzigen C++er hat. Sie sind dann froh, wenn sie es selbst kompiliert kriegen ...
    Wenn das bei euch auch so sein sollte, such dir lieber einen fähigen Programmierer ...

    Bei weiteren Fragen, einfach über Punkt-1 nachdenken.

    Greetz



  • Hallo Community,

    ich hab dann mal die Dateien für Euch hier auf einem Beta-Server gehostet:
    http://81.89.101.210/happygroover/
    source.tar.gz ist die komplette Source mit allem drum und drann
    Download.rar sind die Files für den DelayExecutor
    crash.rar sind 9 crashlogs als txt

    Ich hoffe Ihr könnt damit was anfangen.
    Solltet Ihr interesse an dem Project haben dürft Ihr mich gerne dazu per PN fragen.

    Gruß Happygroover

    PS: nur um das zu erwähnen ein WoW-Privat-Server ist eine völlig legale Sache solange man eben dafür kein Geld verlangt, dann ist es Vermarktung von Blizzards geistigem Eigentum. Bei uns ist alles Kostenlos und der Kontakt zu Blizard ist sogar recht nett.



  • HappyG schrieb:

    PS: nur um das zu erwähnen ein WoW-Privat-Server ist eine völlig legale Sache solange man eben dafür kein Geld verlangt,...

    Soll ich mal die Lizenzbedingungen rezitieren?

    III. Nutzungsbeschränkungen für World of Warcraft. schrieb:

    ...
    2. Nur Blizzard Entertainment oder seine Lizenznehmer haben das Recht, als Host von World of Warcraft zu fungieren. Dementsprechend dürfen Sie weder als Spielleiter (Host) fungieren, noch Dienste anbieten, die der Initiierung von Spielen dienen, noch Kommunikationsprotokolle abfangen, emulieren oder weiterleiten, die von Blizzard Entertainment als Teil von World of Warcraft genutzt werden, unabhängig davon, welche Methoden dabei zur Anwendung kommen.
    ...



  • Ist das evtl. nur zur Abschreckung und nicht wirklich rechtswirksam hierzulande? Juristen an die Front! Aber dass die Devs solche Server auch noch in irgendeiner Form unterstützen, das glaube ich nun wahrlich nicht 😉



  • Decimad schrieb:

    Ist das evtl. nur zur Abschreckung und nicht wirklich rechtswirksam hierzulande?

    Soviel ich mitbekommen habe, ist dies durchaus auch in Deutschland rechtens, gerade auch wenn du es öffentlich zur Verfügung stellst (Ganz zu schweigen das eine unerlaubte Programmmodifikation vielleicht sogar unter die neuen Hackerparagraphen zählen könnte, wobei ich kein Rechtsexperte bin).



  • Nun wie gesagt ich kann nur sagen das Blizzard nicht mekert solange man da eben nichts verkauft.

    Dennoch sollte sowas hier unerwünscht sein ist das ok und ich bitte um Löschung meines Threads oder eben darum nicht zu diskutieren wie die Rechtslage ist.
    Ich könnte hier natürlich den Server preisgeben aber will eben hier keine Werbung veranstallten sondern um Hilfe bitte.

    Gruß Happygroover


Anmelden zum Antworten