post

PHP Build a Webgame Tutorial Part 5

So here the fifth part finally is!

Hello guys,
Let me introduce you what we will be doing in the fifth part of this tutorial series:

  • Add buildings to buy in the shop
  • Make money by having a money generate building
  • Give the user money every hour.

License Agreement by downloading.
——————–
You may not sell this nor making a tutorial with the same code as i do.
You may alter the code and sell a complete php game without having to pay or credit me (only if you want to ;))
This is an open source project please share your modifications with the rest of the readers.
You must have fun scripting!
By downloading the files you agree with these terms.

Live DemoCheck it!

DownloadIts free!

 

Can’t open file? Download the extractor
——————–

First things first.

Some of my readers have done some wonderful jobs for the tutorial and sended me some assets!
The logo is designed by ShinDesign.
The template is designed by ShinDesign.
Some military units are designed by Mazing Studios.
WommbLogo_footer
I have added these assets to the tutorial and are downloadable in the download files of this part of the tutorial.
Just overwrite them in your webfolder. If you got your own template already then just follow the steps!

Lets get started with part 5!
Let’s start with adding some of the new building types where we can make money with.

Go to “http://localhost/phpmyadmin/” log in and select your database.

step1

Select the table: game_buildingtypes and add a new row with the given settings in the image.

Then add a new building to the “game_buildings” table with the settings in in the image

Now that we have done that we can create a new model to insert the buildings into the database for the right user who have bought them.

Create a new model with the name “game_buildings“.
And insert the basic commands for a new model file.

game_buildings.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Game_buildings extends CI_Model {

  function __construct() {
    parent::__construct();
  }

  function getItem($id = null) {
    
  }

  function getCost($id) {
    
  }

}

?>

New models we need to define in the configs.
So open up autoload.php found in ‘application/config/autoload.php
and change this line $autoload[‘model’] = array(‘game_users’, ‘game_units’, ‘game_army’);
to this:

autoload.php

$autoload['model'] = array('game_users', 'game_units', 'game_army', 'game_buildings');

We got the basic now prepared, lets start extending it and subtract the money from the player when he buy’s units.

First thing now we need is a new database table that holds the players buildings we keep this seperate from the army table to not bloat the table with much data.
Lets create the table and name it “game_base” with the following fields as given in the image:

tut5-3
before we can get it to work we need to create a new model “game_basemodel and lets add the following standard code to it.

game_base.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Game_base extends CI_Model {

  function __construct() {
    parent::__construct();
  } 

  function getBuildings($userID) {
    
  }

  function addBuildings($userID, $buildingID, $buildingAmount) {
    
  }

  function subtractBuildings($userID, $buildingID, $buildingAmount) {

  }

}

?>

New models we need to define in the configs.
So open up autoload.php found in ‘application/config/autoload.php
and change this line $autoload[‘model’] = array(‘game_users’, ‘game_units’, ‘game_army’, ‘game_buildings’);
to this:

autoload.php

$autoload['model'] = array('game_users', 'game_units', 'game_army', 'game_buildings', 'game_base');

Now that all is loaded and the base has been made we can actually start to code now.
Open up the model “game_base.php” and change the addbuildings() function into:

game_base.php

function addBuildings($userID, $buildingID, $buildingAmount) {
  if ( $userID == null || $buildingID == null || $buildingAmount == null ) {
    return json_encode(array('msg'=>'Something went wrong, please try again later.'));
  }
  $userMoney = $this->game_users->getMoney($userID);
  $buildingCost = $this->game_buildings->getCost($buildingID);
  $buildingTotalCost = $buildingAmount * $buildingCost;
  if ( $userMoney >= $buildingTotalCost ) {
    $query = $this->db->get_where('game_base',array('user'=>$userID, 'building_id'=>$buildingID));
    if ( $query->num_rows() > 0 ) {
      //update the current amount of units for the player
      $result = $this->db->set('building_amount', 'building_amount+'.$buildingAmount, FALSE)->where(array('user'=>$userID,'building_id'=>$buildingID))->update('game_base');
    } else {
      //first time have this units, create a clean army for the player
      $result = $this->db->insert("game_base", array('user'=>$userID,'building_id'=>$buildingID,'building_amount'=>$buildingAmount));
    }
    if ( $result ) {
      $this->game_users->subtractMoney($userID,$buildingTotalCost);
      return json_encode(array('msg'=>'You have bought new buildings.'));
    } else {
      return json_encode(array('msg'=>'Something went wrong, please try again later.'));
    }
  } else {
    return json_encode(array('msg'=>'You don\'t have enough money to buy these buildings.'));
  }
}

To make this script work we need to edit the model “game_buildings”.

