Reklama
Pokazuje wyniki od 1 do 13 z 13

Temat: [7,92][c++] Przedmioty nie dochodzą gdy jest postać wylogowana.

  1. #1
    Avatar GM Esio
    Data rejestracji
    2007
    Położenie
    Mysłowice
    Wiek
    32
    Posty
    333
    Siła reputacji
    18

    Domyślny [7,92][c++] Przedmioty nie dochodzą gdy jest postać wylogowana.

    Witam,
    mój problem polega na tym, że jak jest postać wylogowana i w przypadku gdy jest usuwany jej domek bo nie płaciła czynszu to przedmioty nie dochodzą do depo (natomiast listy z ostrzeżeniami jak najbardziej dochodzą). Wszystko ładnie działa gdy postać jest zalogowana...

    Sprawdziłem czy funkcja do przenoszenia przedmiotów jest czemuś winna, okazuje się, że działa poprawnie, gdy postać jest wylogowana i godem usunę jej domek /owner none to przedmioty dochodzą. Wydaje mi się, żę problem polega we funkcji, która jest odpowiedzialna za czynsz.
    Czy może ktoś to poprawić? Z góry dziękuje.

    Kod:
    bool Houses::payHouses(bool mail)
    {
    	uint32_t currentTime = std::time(NULL);
    
    	for(HouseMap::iterator it = houseMap.begin(); it != houseMap.end(); ++it){
    		House* house = it->second;
    
    		if(house->getHouseOwner() != "" && house->getPaidUntil() < currentTime &&
    			house->getRent() != 0){
    			std::string owner = house->getHouseOwner();
    			Town* town = Towns::getInstance().getTown(house->getTownId());
    			if(!town){
    				continue;
    			}
    			
    			if(!IOPlayer::instance()->playerExists(owner)){
    				//player doesnt exist, remove it as house owner?
    				house->setHouseOwner("");
    				continue;
    			}
    
    			Player* player = g_game.getPlayerByName(owner);
    			if(!player){
    				player = new Player(owner, NULL);
    
    				if(!IOPlayer::instance()->loadPlayer(player, owner)){
    					delete player;
    					continue;
    				}
    			}
    
    			Depot* depot = player->getDepot(town->getTownID(), true);
    			if(depot){
    				//get money from depot
    				if(g_game.removeMoney(depot, house->getRent(), FLAG_NOLIMIT)){
    					
    					uint32_t paidUntil = currentTime;
    					switch(rentPeriod){
    					case RENTPERIOD_DAILY:
    						paidUntil += 86400;
    						break;
    					case RENTPERIOD_WEEKLY:
    						paidUntil += 7 * 86400;
    						break;
    					case RENTPERIOD_MONTHLY:
    						paidUntil += 30 * 86400;
    						break;
    					case RENTPERIOD_YEARLY:
    						paidUntil += 365 * 86400;
    						break;
    					}
    
    					house->setPaidUntil(paidUntil);
    				}
    				else{
    					if(house->getPayRentWarnings() >= 7){
    						house->setHouseOwner("");
    					}
    					else{
    						int daysLeft = 7 - house->getPayRentWarnings();
    
    						Item* letter = Item::CreateItem(ITEM_LETTER_STAMPED);
    						std::string period = "";
    
    						switch(rentPeriod){
    							case RENTPERIOD_DAILY:
    								period = "daily";
    							break;
    
    							case RENTPERIOD_WEEKLY:
    								period = "weekly";
    							break;
    
    							case RENTPERIOD_MONTHLY:
    								period = "monthly";
    							break;
    
    							case RENTPERIOD_YEARLY:
    								period = "yearly";
    							break;
    						}
    
    						std::stringstream warningText;
    						warningText << "Warning! \n" <<
    							"The " << period << " rent of " << house->getRent() << " gold for your house \""
    							<< house->getName() << "\" is payable. Have it available within " << daysLeft <<
    							" days, or you will lose this house.";
    						
    						if(mail == true){	
    							letter->setText(warningText.str());
    							g_game.internalAddItem(depot, letter, INDEX_WHEREEVER, FLAG_NOLIMIT);
    							house->setPayRentWarnings(house->getPayRentWarnings() + 1);
    						}
    						else{
    							delete letter;
    						}
    					}
    				}
    			}
    
    			if(!player->isOnline()){
    			    player->lastlogin = player->lastLoginSaved;                                    
    				IOPlayer::instance()->savePlayer(player);
    				delete player;
    			}
    		}
    	}
    
    	return true;
    }
    http://ots.tibiaserver.pl/tibiaserver.gif

  2. #2
    Avatar bolek
    Data rejestracji
    2005
    Położenie
    -
    Wiek
    33
    Posty
    493
    Siła reputacji
    19

    Domyślny

    W tej funckji nic nie ma, zgaduję, że trzeba szukać w funkcji:

    house->setHouseOwner("");

    Ponieważ nie wiemy czy ona czyszcząc ownera wysyła itemy do jego depo.

  3. Reklama
  4. #3
    Avatar GM Esio
    Data rejestracji
    2007
    Położenie
    Mysłowice
    Wiek
    32
    Posty
    333
    Siła reputacji
    18

    Domyślny

    comands.cpp

    Kod:
    bool Commands::setHouseOwner(Creature* creature, const std::string& cmd, const std::string& param)
    {
    	Player* player = creature->getPlayer();
    	if(player){
    		if(player->getTile()->hasFlag(TILESTATE_HOUSE)){
    			HouseTile* houseTile = dynamic_cast<HouseTile*>(player->getTile());
    			if(houseTile){
    				
    				std::string real_name = param;
    				if(param == "none"){
    					houseTile->getHouse()->setHouseOwner("");
    				}
    				else if(IOPlayer::instance()->playerExists(real_name)){
    					houseTile->getHouse()->setHouseOwner(real_name);
    				}
    				else{
    					player->sendTextMessage(MSG_STATUS_CONSOLE_BLUE, "Player not found.");
    				}
    				return true;
    			}
    		}
    	}
    	return false;
    }
    house.cpp

    Kod:
    void House::setHouseOwner(std::string name)
    {
    	if(isLoaded && houseOwner == name)
    		return;
    	
    	isLoaded = true;
    
    	if(houseOwner != ""){
    		//send items to depot
    		transferToDepot();
    
    		//...TODO...
    		//TODO: remove players from beds
    
    		//clean access lists
    		houseOwner = "";
    		setAccessList(SUBOWNER_LIST, "");
    		setAccessList(GUEST_LIST, "");
    		/*
    		guestList.parseList("");
    		subOwnerList.parseList("");
    		*/
    		HouseDoorList::iterator it;
    		for(it = doorList.begin(); it != doorList.end(); ++it){
    			(*it)->setAccessList("");
    		}
    
    		//reset paid date
    		paidUntil = 0;
    		rentWarnings = 0;
    	}
    		
    	std::stringstream houseDescription;
    	houseDescription << "It belongs to house '" << houseName << "'. " << std::endl;
    
    	if(name != "" && IOPlayer::instance()->playerExists(name)){
    		houseOwner = name;
    		houseDescription << name;
    	}
    	else{
    		houseDescription << "Nobody";
    	}
    	houseDescription << " owns this house." << std::endl;
    
    	#ifdef __PB_BUY_HOUSE__
    	if(getHouseOwner() == ""){
    		int price = 0;
    		for(HouseTileList::iterator it = getHouseTileBegin(); it != getHouseTileEnd(); it++){
    			price += g_config.getNumber(ConfigManager::HOUSE_PRICE);
    		}
    		
    		houseDescription << " This house costs " << price << " gold." << std::endl;
    	}
    	#endif
    	
    	HouseDoorList::iterator it;
    	for(it = doorList.begin(); it != doorList.end(); ++it){
    		(*it)->setSpecialDescription(houseDescription.str());
    	}
    }
    http://ots.tibiaserver.pl/tibiaserver.gif

  5. #4
    Avatar bolek
    Data rejestracji
    2005
    Położenie
    -
    Wiek
    33
    Posty
    493
    Siła reputacji
    19

    Domyślny

    Teraz funkcje transferToDepot();, prawdopodobnie w houses się znajdzie.

  6. #5
    Avatar GM Esio
    Data rejestracji
    2007
    Położenie
    Mysłowice
    Wiek
    32
    Posty
    333
    Siła reputacji
    18

    Domyślny

    // wybaczcie ale skrypt był poprawiony...
    Ostatnio zmieniony przez GM Esio : 14-07-2010, 22:11
    http://ots.tibiaserver.pl/tibiaserver.gif

  7. #6
    Avatar bolek
    Data rejestracji
    2005
    Położenie
    -
    Wiek
    33
    Posty
    493
    Siła reputacji
    19

    Domyślny

    Ogółem to wygląda ok, bez jakiś checkpointów gdzie dochodzi to dużo powiedzieć nie można, ale może po prostu funkcja od zapisywania:

    if(!player->isOnline()){
    IOPlayer::instance()->savePlayer(player);
    delete player;
    }

    Gdy gracz jest offline, może nie działa, nie wiem, tak jak mówię, brak checkpointów jakichkolwiek w tych funkcjach i trudno cokolwiek wywnioskować.

  8. #7
    Avatar GM Esio
    Data rejestracji
    2007
    Położenie
    Mysłowice
    Wiek
    32
    Posty
    333
    Siła reputacji
    18

    Domyślny

    nie rozumiem? ale popatrz jak wpisuję komendę /owner none i postać jest wylogowana to przedmioty dochodzą, nawet listy za czynsz dochodzą w przypadku przenoszenia przedmiotów problem się pojawia.
    http://ots.tibiaserver.pl/tibiaserver.gif

  9. #8
    Avatar bolek
    Data rejestracji
    2005
    Położenie
    -
    Wiek
    33
    Posty
    493
    Siła reputacji
    19

    Domyślny

    Komenda jak i funkcja payHouses odwołują się do tego samego gdy brak zapłaty za czynsz w przypadku payHouses, lub zmienienia ownera w przypadku komendy.

  10. #9
    Avatar GM Esio
    Data rejestracji
    2007
    Położenie
    Mysłowice
    Wiek
    32
    Posty
    333
    Siła reputacji
    18

    Domyślny

    no tak, ale jeżeli zmieniam ownera i jak jest wylogowany to i tak przedmioty dochodzą, a dlaczego nie chcą dojść jak nie jest opłacony czynsz?

    @edit i brawo dla Esia udało mi się to zrobić ;)
    Ostatnio zmieniony przez GM Esio : 14-07-2010, 22:11
    http://ots.tibiaserver.pl/tibiaserver.gif

  11. #10
    Avatar bolek
    Data rejestracji
    2005
    Położenie
    -
    Wiek
    33
    Posty
    493
    Siła reputacji
    19

    Domyślny

    To napisz to dla innych.

  12. #11
    Avatar GM Esio
    Data rejestracji
    2007
    Położenie
    Mysłowice
    Wiek
    32
    Posty
    333
    Siła reputacji
    18

    Domyślny

    W funkcji bool Houses::payHouses(bool mail)

    pod
    else{
    if(house->getPayRentWarnings() >= 7){
    house->setHouseOwner("");
    dodajemy

    Kod:
       continue;
    http://ots.tibiaserver.pl/tibiaserver.gif

  13. #12
    Avatar bolek
    Data rejestracji
    2005
    Położenie
    -
    Wiek
    33
    Posty
    493
    Siła reputacji
    19

    Domyślny

    Omijasz przy tym tylko:

    if(!player->isOnline()){
    player->lastlogin = player->lastLoginSaved;
    IOPlayer::instance()->savePlayer(player);
    delete player;
    }
    Co sugeruje, że cały ten OTS jest jakiś dziwny, stary i zbugowany.

  14. #13
    Avatar Killavus
    Data rejestracji
    2005
    Położenie
    Wrocław
    Wiek
    32
    Posty
    915
    Siła reputacji
    19

    Domyślny

    Swoją drogą, taka dygresja - pamiętam słodkie czasy, kiedy też tak programowałem, dodając losowe klamry, nawiasy, średniki i słowa kluczowe języka, jak coś nie działało, kompilowałem i 'a nuż się uda' - sprawdzałem czy działa... :D

    Proszę, zamieść jednak funkcję "transferToDepot". Na pewno to pomoże rozwiązać problem.

    Pozdrawiam
    Killavus

Reklama

Informacje o temacie

Użytkownicy przeglądający temat

Aktualnie 1 użytkowników przegląda ten temat. (0 użytkowników i 1 gości)

Podobne tematy

  1. Mejle nie dochodzą
    Przez Tibiarz w dziale O serwisie
    Odpowiedzi: 10
    Ostatni post: 19-01-2016, 16:34
  2. Folder w użyciu w sytuacji gdy tak nie jest :/
    Przez MasterMappi w dziale Sprzęt i oprogramowanie
    Odpowiedzi: 6
    Ostatni post: 03-08-2013, 21:25
  3. Pomocy! Nie dochodzą smsy
    Przez Katalonczyk w dziale Urządzenia mobilne
    Odpowiedzi: 1
    Ostatni post: 23-11-2012, 17:30
  4. Facebook - nie dochodza moje wiadomosci
    Przez SpeDi91 w dziale Sprzęt i oprogramowanie
    Odpowiedzi: 1
    Ostatni post: 10-10-2012, 23:17
  5. tibia.com maile nie dochodza?
    Przez system32 w dziale Tibia
    Odpowiedzi: 8
    Ostatni post: 04-03-2010, 17:55

Zakładki

Zakładki

Zasady postowania

  • Nie możesz pisać nowych tematów
  • Nie możesz pisać postów
  • Nie możesz używać załączników
  • Nie możesz edytować swoich postów
  •