//============================================================================== void GameServer::HandlePutItem_(const QVariantMap& request, QVariantMap& response) { if (!testingStageActive_) { WriteResult_(response, EFEMPResult::BAD_ACTION); return; } if (!request["x"].toFloat() || !request["y"].toFloat()) { WriteResult_(response, EFEMPResult::BAD_PLACING); return; } float x = request["x"].toFloat(); float y = request["y"].toFloat(); if (levelMap_.GetCell(x, y) != '.') { WriteResult_(response, EFEMPResult::BAD_PLACING); return; } Item* item = CreateActor_<Item>(); SetActorPosition_(item, Vector2(x, y)); SetItemDescription(request["item"].toMap(), item); response["id"] = item->GetId(); }
ItemMaterial::ItemMaterial() { ItemID = 2; SubID = 0; vector<char*> description; description.push_back(new char[35]); strcpy_s(description.back(), 35, "Basic building material needed"); description.push_back(new char[35]); strcpy_s(description.back(), 35, "for a lot of different things."); SetItemDescription(description); };
ItemWeapon::ItemWeapon() { ItemID = 1; vector<char*> description; description.push_back(new char[30]); strcpy_s(description.back(), 30, "A simple handy weapon for the"); description.push_back(new char[30]); strcpy_s(description.back(), 30, "allday use!"); itemDamage = 0; SetItemName("Iron Sword"); SetItemDescription(description); };
//============================================================================== void GameServer::HandlePutPlayer_(const QVariantMap& request, QVariantMap& response) { if (!testingStageActive_) { WriteResult_(response, EFEMPResult::BAD_ACTION); return; } if (!request["x"].toFloat() || !request["y"].toFloat()) { WriteResult_(response, EFEMPResult::BAD_PLACING); return; } float x = request["x"].toFloat(); float y = request["y"].toFloat(); Player* player = CreateActor_<Player>(); SetActorPosition_(player, Vector2(x, y)); if (IsPositionWrong(x, y, player)) { KillActor_(player); WriteResult_(response, EFEMPResult::BAD_PLACING); return; } auto inventory = request["inventory"].toList(); for (auto elem: inventory) { Item* item = CreateActor_<Item>(); SetItemDescription(elem.toMap(), item); item->SetOnTheGround(false); player->items_.push_back(item); actors_.erase(std::remove(actors_.begin(), actors_.end(), item), actors_.end()); //idToActor_.erase(item->GetId()); } auto stats = request["stats"].toMap(); for (auto s = stats.begin(); s != stats.end(); s++) { EStatConst stat = StringToStat[s.key()]; QVariant val = s.value(); player->SetStat(stat, val.toFloat()); } if (stats.size() == 0) { player->SetSpeed(playerVelocity_); } QVariantList items; for (auto& elem: player->items_) { QVariantMap item; item["id"] = elem->GetId(); item["name"] = elem->Getname(); item["type"] = elem->GetTypeItem(); item["class"] = elem->GetClass(); item["subtype"] = elem->GetSubtype(); item["weight"] = elem->GetWeight(); items << item; } response["inventory"] = items; auto slot = request["slots"].toMap(); QVariantMap id_slot; for (auto i = SlotToString.begin(); i != SlotToString.end(); i++) { if (slot.find(i.key()) != slot.end()) { Item* item = CreateActor_<Item>(); SetItemDescription(slot[i.key()].toMap(), item); player->items_.push_back(item); player->SetSlot(i.value(), item); player->SetStat(true, item); id_slot[i.key()] = item->GetId(); } } response["slots"] = id_slot; response["id"] = player->GetId(); QByteArray sid; do { QByteArray id = QString::number(qrand()).toLatin1(); sid = QCryptographicHash::hash(id, QCryptographicHash::Sha1); } while (sidToPlayer_.find(sid) != sidToPlayer_.end()); sid = sid.toHex(); sidToPlayer_.insert(sid, player); response["sid"] = sid; response["fistId"] = FistId_; }
//============================================================================== void GameServer::HandlePutMob_(const QVariantMap& request, QVariantMap& response) { if (!testingStageActive_) { WriteResult_(response, EFEMPResult::BAD_ACTION); return; } if (!request["x"].toFloat() || !request["y"].toFloat()) { WriteResult_(response, EFEMPResult::BAD_PLACING); return; } float x = request["x"].toFloat(); float y = request["y"].toFloat(); Monster* monster = CreateActor_<Monster>(); SetActorPosition_(monster, Vector2(x, y)); monster->SetDirection(EActorDirection::SOUTH); if (IsPositionWrong(x, y, monster)) { KillActor_(monster); WriteResult_(response, EFEMPResult::BAD_PLACING); return; } auto flags = request["flags"].toList(); for (auto flag: flags) { if (monster->possibleFlags.lastIndexOf(flag.toString()) == -1) { WriteResult_(response, EFEMPResult::BAD_FLAG); return; } monster->Flags.push_back(flag.toString()); } monster->SetRace(request["race"].toString()); if (monster->GetRace() == "NONE") { WriteResult_(response, EFEMPResult::BAD_RACE); return; } auto stats = request["stats"].toMap(); for (auto s = stats.begin(); s != stats.end(); s++) { EStatConst stat = StringToStat[s.key()]; QVariant val = s.value(); monster->SetStat(stat, val.toFloat()); } auto inventory = request["inventory"].toList(); for (auto elem: inventory) { Item* item = CreateActor_<Item>(); SetItemDescription(elem.toMap(), item); item->SetOnTheGround(false); monster->items.push_back(item); actors_.erase(std::remove(actors_.begin(), actors_.end(), item) , actors_.end()); //??? } QStringList damage; damage << request["dealtDamage"].toString().split("d"); if (damage.size() < 2 || !damage[0].toInt() || !damage[1].toInt()) { WriteResult_(response, EFEMPResult::BAD_DAMAGE); return; } response["id"] = monster->GetId(); }
//Checking Collisionable Objects void Player::CheckCollisions() { for (int i = 0; i < mEntities.size(); i++) { for (int j = 0; j < mEntities[i].size(); j++) { if (mEntities[i][j]->mLabel == "ground") { if (XNA::IntersectAxisAlignedBoxAxisAlignedBox(&mSelf->mMeshBox, &mEntities[i][j]->mMeshBox)) //Broad phase quick check { XMFLOAT3 Correction = MathHelper::AABBCollision(mSelf->mMeshBox, mEntities[i][j]->mMeshBox); if( Correction.x != 0.0f){ mSelf->Strafe(Correction.x);} else if (Correction.z != 0.0f){ mSelf->Walk( Correction.z);} else if (Correction.y != 0.0f) { mSelf->Jump(Correction.y); if (!onGround) { mSelf->mAnim->OverRidePlayOnce(false); (GoBW) ? mSelf->mAnim->SetAnim(6, true, true) : mSelf->mAnim->SetAnim(6, true, false); mSelf->mAnim->ResetFrame(); }//LANDING ANIMATION mVelocity.y = 0.0f; onGround = true; }//Means it Hit Ground Reset Y Velocity So it Doesnt Go To Much And Jitter } } if (mEntities[i][j]->mLabel.size() > 3) { std::string str(mEntities[i][j]->mLabel.begin(), mEntities[i][j]->mLabel.begin() + 4); if (str == "item") { if (XNA::IntersectAxisAlignedBoxAxisAlignedBox(&mSelf->mMeshBox, &mEntities[i][j]->mMeshBox)) //Broad phase quick check { std::string str2(mEntities[i][j]->mLabel.begin() + 5, mEntities[i][j]->mLabel.end()); // Minus one or you get an Iterator past the end of the string SetItemDescription(str2); mEntities[i][j]->mDead = true; Inventory::AddToInventory(str2); mEntities[i].erase(mEntities[i].begin() + j); } } } if (mEntities[i][j]->mLabel.size() > 7) { std::string str(mEntities[i][j]->mLabel.begin(), mEntities[i][j]->mLabel.begin() + 5); if (str == "enemy") { if (!mEntities[i][j]->mDead) { if (XNA::IntersectAxisAlignedBoxAxisAlignedBox(&mSelf->mMeshBox, &mEntities[i][j]->mMeshBox)) //Broad phase quick check { std::string str2(mEntities[i][j]->mLabel.begin() + 6, mEntities[i][j]->mLabel.end()); // Minus one or you get an Iterator past the end of the string Battle::SetBattleType(str2); Engine::NewBattle(); *StateMachine::pGameState = GameState::BATTLE; mEntities[i].erase(mEntities[i].begin() + j); } } } } if (mEntities[i][j]->mLabel == "portal") { if (XNA::IntersectAxisAlignedBoxAxisAlignedBox(&mSelf->mMeshBox, &mEntities[i][j]->mMeshBox)) //Broad phase quick check { mBeatLevel = true; } } } } }