Since we allready made a script like the one we want we can copy it and change it a bit (see the game_units model), open the modelgame_buildings” and change these functions with this code:

game_buildings.php

function getItem($id = null) {
  if( $id === null ) {
    $this->db->order_by("buildingcost","asc");
    $query = $this->db->get("game_buildings");
    return $query->result();
  } else {
    $query = $this->db->get_where('game_buildings', array('id' => $id));
    if ( $query->num_rows() > 0 ) {
      return $query->row(); 
    }
    return null;
  }
}

function getCost($id) {
  if ( $id == null ) {
    return null;
  }
  $query = $this->db->get_where('game_buildings', array('id' => $id));
  if ( $query->num_rows() > 0 ) {
    $row = $query->row(); 
    return $row->buildingcost;
  }
  return null;
}

We can now buy buildings, lets activate it in the controller of the shop’s buy button.
We need to change some code from the index() function in the controller named “shop.php
Change the “if statement” code to this code:

shop.php

if ( $this->input->post() ) {
  $loggedUser = $this->game_users->getByUsername($this->session->userdata('game_username'));
  $userID = $loggedUser->id;
  $buying = explode("-",key($this->input->post()));
  $id = $buying[1];
  $amount = 0+intval($this->input->post(key($this->input->post())));

  if ( $buying[0] == 'game_units' ) {
    $return = json_decode($this->game_army->addArmy($userID, $id, $amount));
  } elseif ( $buying[0] == 'game_buildings' ) {
    $return = json_decode($this->game_base->addBuilding($userID, $id, $amount));
  }

  if ( $return ) {
    $this->smarty_lib->assign('loginMessage', "<div class='errorMsg'><p>{$return->msg}</p></div><br/>");
  }
}

And add this just before the $this->smarty_lib calls:

shop.php

$content .= "<h3>Shop (buildings)</h3><table cellpadding='0' cellspacing='0' style='width: 100%;'>";
$content .= "<thead><tr><th>&nbsp;</th><th>Name:</th><th>Attack:</th><th>Defense:</th><th>Health:</th><th>Price:</th><th></th></tr></thead><tbody>";
foreach ( $this->game_buildings->getItem() as $item ) {
  $content .= "<tr>";
  $content .= "<td>".$item->image."</td>";
  $content .= "<td>".$item->name."</td>";
  $content .= "<td>".$item->attackpoints."</td>";
  $content .= "<td>".$item->defensepoints."</td>";
  $content .= "<td>".$item->healthpoints."</td>";
  $content .= "<td>".$item->buildingcost."</td>";
  $content .= "<td><form method='post'><input type='text' name='game_buildings-{$item->id}' /> <input type='submit' value='Buy'></form></td>";
  $content .= "</tr>";
}
$content .= "</tbody></table>";

Now the shop is extended with buildings! We can buy buildings but they dont appear in our overview yet.
Lets update our overview with buildings that we (or others) have bought.

Open the controller named “player.php” and add this code just before the $this->smarty_lib calls again.

player.php

$content .= '<br/>
  <strong>Buildings</strong><br/>
  <table cellpadding="0" cellspacing="0" style="width: 100%;"><thead><tr><th>&nbsp;</th><th>Name:</th><th>Amount:</th></tr></thead><tbody>'
;
$playersBase = $this->game_base->getBuildings($player->id);
if ( isset($playersBase) && !empty($playersBase) ) {
  foreach( $playersBase as $base ) {
    $baseBuilding = $this->game_buildings->getItem($base->building_id);
    $content .= "<tr>";
    $content .= "<td>".$baseBuilding->image."</td>";
    $content .= "<td>".$baseBuilding->name."</td>";
    $content .= "<td>".$base->building_amount."</td>";
    $content .= "</tr>";
  }
}
$content .= "</tbody></table>";

The overview page is working for the player.
Check if it is all still working for you (if not try to fix the error’s or leave me a post with the error you get)

 

Now that we copy, paste and edited this part for the buildings we want to generate money for the player for each ‘Oil Platform (in my example)‘ .
Let’s say that the player earn’s 100 coins each hour in a day without having any building that generates money so he can buy units / buildings when the players Oil Platforms are destroyed.
So the player can continue the game, but is less valueble for the player to attack.
And an additional 10 coins for each Oil Platform the player has.

 To make a timer that calculates like everything, there are multiple options and the best one is with a cronjob but this can only be achieved if your host support it. Also we could do it by httprequest and calculate the time diffrence but also for this option we can only do it if our host supports it.
To help everyone (i hope) with this problem about what to use, we will calculate time diffrences but not with httprequest! we will use javascript for this cause everyone can run javascript on their host.

To create something that is robust enough for this so everyone gets its money by the money buildings he owns and the default salary every hour we have to code many new things.
Grab yourself a drink and something to snack before you start with this quest.
If at the end of this tutorial you (still) have errors on your screen or things arn’t working like my example, dont be affraid to leave your problem in this post!

Ok lets do this!

Lets start by creating a new database, open your ” phpMyAdmin” and fill in the same settings as in the image:

tut5-4

We should create a fake cronjob controller we can call and with a little change could attach to a real cronjob.
Create a new file in the controller directory and call it cronjob.php.
I have commented this part so it will take lesser space in the tutorial and hopefully easier to understand.

cronjob.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Cronjob extends CI_Controller {

  function __construct() {
    parent::__construct();
  }

  function index() {
    // Only run this script when a user is logged in, minimize the request data for every guest on the site.
    if($this->session->userdata('game_username')) {
      //Only load the model when we need it and that is only in this script.
      $this->load->model("game_cronjoblog");
      // Get the last cron run record for the type 'money'
      $result = $this->game_cronjoblog->getLastCron("money");
      if( isset($result) ){
        // the time now in unix standard minus the last executed cron time is the time left for a new cron call.
        $timepast = ( strtotime(date('Y-m-d H:i:s')) - $result->executed_time );
        // if 1 hour or more has passed since last call.
        if( $timepast >= 3600 ){
          // calculate how many hours have past since the last call.
          $payoutTimes = floor($timepast/3600);
          // for every hour times the money earned is the payout a player gets without any buildings, 100 is the standard money the player gets each hour.
          $cleanPayout = $payoutTimes * 100;
          // grab all the buildings from the database that have been flagged as money generators
          $playersActive = $this->game_base->getMoneyBuildings();
          $payout = array();
          // go throught the player list of players with atleast one money building.
          foreach($playersActive as $key => $value) {
            // calculate the money a player gets and store it in an array.
            if( !isset($payout[$value->user]) ){
              $payout[$value->user] = 0+$value->earn;
            }else{
              $payout[$value->user] = ($payout[$value->user]+$value->earn);
            }
          }
          // loop through the stored array with players and their money
          foreach($payout as $user_id => $money) {
            // give every player his earned cash!
            $this->game_users->addMoney($user_id,$money);
          }

          // give every player the standard money
          $this->game_users->addMoney(null,$cleanPayout);
          // and as last we need to update the cron log as we just ran a new cronjob.
          $this->game_cronjoblog->setLastCron("money");
          echo 'You got paid!';
        }else{
          echo date("i:s",3600-$timepast);
        }
      }else{
        // if no cronjob log is found, create one as startpoint for the cronjob.
        $this->game_cronjoblog->setLastCron("money");
        echo 'Out of sync!';
      }
    } else {
      echo '';
    }
  }

}
?>

That is it for the controller, now we need to create the model to get and set the database data.
Make a new model and call it game_cronjoblog.php

game_cronjoblog.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Game_cronjoblog extends CI_Model {

  function __construct() {
    parent::__construct();
  }

  //Get the last cronjob log with the action named ...
  function getLastCron($action = null) {
    if ( $action === null ) {
      return null;
    } else {
      $query = $this->db->order_by('executed_time', 'DESC')->limit(1)->get_where('game_cronjoblog', array('action' => $action));
      if ( $query->num_rows() > 0 ) {
        return $query->row();
      }
      return null;
    }
  }

  //Set a new cronjob log with the action named ...
  function setLastCron($action = null) {
    if ( $action === null ) {
      return null;
    } else {
      $data = array(
        'executed_at' => strtotime(date('Y-m-d H:i:s')),
        'executed_time' => strtotime(date('Y-m-d H:00:00')),
        'action' => $action
      );

      $this->db->insert('game_cronjoblog', $data);
      return true;
    }
  }

}
?>

We are almost there, lets call the controller with javascript now and hopefull we will see the database get updated.

Open the template in views named “template_footer.tpl” and add the next code just before the </body> tag

template_footer.tpl

{if $this->session->userdata('game_username')}
  {literal}
    <script>
      var xhr = new XMLHttpRequest();
      xhr.open("GET","{/literal}{$smarty.const.BASE_URL}{literal}cronjob",true);
      xhr.addEventListener('load',function(){
        if(xhr.status === 200){
          jQuery("#menu p").append("<div id='timer'>Salary timer: "+xhr.response+"</div>");
          var timer = xhr.response.split(':');
          var minutes = parseInt(timer[0], 10);
          var seconds = parseInt(timer[1], 10);
          var interval = setInterval(function() {
            seconds = seconds-1;
            if(seconds <= 0 && minutes > 0){
              minutes = minutes-1;
              seconds = 59;
            }
            jQuery('#timer').html('Salary timer: '+ minutes + ':' + seconds);
            if (parseInt(minutes, 10) == 0 && parseInt(seconds, 10) == 0)
              clearInterval(interval);
          }, 1000);
        }
      },false);
      xhr.send();
    </script>
  {/literal}
{/if}

At this point we have a script that calls our cronjob code, and the cronjob code checks the database for values needed to calculate if the time has passed to update the players money.
We only need a call to the datebase and get all the buildings that gives us money. 
Lets add the function, open the model named “game_base.php” and add the next function.

game_base.php

function getMoneyBuildings() {
  $sql = "SELECT game_base.user, game_buildings.name, (game_base.building_amount * game_buildings.value) as earn FROM `game_base` left join game_buildings on game_base.building_id = game_buildings.id inner join game_buildingtypes on game_buildings.type = game_buildingtypes.id where game_buildingtypes.name = 'Money'";
  return $this->db->query($sql)->result();
}

And finally open the model named “game_users.php” and add the function:

game_users.php

function addMoney($userID, $total){
  $result = $this->db->set('money', 'money+'.$total, FALSE)->where('id', $userID)->update('game_users');
  if ( $result ) {
    return true;
  } else {
    return false;
  }
}

And in the same script change the “getMoney($userID)”  function to:

game_users.php

function getMoney($userID) {
  if( $userID == null ) {
    return null;
  }
  $query = $this->db->get_where('game_users', array('id' => $userID));
  if ($query->num_rows() > 0){
    $row = $query->row();
    return $row->money;
  }
  return null;
}

Damn we just added many codes to our game. Dont forget to save all of your hard work and test if its working!


Voila! we did it again, part 5 of the tutorial added something new and cool to the game but we do not have a game yet! Next part we will focus on some new parts of the game.
Thank you for reading this part, i hope you liked it.
In the next part we finally be able to attack eachother! so stay tuned and prepare your army for the next update 😉

For those design people out there reading this and think the demo looks ugly, just send me some icons/design’s etc. to make this tutorial better to look at for everyone 😉 just like some guy’s have done already to create a nice playable community game! Also leave your comments about what u think of the game and what you would like to see changed in the future.

License Agreement by downloading.
——————–
You may not sell this nor making a tutorial with the same code as i do.
You may alter the code and sell a complete php game without having to pay or credit me (only if you want to ;))
This is an open source project please share your modifications with the rest of the readers.
You must have fun scripting!
By downloading the files you agree with these terms.

Live DemoCheck it!

DownloadIts free!

 

Can’t open file? Download the extractor
——————–

post

PHP Build a Webgame Tutorial Part 2

So here the second part finally is!

Hello guys,

Let me introduce you what we will be doing the second part of this tutorial:

  • Create a working login page.
  • Create a working register page.
  • Create a working password lost page.
  • Create a working profile page.

License Agreement by downloading.
——————–
You may not sell this nor making a tutorial with the same code as i do.
You may alter the code and sell a complete php game without having to pay or credit me (only if you want to ;))
This is an open source project please share your modifications with the rest of the readers.
You must have fun scripting!
By downloading the files you agree with these terms.

Live DemoCheck it!

DownloadIts free!

 

Can’t open file? Download the extractor
——————–

Files – What do we need to get started ?

If you haven’t done part 1 of this tutorial yet, i recommend to read it first and download the files that are needed from there.

Like i wrote in last tutorial, you should play with your own design cause im not making a design for your game, this is just to explain how to create a full php webgame.
If you prefer to follow my example you could download my styled website.

At this moment there arn’t many members that downloaded it yet so i dont know if this topic is populair or not but i hope that new viewers will register to follow this tutorial and give some feedback or questions 🙂

While doing the whole tutorial we will be start programming in PHP in OOP (Object Orientated Programming) / MVC (Model View Controller)!

Lets get started with part 2!
First we need to think of what we need and want, i prefer to start with the user part where he/she can register and login to view their account.
If i got this, i can easy check without manual inserting rows in the Database, and let my friends test it to see if it all works.
*People other then yourself will find bugs much faster as they don’t know the system like you do.*
After i got the user part i can focus on the rest, how i see it now i will break it apart in parts of:

  1. User Login / Registration / Profile
  2. Unit setup / Market
  3. Building setup / Market
  4. Currency (with Cronjobs or by Date calculation)
  5. Attack / Defend others
  6. Leftovers like HighScore / Page content / Protection / etc.
  7. Backend to let the admin control everything.
  8. Finishing touch.

Lets start creating the controllers for Register Account, Login, Profile and Lost account.
Now lets go to your directory:
C:\xampp\htdocs\{your_folder_name}\application\controllers\” and open the file named “index.php

Here we will put all the handling and variables for the Login and Profile.
The Controllers will send everything to the Views so we keep the HTML code and PHP code clean, as you will see in this tutorial.
The Controllers will call the Models for database connection so we try to keep everything related to the database as well away from the PHP code.
This will give you a nice overview where everything is and easy to expand your code later with new things, or modify it without searching where you wrote the code.

If you downloaded the files of this tutorial, your “index.php” will look like this, it may differ a bit but don’t worry.

index.php

<?php
if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Index extends CI_Controller {

  function __construct() {
    parent::__construct();
  }

  function index() {
    $this->smarty_lib->assign('content', "Welcome to WommBattle!<br/><br/>You need an account to enter the combat<br/>So why dont you create one now?");
    $this->smarty_lib->view("template");
  }

}
?>

The index() function is always the one that will be called if you call the controller (unless defined else in the __construct).
So we check if a form post is send to the page and then parse the data to the index (if we set the form action to this controller).
Type this inside your “function index()” just above the 2 rows that are already there:

$error = "";
if( $this->input->post() ) {
  $this->form_validation->set_rules('username', 'username', 'trim|required|min_length[5]|max_length[25]');
  $this->form_validation->set_rules('password', 'password', 'trim|required');
  if ( $this->form_validation->run() == FALSE ) {
    $error = "<div class='errorMsg'>   ".validation_errors()."</div>";
  } else {
     //We could be logged in, if username and password matches!
  }
}

$this->smarty_lib->assign('loginMessage', $error);


At this point we can allmost log into our website, but before that we need to create an account first, so lets start with the register function so we can actual register and test the login form with a created account.

Create a new controller in “C:\xampp\htdocs\{your_folder_name}\application\controllers\” and name it “register.php

We start with the basic controller code so CodeIgniter can read it, and we can open this page.

register.php

<?php
if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Register extends CI_Controller {

  function __construct() {
    parent::__construct();
  }

  function index() {
   $this->smarty_lib->assign('content', 'The register form will go here.');
   $this->smarty_lib->view("template");
  }

}

?>

Save your script and lets try to reach it, open up your browser and go to: “http://localhost/{your_folder_name}/register/“.
You will notice that the content is changed to: “The register form will go here.

Register created

This is a good start! We will now create the real form.
Lets expand the code in “register.php“:

register.php

<?php
if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Register extends CI_Controller {

  function __construct() {
    parent::__construct();
  }

  function index() {
    $error = '';
    if( $this->input->post() ) {
      $this->form_validation->set_rules('username', 'username', 'trim|required|min_length[5]|max_length[25]|is_unique[game_users.username]');
      $this->form_validation->set_rules('password', 'password', 'trim|required');
      $this->form_validation->set_rules('email', 'email', 'trim|required|valid_email|is_unique[game_users.email]');

      if ( $this->form_validation->run() == FALSE ) {
        $error = " ".validation_errors()." ";
      } else {
        $error = "<div class='successMsg'>Account created with success!</div>";
      }
    }

    $content = $error.'Register your account and start the battle!<br />
    <br />

    <form method="post">
      <table>
        <tbody>
         <tr>
           <td>Username:</td>
           <td><input name="username" type="text" /></td>
         </tr><tr>
           <td>Email:</td>
           <td><input name="email" type="text" /></td>
         </tr><tr>
           <td>Password:</td>
           <td><input name="password" type="password" /></td>
         </tr><tr>
           <td>&nbsp;</td>
           <td><input type="submit" value="Register!" /></td>
         </tr>
       </tbody>
     </table>
   </form>'
;

    $this->smarty_lib->assign('content', $content);
    $this->smarty_lib->view("template");
  }

}

?>

Save your work and try it out.
You will see that it will give messages to you when the form fails and says it is created with success when it passes the validation.

Register form created

The validation will check on different things now:

  1. Username is required and need minimal 5 characters and maximal 25 characters also the username must be unique in our database user table.
  2. Password is only required with no further restrictions
  3. Email is required it will check if it is a valid email address and if the email address is unique in our database user table.

Now before we actually add the data to the database we will be making a model first to process it.

Create a new model in “C:\xampp\htdocs\{your_folder_name}\application\models\” and name it “game_users.php” just like how we called our table in the database.

And add this code to it:
game_users.php

<?php
if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Game_users extends CI_Model {

  function __construct() {
    parent::__construct();
  }
}
?>

This is the start of all models you will be creating, just like the controllers.
Now lets add the piece of code that will add the new registered user to the database with the given values!

game_users.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Game_users extends CI_Model {

  function __construct() {
    parent::__construct();
  }

  function registerUser($_POST) {
    $date = date('Y-m-d H:i:s');
    $ip = "xx.xx.xx.xx";

    //Check valid user IP on diffrent ways
    if ( !empty($_SERVER['HTTP_CLIENT_IP']) ) {
      $ip = $_SERVER['HTTP_CLIENT_IP'];
    } elseif ( !empty($_SERVER['HTTP_X_FORWARDED_FOR']) ) {
      $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    }else{
      $ip = $_SERVER['REMOTE_ADDR'];
    }
    //End IP check

    $data = array(
      'username' => $this->input->post('username'),
      'password' => md5($this->input->post('password')),
      'email' => $this->input->post('email'),
      'started' => '1970-01-01',
      'created' => $date,
      'ip' => $ip
    );

    $query = $this->db->insert("game_users", $data);

    if( $query ) {
      return true;
    }else{
      return false;
    }
  }

}
?>

You can see that i created a new function in the model the function will insert the user given data into the database.
If you do not understand what the function does please read it a few times over or check the CodeIgniter manual on the CodeIgniter website.

Now it is almost working the last thing to do is including the model in the autoload of CodeIgniter!
Go to “C:\xampp\htdocs\{your_folder_name}\application\config\autoload.php” and scroll all the way down to line number 112.

You will see:

$autoload['model'] = array();

Change it to:

$autoload['model'] = array('game_users');

Lets try it out by calling the model in our register form!
Open the controller “C:\xampp\htdocs\{your_folder_name}\application\controllers\register.php” and add the following line:


register.php

<?php
if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Register extends CI_Controller {

  function __construct() {
    parent::__construct();
  }

  function index() {
    $error = '';
    if( $this->input->post() ) {
      $this->form_validation->set_rules('username', 'username', 'trim|required|min_length[5]|max_length[25]|is_unique[game_users.username]');
      $this->form_validation->set_rules('password', 'password', 'trim|required');
      $this->form_validation->set_rules('email', 'email', 'trim|required|valid_email|is_unique[game_users.email]');

      if ($this->form_validation->run() == FALSE){
        $error = " ".validation_errors()." ";
      }else{
        $error = "<div class='successMsg'>Account created with success!</div>";
        $this->game_users->registerUser($this->input->post());
      }
    }
    $content = $error.'Register your account and start the battle!<br/>
    <br/>
    <form method="post">
      <table>
        <tbody>
          <tr>
            <td>Username:</td>
            <td><input name="username" type="text" /></td>
          </tr><tr>
            <td>Email:</td>
            <td><input name="email" type="text" /></td>
          </tr><tr>
            <td>Password:</td>
            <td><input name="password" type="password" /></td>
          </tr><tr>
            <td>&nbsp;</td>
            <td><input type="submit" value="Register!" /></td>
          </tr>
        </tbody>
      </table>
    </form>'
;
    $this->smarty_lib->assign('content', $content);
    $this->smarty_lib->view("template");
  }

}

?>

That should do the trick! Now try to create your first account.
*Note: you could try to create another one with either the same username or email and you will see it an error message back.*

Using register to fill the database

Ok now we registered our account but we can’t log in!
Let’s finish the login form as well!

We need to expand our “game_users” model to handle the login part.
So open: “C:\xampp\htdocs\{your_folder_name}\application\models\game_users.php” again and add this function.

game_users.php

function loginUser() {
  $data = array(
    'username' => $this->input->post('username'),
    'password' => md5($this->input->post('password'))
  );
  $query = $this->db->get_where("game_users", $data, 1);
  if( $query->num_rows() == 1 ) {
    return true;
  } else {
    return false;
  }
}

This function will tell our controller if the username and password match and return true, or do not match and return false.
Like i just said, it will tell us the match outcome to the controller, so lets open our controller:

C:\xampp\htdocs\{your_folder_name}\application\controllers\index.php

The line:

//We could be logged in!

And replace it with:

if( $this->game_users->loginUser() ) {
  $this->session->set_userdata('game_username', $this->input->post('username'));
}

Now we only need to change our view when we are logged in, i’ve decided to do this in the template_header view.
Later on we will create a library for this, but because we did already pretty much we will try to avoid more files we do not really need yet.

So lets open and change some lines: “C:\xampp\htdocs\{your_folder_name}\application\views\template_header.tpl

{* Menu if logged in *}
{if $this->session->userdata('game_username')}
  Welcome, {$this->session->userdata('game_username')}<br/>
  Lets create some chaos!<br/><br/>
  <a href="{$smarty.const.BASE_URL}logout/">Logout</a>
{else}
  {* Menu if logged out *}
  Are you allready part of the war?<br/>
  Login now!<br/><br/>
  <form action="{$smarty.const.BASE_URL}" method="post">
    username:<br/><input name="username" type="text" /><br/>
    password:<br/><input name="password" type="password" /><br/>
    <input type="reset" value="reset" /> <input name="loginBtn" type="submit" value="login" />
  </form>
  <br/>
  <a href="{$smarty.const.BASE_URL}lost/">lost password</a> | <a href="{$smarty.const.BASE_URL}register/">register</a>
{/if}

As you can see we added a new link called “logout”, because i like to safely close my profile so no one else can play with my game data.

Now save your file and try to login.

Succesfully logged in!

To log out we need a need controller to handle the logout process.
Go to and create: “C:\xampp\htdocs\{your_folder_name}\application\controllers\logout.php


logout.php

<?php
if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Logoutextends CI_Controller {

  function __construct() {
    parent::__construct();
  }

  function index() {
    $this->session->sess_destroy();
    $this->load->helper('url');

    redirect(base_url());
  }

}

?>

And we can now even logout!

At this point i will stop with part 2, now it is time for you guy’s to play with your website (mockup) create something nice for the game you’ve got in your mind and try to add more register fields and validation checks!
The next tutorial we will be creating many things for the website like the menu, the contents, and more! so be sure to check back often for updates!

Leave a message or some screenshots please, i would like to see how you guys are doing it or if you are stuck at a point i could help you with.

Good luck and have fun with programming!

 

License Agreement by downloading.
——————–
You may not sell this nor making a tutorial with the same code as i do.
You may alter the code and sell a complete php game without having to pay or credit me (only if you want to ;))
This is an open source project please share your modifications with the rest of the readers.
You must have fun scripting!
By downloading the files you agree with these terms.

Live DemoCheck it!

DownloadIts free!

 

Can’t open file? Download the extractor
——————–

Website finally online

Today we are proud to announce that our new website is finally online!
It took some time to create but we are finally there.
The website is writen in dutch language, we won’t go international with it, but i you have a project you would like us to do, then we can think about it and perhaps do it anyway.

Soon we will continue with My Galaxy Pet again, but for now our website is more important.

http://www.ungahstudios.com

My Galaxy Pet Status

Hey peepz,

Today im happy to announce that we are almost ready for the first alpha stage for My Galaxy Pet.

We only got a few more things to do before we really gonna start an alpha test.

One of those things is finishing the flash template which will load the custom made player into the game.
And the other is that we want a nice looking frontpage for as long as we are developing the website, where you all can view the updates we have made before the website goes online.

The Alpha test will be in a closed group so please don’t ask for an invite.

The website will be found here: http://www.mygalaxypet.com

post

RealmCrafter Standard Tutorial – Mount up your horses

Hi guy’s someone asked me for a mount script in RealmCrafter engine.
So… Here it is.
Keep in mind TYPING OVER IS BETTER THEN COPY PASTE IT!
Any problem’s or upgrades you can post here 🙂

First start a new script you will see something similar to this:

Using "RC_Core.rcm"
; TestEnvironment
; Date/Time: 1:57:37 on 20-6-2010
; By Nigel on PC_VAN_NIGEL

Function Main()

End Function

First we need to think of what we want.
This is what im think off.

  • Get the player
  • Get the players coordinates
  • Get the zone of the Player
  • Get the mount model from the library
  • Spawn the mount near the player
  • Make the mount your, pet so only u can use it
  • Hop on the mount when u click it
  • Hop off when u click away from it
  • Mount runs away and dissappear when it is unmounted

First we need the first 2 lines of the list:

Using "RC_Core.rcm"
; TestEnvironment
; Date/Time: 1:57:37 on 20-6-2010
; By Nigel on PC_VAN_NIGEL

Function Main()
Player = Actor()

pX# = ActorX(Player)
pY# = ActorY(Player)
pZ# = ActorZ(Player)
End Function

With this we have the Player stored in the variable Player and the location of the player.
Now we want to get the zone the player is in and the mount id and spawn it near the player.

Using "RC_Core.rcm"
; TestEnvironment
; Date/Time: 1:57:37 on 20-6-2010
; By Nigel on PC_VAN_NIGEL

Function Main()
Player = Actor()
Zone$ = ActorZone(Player)
Mount = ActorID("Horse","Mount")

rd = Rand(25,50)
pX# = ActorX(Player)
pY# = ActorY(Player)
pZ# = ActorZ(Player)
spawnMount = Spawn(Mount,Zone,pX+rd,pY+10,pZ+rd)
End Function

Ok now we have created something that will be visible! Hoorray!
Save the script call it SummonMount or something u like.
And go to your editor.
Open your ability’s and assign this script to one of your ability’s
After your did that you could give it to a shop dealer or your ingame commands to quick try it.

(Ingame Command’s way)

Function GiveMount()
Player = Actor()
If PlayerIsGM(Player) = 1
AddAbility(Player, "YourAbilityNameWithTheQuotes")
output( Player, "Gained the Mount ability.", 255, 0, 0 )
EndIf
End Function

Save all your work and start your game.
When you are ingame just type /GiveMount and you will notice in the chat it say’s “Gained the Mount Ability”.
This is a good sign!
Open your Ability’s Window and learn it.
Put it in your QuickSlots and press it to use.
If all go good you will now see your horse or any other mount you wrote down!
If not check your server log’s if there is any error.

Lets go to the next lines:

Using "RC_Core.rcm"
; TestEnvironment
; Date/Time: 1:57:37 on 20-6-2010
; By Nigel on PC_VAN_NIGEL

Function Main()
Player = Actor()
Zone$ = ActorZone(Player)
Mount = ActorID("Horse","Mount")

rd = Rand(1,3)
pX# = ActorX(Player)
pY# = ActorY(Player)
pZ# = ActorZ(Player)
spawnMount = Spawn(Mount,Zone,pX+rd,pY+10,pZ+rd)
SetLeader(spawnMount ,Player)
SetActorAIState(spawnMount ,7)

End Function

With this you it is now bound to you as player so only you can ride it
Now lets do the last point to let the mount walk away when you dismount

Open your Mount.rsl
You will see something similar to this in it:

Using "RC_Core.rcm"
; Default mounting change script for player characters
; You may alter this script however you like, but DO NOT RENAME OR DELETE IT

; This function is called when a player mounts an actor
; The actor is the player, the context actor is the mount
Function Mount()
; Done
Return
End Function

; This function is called when a player dismounts from an actor
; The actor is the player, the context actor is the ex-mount
Function Dismount()
Return
End Function

Lets alter the script so it will walk away and dissappear.

Using "RC_Core.rcm"
; Default mounting change script for player characters
; You may alter this script however you like, but DO NOT RENAME OR DELETE IT

; This function is called when a player mounts an actor
; The actor is the player, the context actor is the mount
Function Mount()
; Done
Return
End Function

; This function is called when a player dismounts from an actor
; The actor is the player, the context actor is the ex-mount
Function Dismount()
DoEvents(50)
C = ContextActor()
Player = Actor()
pX = ActorX(Player)
pZ = ActorZ(Player)
rd = Rand(25,50)
SetActorDestination(C, pX+rd, pZ+rd)
DoEvents(5000)
KillActor(C)
End Function

Now with this all inserted try it out! save your work and have fun 🙂
You could offcourse upgrade it with more options like only spawn 1 time.
Or on spawn it runs to you etc, etc.

Course C#/ASPX

Hey peepzzz,

Vandaag heb ik de uitslag binnen van mijn cursus examen voor C#/ASPX
Ben met een 8 geëindigd 😀

Ook wil ik even melden dat de server van Sanity Online weer offline is!
De meerderheid wou graag nog een verlenging van een maand 🙂
Dus ik ben nog meer leuke dingen aan het toevoegen zodat het nog leuker word om te spelen.

met o.a. :

Nieuwe Skins
Mounts (snel vervoer)
Craftskills (Mining, Smithing , Harvesting , Cooking , Petting)
Nieuwe Items
Verbeterde icoontjes
En nog veeel en veeeeel meer 😉

Houd mijn website in de gaten volgende maand voor de nieuwe release 🙂

Ook is de website verbeterd op een aantal punten (Je kunt nu de tutorials ook downloaden in pdf formaat 😉 kijk onderaan elke post, vul je email in en het word verstuurd naar je mail toe.

Greeeetzzzzzz,

Sanity Online goes Public!

Hey peepz,

Vandaag gaat Sanity Online voor iedereen open!
Kijk snel op http://sanity.ungahstudios.com en download de client.

Je kunt in het spel een account maken!

Ik hou jullie op de hoogte voor de plek waar we op komen te staan we hopen natuurlijk 1ste 🙂

Ook heb ik vandaag mijn Cursus afgerond in c# aspx me eind opdracht gaat ook beoordeeld worden.
Volgende maand word dus een spannende maand 😀

Hierna zal ik weer tijd hebben om nieuwe tutorials te schrijven dus mogen er nog vragen zijn naar tutorials stel ze gerust en ik laat weten of ik je ermee kan helpen!

Greetzzz,

Sanity Online (MMORPG) First Announcement!

Hey lezertjes!

Hierbij de eerste screenshots van Sanity Online!!!!!
Veel plezier ermee 😉

Header

Cute Side : Hatter
Cute Hatter

Evil Side : Hatter

Evil Hatter

Cute Side : Teeth

Cute Teeth

Evil Side : Teeth

Evil Teeth

Greetzzzzz,